Hi,
I changed the define, and add check in the #else case for non relative
relocs which calls _dl_exit(14) (it was there before for some goof stuff,
but I'm not sure about the rules for the exit return value...).

I added ARCH_NEEDS_BOOTSTRAP_RELOCS to all archs except for arm, x86, 
powerpc and x86_64.

I also add change for the include/tls.h, I'm not sure why it is not
defined, however this kills many warnings for me. I'm ready to remove it :).


cheers,
jirka

---
Index: include/tls.h
===================================================================
--- include/tls.h       (revision 24692)
+++ include/tls.h       (working copy)
@@ -5,7 +5,7 @@
 
 #include_next <tls.h>
 
-#if USE_TLS && HAVE___THREAD \
+#if defined USE_TLS && HAVE___THREAD \
     && (!defined NOT_IN_libc || defined IS_IN_libpthread || defined 
IS_IN_librt)
 
 # define USE___THREAD 1
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,56 @@
                        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 
should be RELATIVE.  All archs 
+                          that need bootstrap relocations need to define 
ARCH_NEEDS_BOOTSTRAP_RELOCS. */
+#ifdef ARCH_NEEDS_BOOTSTRAP_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);
                        }
+#else /* ARCH_NEEDS_BOOTSTRAP_RELOCS */
+                       if (rel_size) {
+                               SEND_EARLY_STDERR("Cannot continue, found non 
relative relocs during the bootstrap.\n");
+                               _dl_exit(14);
+                       }
+#endif
                }
        }
 #endif
Index: ldso/ldso/sh64/dl-sysdep.h
===================================================================
--- ldso/ldso/sh64/dl-sysdep.h  (revision 24692)
+++ ldso/ldso/sh64/dl-sysdep.h  (working copy)
@@ -19,9 +19,13 @@
 /* Here we define the magic numbers that this dynamic loader should accept */
 #define MAGIC1 EM_SH
 #undef  MAGIC2
+
 /* Used for error messages */
 #define ELF_TARGET "sh64"
 
+/* Need bootstrap relocations */
+#define ARCH_NEEDS_BOOTSTRAP_RELOCS
+
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int 
reloc_entry);
 
Index: ldso/ldso/m68k/dl-sysdep.h
===================================================================
--- ldso/ldso/m68k/dl-sysdep.h  (revision 24692)
+++ ldso/ldso/m68k/dl-sysdep.h  (working copy)
@@ -22,6 +22,9 @@
 /* Used for error messages */
 #define ELF_TARGET "m68k"
 
+/* Need bootstrap relocations */
+#define ARCH_NEEDS_BOOTSTRAP_RELOCS
+
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver (struct elf_resolve *, int);
 
Index: ldso/ldso/frv/dl-sysdep.h
===================================================================
--- ldso/ldso/frv/dl-sysdep.h   (revision 24692)
+++ ldso/ldso/frv/dl-sysdep.h   (working copy)
@@ -40,6 +40,9 @@
 /* Used for error messages */
 #define ELF_TARGET "FR-V"
 
+/* Need bootstrap relocations */
+#define ARCH_NEEDS_BOOTSTRAP_RELOCS
+
 struct elf_resolve;
 
 struct funcdesc_value
Index: ldso/ldso/avr32/dl-sysdep.h
===================================================================
--- ldso/ldso/avr32/dl-sysdep.h (revision 24692)
+++ ldso/ldso/avr32/dl-sysdep.h (working copy)
@@ -44,6 +44,9 @@
 /* Used for error messages */
 #define ELF_TARGET "AVR32"
 
+/* Need bootstrap relocations */
+#define ARCH_NEEDS_BOOTSTRAP_RELOCS
+
 unsigned long _dl_linux_resolver(unsigned long got_offset, unsigned long *got);
 
 #define elf_machine_type_class(type)                           \
Index: ldso/ldso/cris/dl-sysdep.h
===================================================================
--- ldso/ldso/cris/dl-sysdep.h  (revision 24692)
+++ ldso/ldso/cris/dl-sysdep.h  (working copy)
@@ -15,6 +15,9 @@
 #undef MAGIC2
 #define ELF_TARGET "CRIS"
 
+/* Need bootstrap relocations */
+#define ARCH_NEEDS_BOOTSTRAP_RELOCS
+
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int 
reloc_entry);
 
Index: ldso/ldso/xtensa/dl-sysdep.h
===================================================================
--- ldso/ldso/xtensa/dl-sysdep.h        (revision 24692)
+++ ldso/ldso/xtensa/dl-sysdep.h        (working copy)
@@ -73,6 +73,9 @@
 /* Used for error messages. */
 #define ELF_TARGET "Xtensa"
 
+/* Need bootstrap relocations */
+#define ARCH_NEEDS_BOOTSTRAP_RELOCS
+
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver (struct elf_resolve *, int);
 
Index: ldso/ldso/sparc/dl-sysdep.h
===================================================================
--- ldso/ldso/sparc/dl-sysdep.h (revision 24692)
+++ ldso/ldso/sparc/dl-sysdep.h (working copy)
@@ -40,6 +40,9 @@
 /* Used for error messages */
 #define ELF_TARGET "sparc"
 
+/* Need bootstrap relocations */
+#define ARCH_NEEDS_BOOTSTRAP_RELOCS
+
 struct elf_resolve;
 unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
 
Index: ldso/ldso/mips/dl-sysdep.h
===================================================================
--- ldso/ldso/mips/dl-sysdep.h  (revision 24692)
+++ ldso/ldso/mips/dl-sysdep.h  (working copy)
@@ -149,6 +149,8 @@
 /* Used for error messages */
 #define ELF_TARGET "MIPS"
 
+/* Need bootstrap relocations */
+#define ARCH_NEEDS_BOOTSTRAP_RELOCS
 
 unsigned long __dl_runtime_resolve(unsigned long sym_index,
        unsigned long old_gpreg);
Index: ldso/ldso/sh/dl-sysdep.h
===================================================================
--- ldso/ldso/sh/dl-sysdep.h    (revision 24692)
+++ ldso/ldso/sh/dl-sysdep.h    (working copy)
@@ -22,6 +22,9 @@
 /* Used for error messages */
 #define ELF_TARGET "sh"
 
+/* Need bootstrap relocations */
+#define ARCH_NEEDS_BOOTSTRAP_RELOCS
+
 struct elf_resolve;
 extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int 
reloc_entry);
 
Index: ldso/ldso/bfin/dl-sysdep.h
===================================================================
--- ldso/ldso/bfin/dl-sysdep.h  (revision 24692)
+++ ldso/ldso/bfin/dl-sysdep.h  (working copy)
@@ -56,6 +56,9 @@
 /* Used for error messages */
 #define ELF_TARGET "BFIN"
 
+/* Need bootstrap relocations */
+#define ARCH_NEEDS_BOOTSTRAP_RELOCS
+
 struct elf_resolve;
 
 struct funcdesc_value
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to