pull from uClinux CVS

This commit is contained in:
Mike Frysinger 2007-01-28 05:32:12 +00:00
parent ee9c02846c
commit e0b4700acf
8 changed files with 761 additions and 478 deletions

View File

@ -5,13 +5,13 @@
/flat.h/1.6/Tue Jan 10 04:34:08 2006/-ko/ /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/ /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// /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/ /config.sub/1.8/Wed Jan 11 13:36:39 2006/-ko/
/cygwin-elf.h/1.4/Wed Jan 11 13:36:39 2006// /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.17/Result of merge/-ko/
/Makefile.in/1.15/Result of merge/-ko/ /configure/1.12/Sun Jan 28 05:27:28 2007/-ko/
/configure.in/1.8/Mon Feb 6 05:04:36 2006/-ko/ /configure.in/1.10/Sun Jan 28 05:27:28 2007/-ko/
/ld-elf2flt.in/1.11/Mon Feb 6 05:04:36 2006// /elf2flt.c/1.46/Result of merge/-ko/
/configure/1.9/Mon Feb 6 05:05:05 2006/-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 D

View File

@ -66,10 +66,10 @@ install:
$(INSTALL) -d $(bindir) $(INSTALL) -d $(bindir)
$(INSTALL) -d $(target_bindir) $(INSTALL) -d $(target_bindir)
$(INSTALL) -d $(target_libdir) $(INSTALL) -d $(target_libdir)
$(INSTALL) -s -m 755 $(PROG_FLTHDR) $(bindir)/$(TARGET)-$(PROG_FLTHDR) $(INSTALL) -m 755 $(PROG_FLTHDR) $(bindir)/$(TARGET)-$(PROG_FLTHDR)
$(INSTALL) -s -m 755 $(PROG_FLTHDR) $(target_bindir)/$(PROG_FLTHDR) $(INSTALL) -m 755 $(PROG_FLTHDR) $(target_bindir)/$(PROG_FLTHDR)
$(INSTALL) -s -m 755 $(PROG_ELF2FLT) $(bindir)/$(TARGET)-$(PROG_ELF2FLT) $(INSTALL) -m 755 $(PROG_ELF2FLT) $(bindir)/$(TARGET)-$(PROG_ELF2FLT)
$(INSTALL) -s -m 755 $(PROG_ELF2FLT) $(target_bindir)/$(PROG_ELF2FLT) $(INSTALL) -m 755 $(PROG_ELF2FLT) $(target_bindir)/$(PROG_ELF2FLT)
[ -f $(bindir)/$(TARGET)-ld.real$(EXEEXT) ] || \ [ -f $(bindir)/$(TARGET)-ld.real$(EXEEXT) ] || \
mv $(bindir)/$(TARGET)-ld$(EXEEXT) $(bindir)/$(TARGET)-ld.real$(EXEEXT) mv $(bindir)/$(TARGET)-ld$(EXEEXT) $(bindir)/$(TARGET)-ld.real$(EXEEXT)
[ -f $(target_bindir)/ld.real$(EXEEXT) ] || \ [ -f $(target_bindir)/ld.real$(EXEEXT) ] || \

File diff suppressed because it is too large Load Diff

View File

