As the former comment suggested, I added the HAVE_RELATIVE_RELOCS and and reduced the linker code size.
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al -[ 6] .text PROGBITS 00000a2c 000a2c 00323e 00 AX 0 0 4 +[ 6] .text PROGBITS 00000a2c 000a2c 003133 00 AX 0 0 4 I suppose most of the linkers support -Bsymbolic, but I could verify only i386 and arm. Signed-off-by: Jiri Olsa <olsaj...@gmail.com> --- Index: ldso/ldso/arm/dl-startup.h =================================================================== --- ldso/ldso/arm/dl-startup.h (revision 24692) +++ ldso/ldso/arm/dl-startup.h (working copy) @@ -135,6 +135,9 @@ * do something a little more subtle here. */ #define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long*)ARGS)+1) +/* The linker supports relative relocations. */ +#define HAVE_RELATIVE_RELOCS + /* Handle relocation of the symbols in the dynamic loader. */ static __always_inline void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr, Index: ldso/ldso/dl-startup.c =================================================================== --- ldso/ldso/dl-startup.c (revision 24692) +++ ldso/ldso/dl-startup.c (working copy) @@ -250,16 +250,18 @@ if (!rel_addr) continue; - /* Now parse the relocation information */ - /* Since ldso is linked with -Bsymbolic, all relocs will be RELATIVE(for those archs that have - RELATIVE relocs) which means that the for(..) loop below has nothing to do and can be deleted. - Possibly one should add a HAVE_RELATIVE_RELOCS directive and #ifdef away some code. */ if (!indx && relative_count) { rel_size -= relative_count * sizeof(ELF_RELOC); elf_machine_relative(load_addr, rel_addr, relative_count); rel_addr += relative_count * sizeof(ELF_RELOC); } + /* Since ldso is linked with -Bsymbolic, all relocs will be RELATIVE (for those archs that have + RELATIVE relocs - HAVE_RELATIVE_RELOCS define). Which means that the for(..) loop below has + nothing to do and can omited. */ +#if !defined(HAVE_RELATIVE_RELOCS) + + /* Now parse the relocation information */ rpnt = (ELF_RELOC *) rel_addr; for (i = 0; i < rel_size; i += sizeof(ELF_RELOC), rpnt++) { reloc_addr = (unsigned long *) DL_RELOC_ADDR(load_addr, (unsigned long)rpnt->r_offset); @@ -285,6 +287,7 @@ /* Use this machine-specific macro to perform the actual relocation. */ PERFORM_BOOTSTRAP_RELOC(rpnt, reloc_addr, symbol_addr, load_addr, sym); } +#endif // !defined(HAVE_RELATIVE_RELOCS) } } #endif Index: ldso/ldso/i386/dl-startup.h =================================================================== --- ldso/ldso/i386/dl-startup.h (revision 24692) +++ ldso/ldso/i386/dl-startup.h (working copy) @@ -39,6 +39,9 @@ * do something a little more subtle here. */ #define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long*) & ARGS)+1) +/* The linker supports relative relocations. */ +#define HAVE_RELATIVE_RELOCS + /* Handle relocation of the symbols in the dynamic loader. */ static __always_inline void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr, _______________________________________________ uClibc mailing list uClibc@uclibc.org http://lists.busybox.net/mailman/listinfo/uclibc