From: David McCullough Date: Mon, 1 Aug 2005 00:02:33 +0000 (+0000) Subject: Change all file format related unsigned longs to uint32_t, so that 64 bits X-Git-Url: http://git.osdn.net/view?p=uclinux-h8%2Felf2flt.git;a=commitdiff_plain;h=62d6b3b0984563ae9d49968699723cb88374484e Change all file format related unsigned longs to uint32_t, so that 64 bits hosts can build this code correctly, plus a little bit of Blackfin code. Most of the changes provided Bernd Schmidt --- diff --git a/elf2flt.c b/elf2flt.c index 7844a7c..7082f2b 100644 --- a/elf2flt.c +++ b/elf2flt.c @@ -87,11 +87,13 @@ #define ARCH "microblaze" #elif defined(TARGET_e1) #define ARCH "e1-coff" +#elif defined(TARGET_bfin) +#define ARCH "bfin" #else #error "Don't know how to support your CPU architecture??" #endif -#if defined(TARGET_m68k) || defined(TARGET_h8300) +#if defined(TARGET_m68k) || defined(TARGET_h8300) || defined(TARGET_bfin) /* * Define a maximum number of bytes allowed in the offset table. * We'll fail if the table is larger than this. @@ -246,7 +248,7 @@ get_symbol_offset(char *name, asection *sec, asymbol **symbol_table, long number for (i=0; isection == sec) { if (!strcmp(symbol_table[i]->name, name)) { - return symbol_table[i]->value; + return symbol_table[i]->value; } } } @@ -274,7 +276,7 @@ add_com_to_bss(asymbol **symbol_table, long number_of_symbols, long bss_len) -unsigned long * +uint32_t * output_relocs ( bfd *abs_bfd, asymbol **symbols, @@ -284,7 +286,7 @@ output_relocs ( unsigned char *data, int data_len, unsigned long data_vma, bfd *rel_bfd) { - unsigned long *flat_relocs; + uint32_t *flat_relocs; asection *a, *sym_section, *r; arelent **relpp, **p, *q; const char *sym_name, *section_name; @@ -780,7 +782,7 @@ dump_symbols(symbols, number_of_symbols); /* create a new reloc entry */ flat_relocs = realloc(flat_relocs, - (flat_reloc_count + 1) * sizeof(unsigned long)); + (flat_reloc_count + 1) * sizeof(uint32_t)); flat_relocs[flat_reloc_count] = pflags | (section_vma + q->address); flat_reloc_count++; relocation_needed = 0; @@ -1198,7 +1200,7 @@ DIS29_RELOCATION: */ if (relocation_needed) { flat_relocs = realloc(flat_relocs, - (flat_reloc_count + 1) * sizeof(unsigned long)); + (flat_reloc_count + 1) * sizeof(uint32_t)); #ifndef TARGET_e1 flat_relocs[flat_reloc_count] = pflags | (section_vma + q->address); @@ -1259,90 +1261,6 @@ printf("%s(%d): symbol name=%s address=0x%x section=%s -> RELOC=0x%x\n", -#if 0 -/* shared lib symbols stuff */ - -long -get_symbol(char *name, asection *sec, asymbol **symbol_table, long number_of_symbols) -{ - long i; - for (i=0; isection == sec) { - if (!strcmp(symbol_table[i]->name, name)) { - return symbol_table[i]->value; - } - } - } - return -1; -} - -int -output_offset_table(int fd, char *ename, bfd *abfd, asymbol **symbol_table, long number_of_symbols) -{ - long i; - FILE *ef; - char buf[80]; - char libname[80]; - long etext_addr; - long sym_addr; - - int foobar = 0; - int count = 0; - signed short *tab = malloc(32768); /* we don't know how many yet*/ - - asection *text_section = bfd_get_section_by_name (abfd, ".text"); - - if (!(ef = fopen(ename, "rb"))) { - fprintf (stderr,"Can't open %s\n",ename); - exit(1); - } - - fgets(libname, 80, ef); - - if (number_of_symbols < 0) { - fprintf (stderr,"Corrupt symbol table!\n"); - exit(1); - } - - if ((etext_addr = get_symbol("etext", - text_section, - symbol_table, - number_of_symbols)) == -1) { - fprintf (stderr,"Can't find the symbol etext\n"); - exit(1); - } - - fgets(buf, 80, ef); - while (!feof(ef)) { - buf[strlen(buf)-1] = 0; /* Arrrgh! linefeeds */ - - if ((sym_addr = get_symbol(buf, - text_section, - symbol_table, - number_of_symbols)) == -1) { - fprintf (stderr,"Can't find the symbol %s\n",buf); - foobar++; - } else { - tab[++count] = htons(sym_addr - etext_addr); - } - fgets(buf, 80, ef); - } - - fclose(ef); - - if (foobar) { - fprintf (stderr,"*** %d symbols not found\n",foobar); - exit(10); - } - - strcpy((char *)&tab[++count],libname); - tab[0] = htons(count * 2); - write(fd, tab, count * 2 + strlen(libname) + 2); - return 0; -} -#endif - - static char * program; static void usage(void) @@ -1734,3 +1652,14 @@ int main(int argc, char *argv[]) exit(0); } + + +/* + * this __MUST__ be at the VERY end of the file - do NOT move!! + * + * Local Variables: + * c-basic-offset: 4 + * tab-width: 8 + * end: + * vi: tabstop=8 shiftwidth=4 textwidth=79 noexpandtab + */ diff --git a/flat.h b/flat.h index 81eaac2..3cc502d 100644 --- a/flat.h +++ b/flat.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2002-2003 David McCullough + * Copyright (C) 2002-2005 David McCullough * Copyright (C) 1998 Kenneth Albanowski * The Silver Hammer Group, Ltd. * @@ -14,6 +14,7 @@ #define _LINUX_FLAT_H #ifdef __KERNEL__ +#include #include #endif @@ -31,26 +32,26 @@ */ struct flat_hdr { - char magic[4]; - unsigned long rev; /* version (as above) */ - unsigned long entry; /* Offset of first executable instruction - with text segment from beginning of file */ - unsigned long data_start; /* Offset of data segment from beginning of - file */ - unsigned long data_end; /* Offset of end of data segment - from beginning of file */ - unsigned long bss_end; /* Offset of end of bss segment from beginning - of file */ - - /* (It is assumed that data_end through bss_end forms the bss segment.) */ - - unsigned long stack_size; /* Size of stack, in bytes */ - unsigned long reloc_start; /* Offset of relocation records from - beginning of file */ - unsigned long reloc_count; /* Number of relocation records */ - unsigned long flags; - unsigned long build_date; /* When the program/library was built */ - unsigned long filler[5]; /* Reservered, set to zero */ + char magic[4]; + uint32_t rev; /* version (as above) */ + uint32_t entry; /* Offset of first executable instruction + with text segment from beginning of file */ + uint32_t data_start; /* Offset of data segment from beginning of + file */ + uint32_t data_end; /* Offset of end of data segment from beginning + of file */ + uint32_t bss_end; /* Offset of end of bss segment from beginning + of file */ + + /* (It is assumed that data_end through bss_end forms the bss segment.) */ + + uint32_t stack_size; /* Size of stack, in bytes */ + uint32_t reloc_start; /* Offset of relocation records from beginning + of file */ + uint32_t reloc_count; /* Number of relocation records */ + uint32_t flags; + uint32_t build_date; /* When the program/library was built */ + uint32_t filler[5]; /* Reservered, set to zero */ }; #define FLAT_FLAG_RAM 0x0001 /* load program entirely into RAM */ @@ -59,7 +60,6 @@ struct flat_hdr { #define FLAT_FLAG_GZDATA 0x0008 /* only data/relocs are compressed (for XIP) */ #define FLAT_FLAG_KTRACE 0x0010 /* output useful kernel trace for debugging */ - #ifdef __KERNEL__ /* so systems without linux headers can compile the apps */ /* * While it would be nice to keep this header clean, users of older @@ -72,32 +72,40 @@ struct flat_hdr { #include -#define OLD_FLAT_VERSION 0x00000002L +#define OLD_FLAT_VERSION 0x00000002L #define OLD_FLAT_RELOC_TYPE_TEXT 0 #define OLD_FLAT_RELOC_TYPE_DATA 1 #define OLD_FLAT_RELOC_TYPE_BSS 2 typedef union { - unsigned long value; - struct { + uint32_t value; + struct { # if defined(mc68000) && !defined(CONFIG_COLDFIRE) - signed long offset : 30; - unsigned long type : 2; + int32_t offset : 30; + uint32_t type : 2; # define OLD_FLAT_FLAG_RAM 0x1 /* load program entirely into RAM */ # elif defined(__BIG_ENDIAN_BITFIELD) - unsigned long type : 2; - signed long offset : 30; + uint32_t type : 2; + int32_t offset : 30; # define OLD_FLAT_FLAG_RAM 0x1 /* load program entirely into RAM */ # elif defined(__LITTLE_ENDIAN_BITFIELD) - signed long offset : 30; - unsigned long type : 2; + int32_t offset : 30; + uint32_t type : 2; # define OLD_FLAT_FLAG_RAM 0x1 /* load program entirely into RAM */ # else # error "Unknown bitfield order for flat files." # endif - } reloc; + } reloc; } flat_v2_reloc_t; #endif /* __KERNEL__ */ #endif /* _LINUX_FLAT_H */ + +/* this __MUST__ be at the VERY end of the file - do NOT move!! + * Local Variables: + * c-basic-offset: 4 + * tab-width: 8 + * end: + * vi: tabstop=8 shiftwidth=4 textwidth=79 noexpandtab + */