[PATCH] ldso - adding ARCH_NEEDS_BOOTSTRAP_RELOCS define

olsajiri at gmail.com olsajiri at gmail.com
Tue Jan 6 22:32:41 UTC 2009


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


More information about the uClibc mailing list