Loading toolchain/elf2flt/elf2flt/CVS/Entries +7 −7 Original line number Diff line number Diff line Loading @@ -5,13 +5,13 @@ /flat.h/1.6/Tue Jan 10 04:34:08 2006/-ko/ /install-sh/1.1.1.1/Tue Jan 10 04:34:08 2006/-ko/ /stubs.c/1.1/Tue Jan 10 04:34:08 2006// /flthdr.c/1.8/Tue Jan 10 05:11:20 2006/-ko/ /elf2flt.ld/1.12/Tue Jan 10 05:12:32 2006/-ko/ /config.sub/1.8/Wed Jan 11 13:36:39 2006/-ko/ /cygwin-elf.h/1.4/Wed Jan 11 13:36:39 2006// /elf2flt.c/1.38/Fri Jan 13 08:02:22 2006/-ko/ /Makefile.in/1.15/Result of merge/-ko/ /configure.in/1.8/Mon Feb 6 05:04:36 2006/-ko/ /ld-elf2flt.in/1.11/Mon Feb 6 05:04:36 2006// /configure/1.9/Mon Feb 6 05:05:05 2006/-ko/ /Makefile.in/1.17/Result of merge/-ko/ /configure/1.12/Sun Jan 28 05:27:28 2007/-ko/ /configure.in/1.10/Sun Jan 28 05:27:28 2007/-ko/ /elf2flt.c/1.46/Result of merge/-ko/ /elf2flt.ld/1.15/Sun Jan 28 05:27:28 2007/-ko/ /flthdr.c/1.10/Sun Jan 28 05:27:28 2007/-ko/ /ld-elf2flt.in/1.15/Sun Jan 28 05:27:28 2007// D toolchain/elf2flt/elf2flt/Makefile.in +4 −4 Original line number Diff line number Diff line Loading @@ -66,10 +66,10 @@ install: $(INSTALL) -d $(bindir) $(INSTALL) -d $(target_bindir) $(INSTALL) -d $(target_libdir) $(INSTALL) -s -m 755 $(PROG_FLTHDR) $(bindir)/$(TARGET)-$(PROG_FLTHDR) $(INSTALL) -s -m 755 $(PROG_FLTHDR) $(target_bindir)/$(PROG_FLTHDR) $(INSTALL) -s -m 755 $(PROG_ELF2FLT) $(bindir)/$(TARGET)-$(PROG_ELF2FLT) $(INSTALL) -s -m 755 $(PROG_ELF2FLT) $(target_bindir)/$(PROG_ELF2FLT) $(INSTALL) -m 755 $(PROG_FLTHDR) $(bindir)/$(TARGET)-$(PROG_FLTHDR) $(INSTALL) -m 755 $(PROG_FLTHDR) $(target_bindir)/$(PROG_FLTHDR) $(INSTALL) -m 755 $(PROG_ELF2FLT) $(bindir)/$(TARGET)-$(PROG_ELF2FLT) $(INSTALL) -m 755 $(PROG_ELF2FLT) $(target_bindir)/$(PROG_ELF2FLT) [ -f $(bindir)/$(TARGET)-ld.real$(EXEEXT) ] || \ mv $(bindir)/$(TARGET)-ld$(EXEEXT) $(bindir)/$(TARGET)-ld.real$(EXEEXT) [ -f $(target_bindir)/ld.real$(EXEEXT) ] || \ Loading toolchain/elf2flt/elf2flt/configure +541 −251 File changed.Preview size limit exceeded, changes collapsed. Show changes toolchain/elf2flt/elf2flt/configure.in +27 −20 Original line number Diff line number Diff line Loading @@ -37,6 +37,12 @@ AC_ARG_ENABLE(got-check, [ got_check=yes ] ) AC_ARG_ENABLE(emit_relocs, [ --disable-emit-relocs - don't use the --emit-relocs (-q) linker option ], [ emit_relocs=$enableval ], [ emit_relocs=yes ] ) AC_CANONICAL_HOST AC_CANONICAL_TARGET Loading Loading @@ -75,29 +81,29 @@ fi binutils_ldscript_dir="$ac_binutils_ldscript_dir" if test "$ac_libbfd" = "NONE" -o "$ac_libiberty" = "NONE" ; then echo echo "You need to specify the location of the libfd.a and libiberty.a" echo "host libraries from the binutils package." echo echo "Run configure again specifying these options:" echo echo " ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>" echo exit 1 AC_MSG_ERROR([ You need to specify the location of the libfd.a and libiberty.a host libraries from the binutils package. Run configure again specifying these options: ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a> ]) fi if test "$ac_bfd_include_dir" = "NONE" ; then echo echo "You need to specify the location of the bfd.h header from a" echo "configured/compiled version of the binutils package for your target." echo "Without this your elf2flt may crash as it will try to use the" echo "systems bfd.h which may be from a different binutils package." echo echo "Run configure again specifying these options:" echo echo " ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>" echo exit 1 AC_MSG_ERROR([ You need to specify the location of the bfd.h header from a configured/compiled version of the binutils package for your target. Without this your elf2flt may crash as it will try to use the systems bfd.h which may be from a different binutils package. Run configure again specifying these options: ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a> ]) fi dnl Checks for header files. Loading @@ -122,6 +128,7 @@ AC_SUBST(bfd_include_dir) AC_SUBST(binutils_include_dir) AC_SUBST(binutils_ldscript_dir) AC_SUBST(got_check) AC_SUBST(emit_relocs) AC_OUTPUT(Makefile ld-elf2flt) toolchain/elf2flt/elf2flt/elf2flt.c +79 −174 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ * ELF format file handling. Extended relocation support for all of * text and data. * * (c) 2006 Support the -a (use_resolved) option for TARGET_arm. * Shaun Jackman <sjackman@gmail.com> * (c) 2004, Nios II support, Wentao Xu <wentao@microtronix.com> * (c) 2003, H8 support, ktrace <davidm@snapgear.com> * (c) 2003-2004, MicroBlaze support, John Williams <jwilliams@itee.uq.edu.au> Loading Loading @@ -44,8 +46,10 @@ #include <time.h> #ifndef WIN32 #include <netinet/in.h> /* Consts and structs defined by the internet system */ #define BINARY_FILE_OPTS #else #include <winsock2.h> #define BINARY_FILE_OPTS "b" #endif /* from $(INSTALLDIR)/include */ Loading Loading @@ -306,119 +310,6 @@ add_com_to_bss(asymbol **symbol_table, long number_of_symbols, long bss_len) } #ifdef TARGET_bfin /* stack to handle "arithmetic" relocations */ #define RELOC_STACK_SIZE 100 static bfd_vma reloc_stack[RELOC_STACK_SIZE]; static unsigned int reloc_stack_tos = 0; static char sym_section_name[80]; static asection *stack_sym_section = 0; static void reloc_stack_set_section(asection *section, const char *sym_section_name_in) { /* TODO : we can add checks to make sure we do not add different section names to the same arithmetic expression. */ strcpy(sym_section_name, sym_section_name_in); stack_sym_section = section; } static const char * reloc_stack_get_section_name() { return sym_section_name; } static asection *reloc_stack_get_section() { return stack_sym_section; } #define is_reloc_stack_empty() ((reloc_stack_tos > 0)?0:1) static void reloc_stack_push(bfd_vma value) { reloc_stack[reloc_stack_tos++] = value; } static bfd_vma reloc_stack_pop() { return reloc_stack[--reloc_stack_tos]; } static bfd_vma reloc_stack_operate(unsigned int oper) { bfd_vma value; switch(oper){ case 0xE2 : value = reloc_stack[reloc_stack_tos - 2] + reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE3 : value = reloc_stack[reloc_stack_tos - 2] - reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE4 : value = reloc_stack[reloc_stack_tos - 2] * reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE5 : value = reloc_stack[reloc_stack_tos - 2] / reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE6 : value = reloc_stack[reloc_stack_tos - 2] % reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE7 : value = reloc_stack[reloc_stack_tos - 2] << reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE8 : value = reloc_stack[reloc_stack_tos - 2] >> reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE9 : value = reloc_stack[reloc_stack_tos - 2] & reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xEA : value = reloc_stack[reloc_stack_tos - 2] | reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xEB : value = reloc_stack[reloc_stack_tos - 2] ^ reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xEC : value = reloc_stack[reloc_stack_tos - 2] && reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xED : value = reloc_stack[reloc_stack_tos - 2] || reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xEF : value = -reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos --; break; case 0xF0 : value = ~reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 1; break; default : fprintf(stderr, "bfin relocation : Internal bug\n"); return 0; } // now push the new value back on stack reloc_stack_push(value); return value; } /* FUNCTION : weak_und_symbol ABSTRACT : return true if symbol is weak and undefined. */ Loading Loading @@ -534,7 +425,7 @@ dump_symbols(symbols, number_of_symbols); * Also note that both the relocatable and absolute versions have this * terminator even though the relocatable one doesn't have the GOT! */ if (pic_with_got) { if (pic_with_got && !use_resolved) { unsigned long *lp = (unsigned long *)data; /* Should call ntohl(*lp) here but is isn't going to matter */ while (*lp != 0xffffffff) lp++; Loading Loading @@ -682,16 +573,6 @@ dump_symbols(symbols, number_of_symbols); #endif /* USE_V850_RELOCS */ q = *p; #ifdef TARGET_bfin if ((q->sym_ptr_ptr && *q->sym_ptr_ptr) && (!is_reloc_stack_empty() && strstr((*(q->sym_ptr_ptr))->name, "operator"))){ /* must be an arith reloc ... get the value from the stack */ sym_name = (*(q->sym_ptr_ptr))->name; sym_section = reloc_stack_get_section(); section_name = reloc_stack_get_section_name(); } else #endif if (q->sym_ptr_ptr && *q->sym_ptr_ptr) { sym_name = (*(q->sym_ptr_ptr))->name; sym_section = (*(q->sym_ptr_ptr))->section; Loading @@ -705,7 +586,7 @@ dump_symbols(symbols, number_of_symbols); /* Adjust the address to account for the GOT table which wasn't * present in the relative file link. */ if (pic_with_got) if (pic_with_got && !use_resolved) q->address += got_size; #endif Loading Loading @@ -793,7 +674,7 @@ dump_symbols(symbols, number_of_symbols); + lo; } } else goto bad_v850_reloc_err; goto bad_resolved_reloc; break; case R_V850_LO16: Loading @@ -807,16 +688,37 @@ dump_symbols(symbols, number_of_symbols); && (p[-1]->addend == p[0]->addend)) break; /* not an error */ else goto bad_v850_reloc_err; goto bad_resolved_reloc; case R_V850_HI16: bad_v850_reloc_err: printf("ERROR: reloc type %s unsupported in this context\n", q->howto->name); bad_relocs++; goto bad_resolved_reloc; default: goto good_32bit_resolved_reloc; #elif defined(TARGET_arm) case R_ARM_ABS32: relocation_needed = 1; break; #endif /* TARGET_V850 */ case R_ARM_REL32: case R_ARM_THM_PC11: case R_ARM_THM_PC22: relocation_needed = 0; break; default: goto bad_resolved_reloc; #elif defined(TARGET_m68k) case R_68K_32: goto good_32bit_resolved_reloc; case R_68K_PC32: case R_68K_PC16: /* The linker has already resolved PC relocs for us. In PIC links, the symbol must be in the data segment. */ case R_68K_NONE: continue; default: goto bad_resolved_reloc; #else default: /* The default is to assume that the relocation is relative and has Loading @@ -825,6 +727,9 @@ dump_symbols(symbols, number_of_symbols); give an error by default, and require `safe' relocations to be enumberated explicitly?). */ goto good_32bit_resolve_reloc; #endif good_32bit_resolved_reloc: if (bfd_big_endian (abs_bfd)) sym_addr = (r_mem[0] << 24) Loading @@ -838,12 +743,19 @@ dump_symbols(symbols, number_of_symbols); + (r_mem[2] << 16) + (r_mem[3] << 24); relocation_needed = 1; break; bad_resolved_reloc: printf("ERROR: reloc type %s unsupported in this context\n", q->howto->name); bad_relocs++; break; } } else { /* Calculate the sym address ourselves. */ sym_reloc_size = bfd_get_reloc_size(q->howto); #if !defined(TARGET_h8300) && !defined(TARGET_e1) && !defined(TARGET_bfin) #if !defined(TARGET_h8300) && !defined(TARGET_e1) && !defined(TARGET_bfin) && !defined(TARGET_m68k) if (sym_reloc_size != 4) { printf("ERROR: bad reloc type %d size=%d for symbol=%s\n", (*p)->howto->type, sym_reloc_size, sym_name); Loading @@ -861,6 +773,7 @@ dump_symbols(symbols, number_of_symbols); sym_vma = bfd_section_vma(abs_bfd, sym_section); sym_addr += sym_vma + q->addend; break; case R_68K_PC16: case R_68K_PC32: sym_vma = 0; sym_addr += sym_vma + q->addend; Loading Loading @@ -1278,14 +1191,12 @@ NIOS2_RELOC_ERR: sym_addr -= q->address; // make it PC relative // implicitly assumes code section and symbol section are same break; case R_got: /* Ignore these. */ break; case R_rimm16: if (is_reloc_stack_empty ()) { sym_addr += q->addend; } else { sym_addr = reloc_stack_pop (); } if(weak_und_symbol(sym_section->name, (*(q->sym_ptr_ptr)))) continue; if(0xFFFF0000 & sym_addr){ Loading Loading @@ -1315,10 +1226,7 @@ NIOS2_RELOC_ERR: else hi_lo = FLAT_RELOC_PART_HI; if (is_reloc_stack_empty ()) sym_addr += q->addend; else sym_addr = reloc_stack_pop (); flat_relocs = (uint32_t *) (realloc (flat_relocs, (flat_reloc_count + 2) * sizeof (uint32_t))); Loading Loading @@ -1356,10 +1264,8 @@ NIOS2_RELOC_ERR: break; } case R_byte4_data: if (is_reloc_stack_empty ()) sym_addr += q->addend; else sym_addr = reloc_stack_pop (); if (weak_und_symbol (sym_section->name, *q->sym_ptr_ptr)) continue; Loading @@ -1375,22 +1281,6 @@ NIOS2_RELOC_ERR: flat_reloc_count++; break; case 0xE0: /* push */ sym_addr += q->addend; reloc_stack_push(sym_addr); reloc_stack_set_section(sym_section, section_name); break; case 0xE1: /* const */ reloc_stack_push(q->addend); break; case 0xE2 ... 0xF2: reloc_stack_operate((*p)->howto->type); break; #endif //TARGET_bfin #ifdef TARGET_sh Loading Loading @@ -1622,17 +1512,20 @@ DIS29_RELOCATION: tmp.l = *(unsigned long *)r_mem; hl = tmp.c[i0] | (tmp.c[i1] << 8) | (tmp.c[i2] << 16); if (((*p)->howto->type != R_ARM_PC24) && ((*p)->howto->type != R_ARM_PLT32)) if (use_resolved || (((*p)->howto->type != R_ARM_PC24) && ((*p)->howto->type != R_ARM_PLT32))) hl |= (tmp.c[i3] << 24); else if (tmp.c[i2] & 0x80) hl |= 0xff000000; /* sign extend */ if (!use_resolved) hl += sym_addr; tmp.c[i0] = hl & 0xff; tmp.c[i1] = (hl >> 8) & 0xff; tmp.c[i2] = (hl >> 16) & 0xff; if (((*p)->howto->type != R_ARM_PC24) && ((*p)->howto->type != R_ARM_PLT32)) if (use_resolved || (((*p)->howto->type != R_ARM_PC24) && ((*p)->howto->type != R_ARM_PLT32))) tmp.c[i3] = (hl >> 24) & 0xff; if ((*p)->howto->type == R_ARM_ABS32) *(unsigned long *)r_mem = htonl(hl); Loading Loading @@ -1734,6 +1627,18 @@ DIS29_RELOCATION: break; #endif /* TARGET_nios2 */ #if defined(TARGET_m68k) case R_68K_PC16: if (sym_addr < -0x8000 || sym_addr > 0x7fff) { fprintf (stderr, "Relocation overflow for R_68K_PC16 relocation against %s\n", sym_name); bad_relocs++; } else { r_mem[0] = (sym_addr >> 8) & 0xff; r_mem[1] = sym_addr & 0xff; } break; #endif default: /* The alignment of the build host might be stricter than that of the Loading Loading @@ -1867,7 +1772,7 @@ static void write_zeroes (unsigned long num, FILE *stream) if (num > 0) { /* It'd be nice if we could just use fseek, but that doesn't seem to work for stdio output files. */ bzero(zeroes, 1024); memset(zeroes, 0x00, 1024); while (num > sizeof(zeroes)) { fwrite(zeroes, sizeof(zeroes), 1, stream); num -= sizeof(zeroes); Loading Loading @@ -2157,7 +2062,7 @@ int main(int argc, char *argv[]) | (compress ? (compress == 2 ? FLAT_FLAG_GZDATA : FLAT_FLAG_GZIP) : 0) ); hdr.build_date = htonl((unsigned long)time(NULL)); bzero(hdr.filler, sizeof(hdr.filler)); memset(hdr.filler, 0x00, sizeof(hdr.filler)); for (i=0; i<reloc_len; i++) reloc[i] = htonl(reloc[i]); Loading Loading @@ -2194,7 +2099,7 @@ int main(int argc, char *argv[]) pclose(gf); \ else \ fclose(gf); \ if (!(gf = popen(cmd, "wb"))) { \ if (!(gf = popen(cmd, "w" BINARY_FILE_OPTS))) { \ fprintf(stderr, "Can't run cmd %s\n", cmd); \ exit(4); \ } \ Loading Loading
toolchain/elf2flt/elf2flt/CVS/Entries +7 −7 Original line number Diff line number Diff line Loading @@ -5,13 +5,13 @@ /flat.h/1.6/Tue Jan 10 04:34:08 2006/-ko/ /install-sh/1.1.1.1/Tue Jan 10 04:34:08 2006/-ko/ /stubs.c/1.1/Tue Jan 10 04:34:08 2006// /flthdr.c/1.8/Tue Jan 10 05:11:20 2006/-ko/ /elf2flt.ld/1.12/Tue Jan 10 05:12:32 2006/-ko/ /config.sub/1.8/Wed Jan 11 13:36:39 2006/-ko/ /cygwin-elf.h/1.4/Wed Jan 11 13:36:39 2006// /elf2flt.c/1.38/Fri Jan 13 08:02:22 2006/-ko/ /Makefile.in/1.15/Result of merge/-ko/ /configure.in/1.8/Mon Feb 6 05:04:36 2006/-ko/ /ld-elf2flt.in/1.11/Mon Feb 6 05:04:36 2006// /configure/1.9/Mon Feb 6 05:05:05 2006/-ko/ /Makefile.in/1.17/Result of merge/-ko/ /configure/1.12/Sun Jan 28 05:27:28 2007/-ko/ /configure.in/1.10/Sun Jan 28 05:27:28 2007/-ko/ /elf2flt.c/1.46/Result of merge/-ko/ /elf2flt.ld/1.15/Sun Jan 28 05:27:28 2007/-ko/ /flthdr.c/1.10/Sun Jan 28 05:27:28 2007/-ko/ /ld-elf2flt.in/1.15/Sun Jan 28 05:27:28 2007// D
toolchain/elf2flt/elf2flt/Makefile.in +4 −4 Original line number Diff line number Diff line Loading @@ -66,10 +66,10 @@ install: $(INSTALL) -d $(bindir) $(INSTALL) -d $(target_bindir) $(INSTALL) -d $(target_libdir) $(INSTALL) -s -m 755 $(PROG_FLTHDR) $(bindir)/$(TARGET)-$(PROG_FLTHDR) $(INSTALL) -s -m 755 $(PROG_FLTHDR) $(target_bindir)/$(PROG_FLTHDR) $(INSTALL) -s -m 755 $(PROG_ELF2FLT) $(bindir)/$(TARGET)-$(PROG_ELF2FLT) $(INSTALL) -s -m 755 $(PROG_ELF2FLT) $(target_bindir)/$(PROG_ELF2FLT) $(INSTALL) -m 755 $(PROG_FLTHDR) $(bindir)/$(TARGET)-$(PROG_FLTHDR) $(INSTALL) -m 755 $(PROG_FLTHDR) $(target_bindir)/$(PROG_FLTHDR) $(INSTALL) -m 755 $(PROG_ELF2FLT) $(bindir)/$(TARGET)-$(PROG_ELF2FLT) $(INSTALL) -m 755 $(PROG_ELF2FLT) $(target_bindir)/$(PROG_ELF2FLT) [ -f $(bindir)/$(TARGET)-ld.real$(EXEEXT) ] || \ mv $(bindir)/$(TARGET)-ld$(EXEEXT) $(bindir)/$(TARGET)-ld.real$(EXEEXT) [ -f $(target_bindir)/ld.real$(EXEEXT) ] || \ Loading
toolchain/elf2flt/elf2flt/configure +541 −251 File changed.Preview size limit exceeded, changes collapsed. Show changes
toolchain/elf2flt/elf2flt/configure.in +27 −20 Original line number Diff line number Diff line Loading @@ -37,6 +37,12 @@ AC_ARG_ENABLE(got-check, [ got_check=yes ] ) AC_ARG_ENABLE(emit_relocs, [ --disable-emit-relocs - don't use the --emit-relocs (-q) linker option ], [ emit_relocs=$enableval ], [ emit_relocs=yes ] ) AC_CANONICAL_HOST AC_CANONICAL_TARGET Loading Loading @@ -75,29 +81,29 @@ fi binutils_ldscript_dir="$ac_binutils_ldscript_dir" if test "$ac_libbfd" = "NONE" -o "$ac_libiberty" = "NONE" ; then echo echo "You need to specify the location of the libfd.a and libiberty.a" echo "host libraries from the binutils package." echo echo "Run configure again specifying these options:" echo echo " ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>" echo exit 1 AC_MSG_ERROR([ You need to specify the location of the libfd.a and libiberty.a host libraries from the binutils package. Run configure again specifying these options: ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a> ]) fi if test "$ac_bfd_include_dir" = "NONE" ; then echo echo "You need to specify the location of the bfd.h header from a" echo "configured/compiled version of the binutils package for your target." echo "Without this your elf2flt may crash as it will try to use the" echo "systems bfd.h which may be from a different binutils package." echo echo "Run configure again specifying these options:" echo echo " ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>" echo exit 1 AC_MSG_ERROR([ You need to specify the location of the bfd.h header from a configured/compiled version of the binutils package for your target. Without this your elf2flt may crash as it will try to use the systems bfd.h which may be from a different binutils package. Run configure again specifying these options: ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a> ]) fi dnl Checks for header files. Loading @@ -122,6 +128,7 @@ AC_SUBST(bfd_include_dir) AC_SUBST(binutils_include_dir) AC_SUBST(binutils_ldscript_dir) AC_SUBST(got_check) AC_SUBST(emit_relocs) AC_OUTPUT(Makefile ld-elf2flt)
toolchain/elf2flt/elf2flt/elf2flt.c +79 −174 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ * ELF format file handling. Extended relocation support for all of * text and data. * * (c) 2006 Support the -a (use_resolved) option for TARGET_arm. * Shaun Jackman <sjackman@gmail.com> * (c) 2004, Nios II support, Wentao Xu <wentao@microtronix.com> * (c) 2003, H8 support, ktrace <davidm@snapgear.com> * (c) 2003-2004, MicroBlaze support, John Williams <jwilliams@itee.uq.edu.au> Loading Loading @@ -44,8 +46,10 @@ #include <time.h> #ifndef WIN32 #include <netinet/in.h> /* Consts and structs defined by the internet system */ #define BINARY_FILE_OPTS #else #include <winsock2.h> #define BINARY_FILE_OPTS "b" #endif /* from $(INSTALLDIR)/include */ Loading Loading @@ -306,119 +310,6 @@ add_com_to_bss(asymbol **symbol_table, long number_of_symbols, long bss_len) } #ifdef TARGET_bfin /* stack to handle "arithmetic" relocations */ #define RELOC_STACK_SIZE 100 static bfd_vma reloc_stack[RELOC_STACK_SIZE]; static unsigned int reloc_stack_tos = 0; static char sym_section_name[80]; static asection *stack_sym_section = 0; static void reloc_stack_set_section(asection *section, const char *sym_section_name_in) { /* TODO : we can add checks to make sure we do not add different section names to the same arithmetic expression. */ strcpy(sym_section_name, sym_section_name_in); stack_sym_section = section; } static const char * reloc_stack_get_section_name() { return sym_section_name; } static asection *reloc_stack_get_section() { return stack_sym_section; } #define is_reloc_stack_empty() ((reloc_stack_tos > 0)?0:1) static void reloc_stack_push(bfd_vma value) { reloc_stack[reloc_stack_tos++] = value; } static bfd_vma reloc_stack_pop() { return reloc_stack[--reloc_stack_tos]; } static bfd_vma reloc_stack_operate(unsigned int oper) { bfd_vma value; switch(oper){ case 0xE2 : value = reloc_stack[reloc_stack_tos - 2] + reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE3 : value = reloc_stack[reloc_stack_tos - 2] - reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE4 : value = reloc_stack[reloc_stack_tos - 2] * reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE5 : value = reloc_stack[reloc_stack_tos - 2] / reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE6 : value = reloc_stack[reloc_stack_tos - 2] % reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE7 : value = reloc_stack[reloc_stack_tos - 2] << reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE8 : value = reloc_stack[reloc_stack_tos - 2] >> reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xE9 : value = reloc_stack[reloc_stack_tos - 2] & reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xEA : value = reloc_stack[reloc_stack_tos - 2] | reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xEB : value = reloc_stack[reloc_stack_tos - 2] ^ reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xEC : value = reloc_stack[reloc_stack_tos - 2] && reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xED : value = reloc_stack[reloc_stack_tos - 2] || reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 2; break; case 0xEF : value = -reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos --; break; case 0xF0 : value = ~reloc_stack[reloc_stack_tos - 1]; reloc_stack_tos -= 1; break; default : fprintf(stderr, "bfin relocation : Internal bug\n"); return 0; } // now push the new value back on stack reloc_stack_push(value); return value; } /* FUNCTION : weak_und_symbol ABSTRACT : return true if symbol is weak and undefined. */ Loading Loading @@ -534,7 +425,7 @@ dump_symbols(symbols, number_of_symbols); * Also note that both the relocatable and absolute versions have this * terminator even though the relocatable one doesn't have the GOT! */ if (pic_with_got) { if (pic_with_got && !use_resolved) { unsigned long *lp = (unsigned long *)data; /* Should call ntohl(*lp) here but is isn't going to matter */ while (*lp != 0xffffffff) lp++; Loading Loading @@ -682,16 +573,6 @@ dump_symbols(symbols, number_of_symbols); #endif /* USE_V850_RELOCS */ q = *p; #ifdef TARGET_bfin if ((q->sym_ptr_ptr && *q->sym_ptr_ptr) && (!is_reloc_stack_empty() && strstr((*(q->sym_ptr_ptr))->name, "operator"))){ /* must be an arith reloc ... get the value from the stack */ sym_name = (*(q->sym_ptr_ptr))->name; sym_section = reloc_stack_get_section(); section_name = reloc_stack_get_section_name(); } else #endif if (q->sym_ptr_ptr && *q->sym_ptr_ptr) { sym_name = (*(q->sym_ptr_ptr))->name; sym_section = (*(q->sym_ptr_ptr))->section; Loading @@ -705,7 +586,7 @@ dump_symbols(symbols, number_of_symbols); /* Adjust the address to account for the GOT table which wasn't * present in the relative file link. */ if (pic_with_got) if (pic_with_got && !use_resolved) q->address += got_size; #endif Loading Loading @@ -793,7 +674,7 @@ dump_symbols(symbols, number_of_symbols); + lo; } } else goto bad_v850_reloc_err; goto bad_resolved_reloc; break; case R_V850_LO16: Loading @@ -807,16 +688,37 @@ dump_symbols(symbols, number_of_symbols); && (p[-1]->addend == p[0]->addend)) break; /* not an error */ else goto bad_v850_reloc_err; goto bad_resolved_reloc; case R_V850_HI16: bad_v850_reloc_err: printf("ERROR: reloc type %s unsupported in this context\n", q->howto->name); bad_relocs++; goto bad_resolved_reloc; default: goto good_32bit_resolved_reloc; #elif defined(TARGET_arm) case R_ARM_ABS32: relocation_needed = 1; break; #endif /* TARGET_V850 */ case R_ARM_REL32: case R_ARM_THM_PC11: case R_ARM_THM_PC22: relocation_needed = 0; break; default: goto bad_resolved_reloc; #elif defined(TARGET_m68k) case R_68K_32: goto good_32bit_resolved_reloc; case R_68K_PC32: case R_68K_PC16: /* The linker has already resolved PC relocs for us. In PIC links, the symbol must be in the data segment. */ case R_68K_NONE: continue; default: goto bad_resolved_reloc; #else default: /* The default is to assume that the relocation is relative and has Loading @@ -825,6 +727,9 @@ dump_symbols(symbols, number_of_symbols); give an error by default, and require `safe' relocations to be enumberated explicitly?). */ goto good_32bit_resolve_reloc; #endif good_32bit_resolved_reloc: if (bfd_big_endian (abs_bfd)) sym_addr = (r_mem[0] << 24) Loading @@ -838,12 +743,19 @@ dump_symbols(symbols, number_of_symbols); + (r_mem[2] << 16) + (r_mem[3] << 24); relocation_needed = 1; break; bad_resolved_reloc: printf("ERROR: reloc type %s unsupported in this context\n", q->howto->name); bad_relocs++; break; } } else { /* Calculate the sym address ourselves. */ sym_reloc_size = bfd_get_reloc_size(q->howto); #if !defined(TARGET_h8300) && !defined(TARGET_e1) && !defined(TARGET_bfin) #if !defined(TARGET_h8300) && !defined(TARGET_e1) && !defined(TARGET_bfin) && !defined(TARGET_m68k) if (sym_reloc_size != 4) { printf("ERROR: bad reloc type %d size=%d for symbol=%s\n", (*p)->howto->type, sym_reloc_size, sym_name); Loading @@ -861,6 +773,7 @@ dump_symbols(symbols, number_of_symbols); sym_vma = bfd_section_vma(abs_bfd, sym_section); sym_addr += sym_vma + q->addend; break; case R_68K_PC16: case R_68K_PC32: sym_vma = 0; sym_addr += sym_vma + q->addend; Loading Loading @@ -1278,14 +1191,12 @@ NIOS2_RELOC_ERR: sym_addr -= q->address; // make it PC relative // implicitly assumes code section and symbol section are same break; case R_got: /* Ignore these. */ break; case R_rimm16: if (is_reloc_stack_empty ()) { sym_addr += q->addend; } else { sym_addr = reloc_stack_pop (); } if(weak_und_symbol(sym_section->name, (*(q->sym_ptr_ptr)))) continue; if(0xFFFF0000 & sym_addr){ Loading Loading @@ -1315,10 +1226,7 @@ NIOS2_RELOC_ERR: else hi_lo = FLAT_RELOC_PART_HI; if (is_reloc_stack_empty ()) sym_addr += q->addend; else sym_addr = reloc_stack_pop (); flat_relocs = (uint32_t *) (realloc (flat_relocs, (flat_reloc_count + 2) * sizeof (uint32_t))); Loading Loading @@ -1356,10 +1264,8 @@ NIOS2_RELOC_ERR: break; } case R_byte4_data: if (is_reloc_stack_empty ()) sym_addr += q->addend; else sym_addr = reloc_stack_pop (); if (weak_und_symbol (sym_section->name, *q->sym_ptr_ptr)) continue; Loading @@ -1375,22 +1281,6 @@ NIOS2_RELOC_ERR: flat_reloc_count++; break; case 0xE0: /* push */ sym_addr += q->addend; reloc_stack_push(sym_addr); reloc_stack_set_section(sym_section, section_name); break; case 0xE1: /* const */ reloc_stack_push(q->addend); break; case 0xE2 ... 0xF2: reloc_stack_operate((*p)->howto->type); break; #endif //TARGET_bfin #ifdef TARGET_sh Loading Loading @@ -1622,17 +1512,20 @@ DIS29_RELOCATION: tmp.l = *(unsigned long *)r_mem; hl = tmp.c[i0] | (tmp.c[i1] << 8) | (tmp.c[i2] << 16); if (((*p)->howto->type != R_ARM_PC24) && ((*p)->howto->type != R_ARM_PLT32)) if (use_resolved || (((*p)->howto->type != R_ARM_PC24) && ((*p)->howto->type != R_ARM_PLT32))) hl |= (tmp.c[i3] << 24); else if (tmp.c[i2] & 0x80) hl |= 0xff000000; /* sign extend */ if (!use_resolved) hl += sym_addr; tmp.c[i0] = hl & 0xff; tmp.c[i1] = (hl >> 8) & 0xff; tmp.c[i2] = (hl >> 16) & 0xff; if (((*p)->howto->type != R_ARM_PC24) && ((*p)->howto->type != R_ARM_PLT32)) if (use_resolved || (((*p)->howto->type != R_ARM_PC24) && ((*p)->howto->type != R_ARM_PLT32))) tmp.c[i3] = (hl >> 24) & 0xff; if ((*p)->howto->type == R_ARM_ABS32) *(unsigned long *)r_mem = htonl(hl); Loading Loading @@ -1734,6 +1627,18 @@ DIS29_RELOCATION: break; #endif /* TARGET_nios2 */ #if defined(TARGET_m68k) case R_68K_PC16: if (sym_addr < -0x8000 || sym_addr > 0x7fff) { fprintf (stderr, "Relocation overflow for R_68K_PC16 relocation against %s\n", sym_name); bad_relocs++; } else { r_mem[0] = (sym_addr >> 8) & 0xff; r_mem[1] = sym_addr & 0xff; } break; #endif default: /* The alignment of the build host might be stricter than that of the Loading Loading @@ -1867,7 +1772,7 @@ static void write_zeroes (unsigned long num, FILE *stream) if (num > 0) { /* It'd be nice if we could just use fseek, but that doesn't seem to work for stdio output files. */ bzero(zeroes, 1024); memset(zeroes, 0x00, 1024); while (num > sizeof(zeroes)) { fwrite(zeroes, sizeof(zeroes), 1, stream); num -= sizeof(zeroes); Loading Loading @@ -2157,7 +2062,7 @@ int main(int argc, char *argv[]) | (compress ? (compress == 2 ? FLAT_FLAG_GZDATA : FLAT_FLAG_GZIP) : 0) ); hdr.build_date = htonl((unsigned long)time(NULL)); bzero(hdr.filler, sizeof(hdr.filler)); memset(hdr.filler, 0x00, sizeof(hdr.filler)); for (i=0; i<reloc_len; i++) reloc[i] = htonl(reloc[i]); Loading Loading @@ -2194,7 +2099,7 @@ int main(int argc, char *argv[]) pclose(gf); \ else \ fclose(gf); \ if (!(gf = popen(cmd, "wb"))) { \ if (!(gf = popen(cmd, "w" BINARY_FILE_OPTS))) { \ fprintf(stderr, "Can't run cmd %s\n", cmd); \ exit(4); \ } \ Loading