@ -37,6 +37,12 @@ AC_ARG_ENABLE(got-check,
[ got_check=yes ] [ 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_HOST
AC_CANONICAL_TARGET AC_CANONICAL_TARGET
@ -75,29 +81,29 @@ fi
binutils_ldscript_dir="$ac_binutils_ldscript_dir" binutils_ldscript_dir="$ac_binutils_ldscript_dir"
if test "$ac_libbfd" = "NONE" -o "$ac_libiberty" = "NONE" ; then if test "$ac_libbfd" = "NONE" -o "$ac_libiberty" = "NONE" ; then
echo AC_MSG_ERROR([
echo "You need to specify the location of the libfd.a and libiberty.a"
echo "host libraries from the binutils package." You need to specify the location of the libfd.a and libiberty.a
echo host libraries from the binutils package.
echo "Run configure again specifying these options:"
echo Run configure again specifying these options:
echo " ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>"
echo ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>
exit 1 ])
fi fi
if test "$ac_bfd_include_dir" = "NONE" ; then if test "$ac_bfd_include_dir" = "NONE" ; then
echo AC_MSG_ERROR([
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." You need to specify the location of the bfd.h header from a
echo "Without this your elf2flt may crash as it will try to use the" configured/compiled version of the binutils package for your target.
echo "systems bfd.h which may be from a different binutils package." 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 "Run configure again specifying these options:"
echo Run configure again specifying these options:
echo " ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>"
echo ./configure --target=<ARCH> --with-bfd-include-dir=<dir> --with-libbfd=<libbfd.a> --with-libiberty=<libiberty.a>
exit 1 ])
fi fi
dnl Checks for header files. dnl Checks for header files.
@ -122,6 +128,7 @@ AC_SUBST(bfd_include_dir)
AC_SUBST(binutils_include_dir) AC_SUBST(binutils_include_dir)
AC_SUBST(binutils_ldscript_dir) AC_SUBST(binutils_ldscript_dir)
AC_SUBST(got_check) AC_SUBST(got_check)
AC_SUBST(emit_relocs)
AC_OUTPUT(Makefile ld-elf2flt) AC_OUTPUT(Makefile ld-elf2flt)

View File

@ -6,6 +6,8 @@
* ELF format file handling. Extended relocation support for all of * ELF format file handling. Extended relocation support for all of
* text and data. * 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) 2004, Nios II support, Wentao Xu <wentao@microtronix.com>
* (c) 2003, H8 support, ktrace <davidm@snapgear.com> * (c) 2003, H8 support, ktrace <davidm@snapgear.com>
* (c) 2003-2004, MicroBlaze support, John Williams <jwilliams@itee.uq.edu.au> * (c) 2003-2004, MicroBlaze support, John Williams <jwilliams@itee.uq.edu.au>
@ -44,8 +46,10 @@
#include <time.h> #include <time.h>
#ifndef WIN32 #ifndef WIN32
#include <netinet/in.h> /* Consts and structs defined by the internet system */ #include <netinet/in.h> /* Consts and structs defined by the internet system */
#define BINARY_FILE_OPTS
#else #else
#include <winsock2.h> #include <winsock2.h>
#define BINARY_FILE_OPTS "b"
#endif #endif
/* from $(INSTALLDIR)/include */ /* from $(INSTALLDIR)/include */
@ -306,119 +310,6 @@ add_com_to_bss(asymbol **symbol_table, long number_of_symbols, long bss_len)
} }
#ifdef TARGET_bfin #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 /* FUNCTION : weak_und_symbol
ABSTRACT : return true if symbol is weak and undefined. ABSTRACT : return true if symbol is weak and undefined.
*/ */
@ -534,7 +425,7 @@ dump_symbols(symbols, number_of_symbols);
* Also note that both the relocatable and absolute versions have this * Also note that both the relocatable and absolute versions have this
* terminator even though the relocatable one doesn't have the GOT! * 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; unsigned long *lp = (unsigned long *)data;
/* Should call ntohl(*lp) here but is isn't going to matter */ /* Should call ntohl(*lp) here but is isn't going to matter */
while (*lp != 0xffffffff) lp++; while (*lp != 0xffffffff) lp++;
@ -682,16 +573,6 @@ dump_symbols(symbols, number_of_symbols);
#endif /* USE_V850_RELOCS */ #endif /* USE_V850_RELOCS */
q = *p; 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) { if (q->sym_ptr_ptr && *q->sym_ptr_ptr) {
sym_name = (*(q->sym_ptr_ptr))->name; sym_name = (*(q->sym_ptr_ptr))->name;
sym_section = (*(q->sym_ptr_ptr))->section; sym_section = (*(q->sym_ptr_ptr))->section;
@ -705,7 +586,7 @@ dump_symbols(symbols, number_of_symbols);
/* Adjust the address to account for the GOT table which wasn't /* Adjust the address to account for the GOT table which wasn't
* present in the relative file link. * present in the relative file link.
*/ */
if (pic_with_got) if (pic_with_got && !use_resolved)
q->address += got_size; q->address += got_size;
#endif #endif
@ -793,7 +674,7 @@ dump_symbols(symbols, number_of_symbols);
+ lo; + lo;
} }
} else } else
goto bad_v850_reloc_err; goto bad_resolved_reloc;
break; break;
case R_V850_LO16: case R_V850_LO16:
@ -807,16 +688,37 @@ dump_symbols(symbols, number_of_symbols);
&& (p[-1]->addend == p[0]->addend)) && (p[-1]->addend == p[0]->addend))
break; /* not an error */ break; /* not an error */
else else
goto bad_v850_reloc_err; goto bad_resolved_reloc;
case R_V850_HI16: case R_V850_HI16:
bad_v850_reloc_err: goto bad_resolved_reloc;
printf("ERROR: reloc type %s unsupported in this context\n", default:
q->howto->name); goto good_32bit_resolved_reloc;
bad_relocs++; #elif defined(TARGET_arm)
case R_ARM_ABS32:
relocation_needed = 1;
break; 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: default:
/* The default is to assume that the /* The default is to assume that the
relocation is relative and has relocation is relative and has
@ -825,6 +727,9 @@ dump_symbols(symbols, number_of_symbols);
give an error by default, and give an error by default, and
require `safe' relocations to be require `safe' relocations to be
enumberated explicitly?). */ enumberated explicitly?). */
goto good_32bit_resolve_reloc;
#endif
good_32bit_resolved_reloc:
if (bfd_big_endian (abs_bfd)) if (bfd_big_endian (abs_bfd))
sym_addr = sym_addr =
(r_mem[0] << 24) (r_mem[0] << 24)
@ -838,12 +743,19 @@ dump_symbols(symbols, number_of_symbols);
+ (r_mem[2] << 16) + (r_mem[2] << 16)
+ (r_mem[3] << 24); + (r_mem[3] << 24);
relocation_needed = 1; relocation_needed = 1;
break;
bad_resolved_reloc:
printf("ERROR: reloc type %s unsupported in this context\n",
q->howto->name);
bad_relocs++;
break;
} }
} else { } else {
/* Calculate the sym address ourselves. */ /* Calculate the sym address ourselves. */
sym_reloc_size = bfd_get_reloc_size(q->howto); 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) { if (sym_reloc_size != 4) {
printf("ERROR: bad reloc type %d size=%d for symbol=%s\n", printf("ERROR: bad reloc type %d size=%d for symbol=%s\n",
(*p)->howto->type, sym_reloc_size, sym_name); (*p)->howto->type, sym_reloc_size, sym_name);
@ -861,6 +773,7 @@ dump_symbols(symbols, number_of_symbols);
sym_vma = bfd_section_vma(abs_bfd, sym_section); sym_vma = bfd_section_vma(abs_bfd, sym_section);
sym_addr += sym_vma + q->addend; sym_addr += sym_vma + q->addend;
break; break;
case R_68K_PC16:
case R_68K_PC32: case R_68K_PC32:
sym_vma = 0; sym_vma = 0;
sym_addr += sym_vma + q->addend; sym_addr += sym_vma + q->addend;
@ -1278,14 +1191,12 @@ NIOS2_RELOC_ERR:
sym_addr -= q->address; // make it PC relative sym_addr -= q->address; // make it PC relative
// implicitly assumes code section and symbol section are same // implicitly assumes code section and symbol section are same
break; break;
case R_got:
/* Ignore these. */
break;
case R_rimm16: case R_rimm16:
if (is_reloc_stack_empty ()) sym_addr += q->addend;
{
sym_addr += q->addend;
} else {
sym_addr = reloc_stack_pop ();
}
if(weak_und_symbol(sym_section->name, (*(q->sym_ptr_ptr)))) if(weak_und_symbol(sym_section->name, (*(q->sym_ptr_ptr))))
continue; continue;
if(0xFFFF0000 & sym_addr){ if(0xFFFF0000 & sym_addr){
@ -1315,11 +1226,8 @@ NIOS2_RELOC_ERR:
else else
hi_lo = FLAT_RELOC_PART_HI; hi_lo = FLAT_RELOC_PART_HI;
if (is_reloc_stack_empty ()) sym_addr += q->addend;
sym_addr += q->addend;
else
sym_addr = reloc_stack_pop ();
flat_relocs = (uint32_t *) flat_relocs = (uint32_t *)
(realloc (flat_relocs, (flat_reloc_count + 2) * sizeof (uint32_t))); (realloc (flat_relocs, (flat_reloc_count + 2) * sizeof (uint32_t)));
reloc_count_incr = 1; reloc_count_incr = 1;
@ -1356,10 +1264,8 @@ NIOS2_RELOC_ERR:
break; break;
} }
case R_byte4_data: case R_byte4_data:
if (is_reloc_stack_empty ()) sym_addr += q->addend;
sym_addr += q->addend;
else
sym_addr = reloc_stack_pop ();
if (weak_und_symbol (sym_section->name, *q->sym_ptr_ptr)) if (weak_und_symbol (sym_section->name, *q->sym_ptr_ptr))
continue; continue;
@ -1375,22 +1281,6 @@ NIOS2_RELOC_ERR:
flat_reloc_count++; flat_reloc_count++;
break; 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 #endif //TARGET_bfin
#ifdef TARGET_sh #ifdef TARGET_sh
@ -1622,17 +1512,20 @@ DIS29_RELOCATION:
tmp.l = *(unsigned long *)r_mem; tmp.l = *(unsigned long *)r_mem;
hl = tmp.c[i0] | (tmp.c[i1] << 8) | (tmp.c[i2] << 16); hl = tmp.c[i0] | (tmp.c[i1] << 8) | (tmp.c[i2] << 16);
if (((*p)->howto->type != R_ARM_PC24) && if (use_resolved ||
((*p)->howto->type != R_ARM_PLT32)) (((*p)->howto->type != R_ARM_PC24) &&
((*p)->howto->type != R_ARM_PLT32)))
hl |= (tmp.c[i3] << 24); hl |= (tmp.c[i3] << 24);
else if (tmp.c[i2] & 0x80) else if (tmp.c[i2] & 0x80)
hl |= 0xff000000; /* sign extend */ hl |= 0xff000000; /* sign extend */
hl += sym_addr; if (!use_resolved)
hl += sym_addr;
tmp.c[i0] = hl & 0xff; tmp.c[i0] = hl & 0xff;
tmp.c[i1] = (hl >> 8) & 0xff; tmp.c[i1] = (hl >> 8) & 0xff;
tmp.c[i2] = (hl >> 16) & 0xff; tmp.c[i2] = (hl >> 16) & 0xff;
if (((*p)->howto->type != R_ARM_PC24) && if (use_resolved ||
((*p)->howto->type != R_ARM_PLT32)) (((*p)->howto->type != R_ARM_PC24) &&
((*p)->howto->type != R_ARM_PLT32)))
tmp.c[i3] = (hl >> 24) & 0xff; tmp.c[i3] = (hl >> 24) & 0xff;
if ((*p)->howto->type == R_ARM_ABS32) if ((*p)->howto->type == R_ARM_ABS32)
*(unsigned long *)r_mem = htonl(hl); *(unsigned long *)r_mem = htonl(hl);
@ -1734,6 +1627,18 @@ DIS29_RELOCATION:
break; break;
#endif /* TARGET_nios2 */ #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: default:
/* The alignment of the build host /* The alignment of the build host
might be stricter than that of the might be stricter than that of the
@ -1867,7 +1772,7 @@ static void write_zeroes (unsigned long num, FILE *stream)
if (num > 0) { if (num > 0) {
/* It'd be nice if we could just use fseek, but that doesn't seem to /* It'd be nice if we could just use fseek, but that doesn't seem to
work for stdio output files. */ work for stdio output files. */
bzero(zeroes, 1024); memset(zeroes, 0x00, 1024);
while (num > sizeof(zeroes)) { while (num > sizeof(zeroes)) {
fwrite(zeroes, sizeof(zeroes), 1, stream); fwrite(zeroes, sizeof(zeroes), 1, stream);
num -= sizeof(zeroes); num -= sizeof(zeroes);
@ -2157,7 +2062,7 @@ int main(int argc, char *argv[])
| (compress ? (compress == 2 ? FLAT_FLAG_GZDATA : FLAT_FLAG_GZIP) : 0) | (compress ? (compress == 2 ? FLAT_FLAG_GZDATA : FLAT_FLAG_GZIP) : 0)
); );
hdr.build_date = htonl((unsigned long)time(NULL)); 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]); for (i=0; i<reloc_len; i++) reloc[i] = htonl(reloc[i]);
@ -2194,7 +2099,7 @@ int main(int argc, char *argv[])
pclose(gf); \ pclose(gf); \
else \ else \
fclose(gf); \ fclose(gf); \
if (!(gf = popen(cmd, "wb"))) { \ if (!(gf = popen(cmd, "w" BINARY_FILE_OPTS))) { \
fprintf(stderr, "Can't run cmd %s\n", cmd); \ fprintf(stderr, "Can't run cmd %s\n", cmd); \
exit(4); \ exit(4); \
} \ } \

