Hi,
I moved the HAVE_RELATIVE_RELOCS to the dl-sysdep.h.
Also found there were warnings of non used variables due to the
ifdef'ed block. The rest is the same.


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 <[email protected]>
---
Index: ldso/ldso/arm/dl-sysdep.h
===================================================================
--- ldso/ldso/arm/dl-sysdep.h   (revision 24692)
+++ ldso/ldso/arm/dl-sysdep.h   (working copy)
@@ -52,6 +52,9 @@
 /* Used for error messages */
 #define ELF_TARGET "ARM"
 
+/* The linker supports relative relocations */
+#define HAVE_RELATIVE_RELOCS
+
 struct elf_resolve;
 unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
 
Index: ldso/ldso/dl-startup.c
===================================================================
--- ldso/ldso/dl-startup.c      (revision 24692)
+++ ldso/ldso/dl-startup.c      (working copy)
@@ -233,12 +233,6 @@
 # define INDX_MAX 2
 #endif
                for (indx = 0; indx < INDX_MAX; indx++) {
-                       unsigned int i;
-                       unsigned long *reloc_addr;
-                       unsigned long symbol_addr;
-                       int symtab_index;
-                       ElfW(Sym) *sym;
-                       ELF_RELOC *rpnt;
                        unsigned long rel_addr, rel_size;
                        ElfW(Word) relative_count = 
tpnt->dynamic_info[DT_RELCONT_IDX];
 
@@ -250,41 +244,52 @@
                        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);
                        }
 
-                       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);
-                               symtab_index = ELF_R_SYM(rpnt->r_info);
-                               symbol_addr = 0;
-                               sym = NULL;
-                               if (symtab_index) {
-                                       char *strtab;
-                                       ElfW(Sym) *symtab;
+                       /* 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)
+                       {
+                               ELF_RELOC *rpnt;
+                               unsigned int i;
+                               ElfW(Sym) *sym;
+                               unsigned long symbol_addr;
+                               int symtab_index;
+                               unsigned long *reloc_addr;
+                               
+                               /* 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);
+                                       symtab_index = ELF_R_SYM(rpnt->r_info);
+                                       symbol_addr = 0;
+                                       sym = NULL;
+                                       if (symtab_index) {
+                                               char *strtab;
+                                               ElfW(Sym) *symtab;
 
-                                       symtab = (ElfW(Sym) *) 
tpnt->dynamic_info[DT_SYMTAB];
-                                       strtab = (char *) 
tpnt->dynamic_info[DT_STRTAB];
-                                       sym = &symtab[symtab_index];
-                                       symbol_addr = (unsigned long) 
DL_RELOC_ADDR(load_addr, sym->st_value);
+                                               symtab = (ElfW(Sym) *) 
tpnt->dynamic_info[DT_SYMTAB];
+                                               strtab = (char *) 
tpnt->dynamic_info[DT_STRTAB];
+                                               sym = &symtab[symtab_index];
+                                               symbol_addr = (unsigned long) 
DL_RELOC_ADDR(load_addr, sym->st_value);
 #if !defined(EARLY_STDERR_SPECIAL)
-                                       SEND_STDERR_DEBUG("relocating symbol: 
");
-                                       SEND_STDERR_DEBUG(strtab + 
sym->st_name);
-                                       SEND_STDERR_DEBUG("\n");
+                                               SEND_STDERR_DEBUG("relocating 
symbol: ");
+                                               SEND_STDERR_DEBUG(strtab + 
sym->st_name);
+                                               SEND_STDERR_DEBUG("\n");
 #endif
-                               } else {
-                                       SEND_STDERR_DEBUG("relocating unknown 
symbol\n");
+                                       } else {
+                                               SEND_STDERR_DEBUG("relocating 
unknown symbol\n");
+                                       }
+                                       /* Use this machine-specific macro to 
perform the actual relocation.  */
+                                       PERFORM_BOOTSTRAP_RELOC(rpnt, 
reloc_addr, symbol_addr, load_addr, sym);
                                }
-                               /* 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-sysdep.h
===================================================================
--- ldso/ldso/i386/dl-sysdep.h  (revision 24692)
+++ ldso/ldso/i386/dl-sysdep.h  (working copy)
@@ -22,6 +22,9 @@
 /* Used for error messages */
 #define ELF_TARGET "386"
 
+/* The linker supports relative relocations */
+#define HAVE_RELATIVE_RELOCS
+
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int 
reloc_entry);
 
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to