View File

@ -25,6 +25,7 @@ SECTIONS {
W_RODAT *(.rodata) W_RODAT *(.rodata)
W_RODAT *(.rodata1) W_RODAT *(.rodata1)
W_RODAT *(.rodata.*) W_RODAT *(.rodata.*)
W_RODAT *(.gnu.linkonce.r*)
/* This is special code area at the end of the normal /* This is special code area at the end of the normal
text section. It contains a small lookup table at text section. It contains a small lookup table at
@ -53,7 +54,7 @@ W_RODAT *(.rodata.*)
R_RODAT *(.rodata) R_RODAT *(.rodata)
R_RODAT *(.rodata1) R_RODAT *(.rodata1)
R_RODAT *(.rodata.*) R_RODAT *(.rodata.*)
*(.gnu.linkonce.r*) R_RODAT *(.gnu.linkonce.r*)
*(.data) *(.data)
*(.data1) *(.data1)
*(.data.*) *(.data.*)
@ -90,15 +91,48 @@ R_RODAT *(.rodata.*)
. = ALIGN(4) ; . = ALIGN(4) ;
__CTOR_LIST__ = .; __CTOR_LIST__ = .;
LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
*(.ctors) SINGLE_LINK: /* gcc uses crtbegin.o to find the start of
SINGLE_LINK: the constructors, so we make sure it is
SINGLE_LINK: first. Because this is a wildcard, it
SINGLE_LINK: doesn't matter if the user does not
SINGLE_LINK: actually link against crtbegin.o; the
SINGLE_LINK: linker won't look for a file to match a
SINGLE_LINK: wildcard. The wildcard also means that it
SINGLE_LINK: doesn't matter which directory crtbegin.o
SINGLE_LINK: is in. */
SINGLE_LINK: KEEP (*crtbegin*.o(.ctors))
SINGLE_LINK: /* We don't want to include the .ctor section from
SINGLE_LINK: from the crtend.o file until after the sorted ctors.
SINGLE_LINK: The .ctor section from the crtend file contains the
SINGLE_LINK: end of ctors marker and it must be last */
SINGLE_LINK: KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
SINGLE_LINK: KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
LONG(0) LONG(0)
__CTOR_END__ = .; __CTOR_END__ = .;
__DTOR_LIST__ = .; __DTOR_LIST__ = .;
LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
*(.dtors) SINGLE_LINK: KEEP (*crtbegin*.o(.dtors))
SINGLE_LINK: KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
SINGLE_LINK: KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
LONG(0) LONG(0)
__DTOR_END__ = .; __DTOR_END__ = .;
PROVIDE (__preinit_array_start = .);
KEEP (*(.preinit_array))
PROVIDE (__preinit_array_end = .);
PROVIDE (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE (__init_array_end = .);
PROVIDE (__fini_array_start = .);
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
PROVIDE (__fini_array_end = .);
. = ALIGN(0x10) ; . = ALIGN(0x10) ;
_edata = . ; _edata = . ;
} > flatmem } > flatmem

View File

@ -19,8 +19,10 @@
/* macros for conversion between host and (internet) network byte order */ /* macros for conversion between host and (internet) network byte order */
#ifndef WIN32 #ifndef WIN32
#include <netinet/in.h> /* Consts and structs defined by the internet system */ #include <netinet/in.h> /* Consts and structs defined by the internet system */
#define BINARY_FILE_OPTS
#else #else
#include <winsock2.h> #include <winsock2.h>
#define BINARY_FILE_OPTS "b"
#endif #endif
/* from uClinux-x.x.x/include/linux */ /* from uClinux-x.x.x/include/linux */
@ -83,7 +85,7 @@ process_file(char *ifile, char *ofile)
*tfile = *tfile2 = '\0'; *tfile = *tfile2 = '\0';
if ((ifp = fopen(ifile, "rb")) == NULL) { if ((ifp = fopen(ifile, "r" BINARY_FILE_OPTS)) == NULL) {
fprintf(stderr, "Cannot open %s\n", ifile); fprintf(stderr, "Cannot open %s\n", ifile);
return; return;
} }
@ -206,7 +208,7 @@ process_file(char *ifile, char *ofile)
strcpy(tfile, "/tmp/flatXXXXXX"); strcpy(tfile, "/tmp/flatXXXXXX");
mkstemp(tfile); mkstemp(tfile);
if ((ofp = fopen(tfile, "wb")) == NULL) { if ((ofp = fopen(tfile, "w" BINARY_FILE_OPTS)) == NULL) {
fprintf(stderr, "Failed to open %s for writing\n", tfile); fprintf(stderr, "Failed to open %s for writing\n", tfile);
unlink(tfile); unlink(tfile);
unlink(tfile2); unlink(tfile2);
@ -231,7 +233,7 @@ process_file(char *ifile, char *ofile)
mkstemp(tfile2); mkstemp(tfile2);
if (old_flags & FLAT_FLAG_GZDATA) { if (old_flags & FLAT_FLAG_GZDATA) {
tfp = fopen(tfile2, "wb"); tfp = fopen(tfile2, "w" BINARY_FILE_OPTS);
if (!tfp) { if (!tfp) {
fprintf(stderr, "Failed to open %s for writing\n", tfile2); fprintf(stderr, "Failed to open %s for writing\n", tfile2);
exit(1); exit(1);
@ -242,7 +244,7 @@ process_file(char *ifile, char *ofile)
} }
sprintf(cmd, "gunzip >> %s", tfile2); sprintf(cmd, "gunzip >> %s", tfile2);
tfp = popen(cmd, "wb"); tfp = popen(cmd, "w" BINARY_FILE_OPTS);
if(!tfp) { if(!tfp) {
perror("popen"); perror("popen");
exit(1); exit(1);
@ -251,7 +253,7 @@ process_file(char *ifile, char *ofile)
pclose(tfp); pclose(tfp);
fclose(ifp); fclose(ifp);
ifp = fopen(tfile2, "rb"); ifp = fopen(tfile2, "r" BINARY_FILE_OPTS);
if (!ifp) { if (!ifp) {
fprintf(stderr, "Failed to open %s for reading\n", tfile2); fprintf(stderr, "Failed to open %s for reading\n", tfile2);
unlink(tfile); unlink(tfile);
@ -264,7 +266,7 @@ process_file(char *ifile, char *ofile)
printf("zflat %s --> %s\n", ifile, ofile); printf("zflat %s --> %s\n", ifile, ofile);
fclose(ofp); fclose(ofp);
sprintf(cmd, "gzip -9 -f >> %s", tfile); sprintf(cmd, "gzip -9 -f >> %s", tfile);
ofp = popen(cmd, "wb"); ofp = popen(cmd, "w" BINARY_FILE_OPTS);
ofp_is_pipe = 1; ofp_is_pipe = 1;
} else if (new_flags & FLAT_FLAG_GZDATA) { } else if (new_flags & FLAT_FLAG_GZDATA) {
printf("zflat-data %s --> %s\n", ifile, ofile); printf("zflat-data %s --> %s\n", ifile, ofile);
@ -272,7 +274,7 @@ process_file(char *ifile, char *ofile)
sizeof(struct flat_hdr)); sizeof(struct flat_hdr));
fclose(ofp); fclose(ofp);
sprintf(cmd, "gzip -9 -f >> %s", tfile); sprintf(cmd, "gzip -9 -f >> %s", tfile);
ofp = popen(cmd, "wb"); ofp = popen(cmd, "w" BINARY_FILE_OPTS);
ofp_is_pipe = 1; ofp_is_pipe = 1;
} }

View File

@ -14,7 +14,11 @@
LINKER="$0.real" # the original renamed-linker LINKER="$0.real" # the original renamed-linker
ELF2FLT="`expr $0 : '\(.*\)ld'`elf2flt" ELF2FLT="`expr $0 : '\(.*\)ld'`elf2flt"
NM="`expr $0 : '\(.*\)ld'`nm"
TOOLDIR="`dirname $0`" # let gcc find the tools for us TOOLDIR="`dirname $0`" # let gcc find the tools for us
OBJCOPY="`expr $0 : '\(.*\)ld'`objcopy"
[ -f "$OBJCOPY" ] || OBJCOPY="$TOOLDIR/../../bin/@target_alias@-objcopy"
OBJDUMP="`expr $OBJCOPY : '\(.*\)objcopy'`objdump"
LDSCRIPTPATH="@binutils_ldscript_dir@" # and the scripts LDSCRIPTPATH="@binutils_ldscript_dir@" # and the scripts
SHARED_ID="" SHARED_ID=""
NEWLDSCRIPT="" NEWLDSCRIPT=""
@ -92,10 +96,11 @@ then
ARG1="$ARG1 $FINAL_ONLY" ARG1="$ARG1 $FINAL_ONLY"
NEWLDSCRIPT=`mktemp /tmp/flt-XXXXXX` NEWLDSCRIPT=`mktemp /tmp/flt-XXXXXX`
SEDOP=" -e s/^R_RODAT// -e /^W_RODAT/d" SEDOP=" -e s/^R_RODAT// -e /^W_RODAT/d"
OBJCOPYOP=""
if [ "$MOVDAT" ] if [ "$MOVDAT" ]
then then
$LINKER -r -d -o "$OFILE.elf2flt" $ARG1 || exit $? $LINKER -r -d -o "$OFILE.elf2flt" $ARG1 || exit $?
if [ "`@target_alias@-objdump -h "$OFILE.elf2flt" | \ if [ "`$OBJDUMP -h "$OFILE.elf2flt" | \
egrep -A1 '[.]rodata' | grep RELOC`" ] egrep -A1 '[.]rodata' | grep RELOC`" ]
then then
echo "warning: .rodata section contains relocations" echo "warning: .rodata section contains relocations"
@ -117,6 +122,7 @@ then
# Non application modules enter via main not _start # Non application modules enter via main not _start
# SEDOP="$SEDOP -e 's/ENTRY (_start)/ENTRY (main)/'" # SEDOP="$SEDOP -e 's/ENTRY (_start)/ENTRY (main)/'"
SEDOP="$SEDOP -e s/\\(ENTRY.\\)(_start)/\1(lib_main)/" SEDOP="$SEDOP -e s/\\(ENTRY.\\)(_start)/\1(lib_main)/"
OBJCOPYOP="--localize-hidden --weaken"
fi fi
# Provide the magic parameter that defines the library data segment pointer offset # Provide the magic parameter that defines the library data segment pointer offset
@ -126,6 +132,12 @@ then
esac esac
ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -4 - 4`" ARG1="$ARG1 -defsym $GOT_OFFSET=`expr ${SHARED_ID} '*' -4 - 4`"
fi fi
if [ "@emit_relocs@" = "yes" ]
then
SEDOP="$SEDOP -e s/^SINGLE_LINK://"
else
SEDOP="$SEDOP -e /^SINGLE_LINK:/d"
fi
# provide a default linker script, we usually need one # provide a default linker script, we usually need one
[ -z "$LDSCRIPT" ] && LDSCRIPT="${LDSCRIPTPATH}/elf2flt.ld" [ -z "$LDSCRIPT" ] && LDSCRIPT="${LDSCRIPTPATH}/elf2flt.ld"
@ -143,23 +155,56 @@ then
LDSCRIPT="$NEWLDSCRIPT" LDSCRIPT="$NEWLDSCRIPT"
fi fi
if [ "@got_check@" = "no" ] if [ "@emit_relocs@" = "yes" ]
then then
$LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1 ||exit $? $LINKER $EMUL $SDIRS -T $LDSCRIPT -q -o "$OFILE.gdb" $ARG1 ||exit $?
$LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" $ARG1 ||exit $? RFILE="$OFILE.gdb"
FLTFLAGS="$FLTFLAGS -a"
else else
$LINKER $EMUL -r -d -o "$OFILE.elf2flt" $ARG1 ||exit $? if [ "@got_check@" = "no" ]
$LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -o "$OFILE.elf" "$OFILE.elf2flt" ||exit $? then
$LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" "$OFILE.elf2flt" ||exit $? $LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -d -o "$OFILE.elf" $ARG1 ||exit $?
rm -f "$OFILE.elf2flt" $LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" $ARG1 ||exit $?
else
$LINKER $EMUL -r -d -o "$OFILE.elf2flt" $ARG1 ||exit $?
$LINKER $EMUL $SDIRS -T $LDSCRIPT -Ur -o "$OFILE.elf" "$OFILE.elf2flt" ||exit $?
$LINKER $EMUL $SDIRS -T $LDSCRIPT -o "$OFILE.gdb" "$OFILE.elf2flt" ||exit $?
rm -f "$OFILE.elf2flt"
fi
RFILE="$OFILE.elf"
fi fi
if grep _GLOBAL_OFFSET_TABLE_ "$OFILE.gdb" > /dev/null if $NM "$OFILE.gdb" | grep _GLOBAL_OFFSET_TABLE_ > /dev/null
then then
$ELF2FLT $FLTFLAGS -o "$OFILE" -p "$OFILE.gdb" "$OFILE.elf" || exit $? $ELF2FLT $FLTFLAGS -o "$OFILE" -p "$OFILE.gdb" "$RFILE" || exit $?
else else
$ELF2FLT $FLTFLAGS -o "$OFILE" -r "$OFILE.elf" || exit $? $ELF2FLT $FLTFLAGS -o "$OFILE" -r "$RFILE" || exit $?
fi fi
rm -f "$OFILE.elf" # not needed for any reason if [ "$OBJCOPYOP" ]
then
if $OBJCOPY $OBJCOPYOP --help > /dev/null 2>&1
then
$OBJCOPY $OBJCOPYOP "$OFILE.gdb" ||exit $?
else
case " $OBJCOPYOP " in
*" --localize-hidden "*)
SYMS=`mktemp /tmp/flt-XXXXXX`
$OBJDUMP --syms "$OFILE.gdb" > "$SYMS" ||exit $?
sed -n 's/.*\(\.hidden\|\.internal\) \(.*\)/-L \2/p' < "$SYMS" > "$SYMS.hidden" ||exit $?
if [ -s "$SYMS.hidden" ]
then
xargs ${VERBOSE:+-t} $OBJCOPY "$OFILE.gdb" < "$SYMS.hidden" ||exit $?
fi
rm -f "$SYMS" "$SYMS.hidden"
;;
esac
case " $OBJCOPYOP " in
*" --weaken "*)
$OBJCOPY --weaken "$OFILE.gdb" ||exit $?
;;
esac
fi
fi
[ "$RFILE" = "$OFILE.gdb" ] || rm -f "$RFILE" # not needed for any reason
rm -f "$NEWLDSCRIPT" rm -f "$NEWLDSCRIPT"
exit 0 exit 0
fi fi