summaryrefslogtreecommitdiff
path: root/ldso
diff options
context:
space:
mode:
Diffstat (limited to 'ldso')
-rw-r--r--ldso/ldso/arm/elfinterp.c15
-rw-r--r--ldso/ldso/dl-startup.c33
-rw-r--r--ldso/ldso/i386/elfinterp.c13
-rw-r--r--ldso/ldso/mips/elfinterp.c6
-rw-r--r--ldso/ldso/powerpc/elfinterp.c13
5 files changed, 26 insertions, 54 deletions
diff --git a/ldso/ldso/arm/elfinterp.c b/ldso/ldso/arm/elfinterp.c
index 6b43464b3..93ae35e8b 100644
--- a/ldso/ldso/arm/elfinterp.c
+++ b/ldso/ldso/arm/elfinterp.c
@@ -188,8 +188,13 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
Elf32_Sym *symtab;
ELF_RELOC *rpnt;
int symtab_index;
- /* Now parse the relocation information */
+ /* When the dynamic linker bootstrapped itself, it resolved some symbols.
+ Make sure we do not do them again */
+ if (tpnt->libtype == program_interpreter)
+ return 0;
+
+ /* Now parse the relocation information */
rpnt = (ELF_RELOC *) (rel_addr + tpnt->loadaddr);
rel_size = rel_size / sizeof(ELF_RELOC);
@@ -201,14 +206,6 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
symtab_index = ELF32_R_SYM(rpnt->r_info);
- /* When the dynamic linker bootstrapped itself, it resolved some symbols.
- Make sure we do not do them again */
- if (!symtab_index && tpnt->libtype == program_interpreter)
- continue;
- if (symtab_index && tpnt->libtype == program_interpreter &&
- _dl_symbol(strtab + symtab[symtab_index].st_name))
- continue;
-
#if defined (__SUPPORT_LD_DEBUG__)
debug_sym(symtab,strtab,symtab_index);
debug_reloc(symtab,strtab,rpnt);
diff --git a/ldso/ldso/dl-startup.c b/ldso/ldso/dl-startup.c
index f97619af3..5d1d5a67e 100644
--- a/ldso/ldso/dl-startup.c
+++ b/ldso/ldso/dl-startup.c
@@ -490,7 +490,7 @@ found_got:
unsigned long symbol_addr;
int symtab_index;
unsigned long rel_addr, rel_size;
-
+ Elf32_Sym *sym;
rel_addr = (indx ? tpnt->dynamic_info[DT_JMPREL] : tpnt->
dynamic_info[DT_RELOC_TABLE_ADDR]);
@@ -506,43 +506,24 @@ found_got:
reloc_addr = (unsigned long *) (load_addr + (unsigned long) rpnt->r_offset);
symtab_index = ELF32_R_SYM(rpnt->r_info);
symbol_addr = 0;
+ sym = NULL;
if (symtab_index) {
char *strtab;
- char *symname;
Elf32_Sym *symtab;
symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + load_addr);
strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + load_addr);
- symname = strtab + symtab[symtab_index].st_name;
-
- /* We only do a partial dynamic linking right now. The user
- is not supposed to define any symbols that start with a
- '_dl', so we can do this with confidence. */
- if (!symname || !_dl_symbol(symname)) {
- continue;
- }
+ sym = &symtab[symtab_index];
+ symbol_addr = load_addr + sym->st_value;
- symbol_addr = load_addr + symtab[symtab_index].st_value;
-
- if (!symbol_addr) {
- /* This will segfault - you cannot call a function until
- * we have finished the relocations.
- */
- SEND_STDERR("ELF dynamic loader - unable to self-bootstrap - symbol ");
- SEND_STDERR(symname);
- SEND_STDERR(" undefined.\n");
- goof++;
- }
#ifdef __SUPPORT_LD_DEBUG_EARLY__
SEND_STDERR("relocating symbol: ");
- SEND_STDERR(symname);
+ SEND_STDERR(strtab + sym->st_name);
SEND_STDERR("\n");
#endif
- PERFORM_BOOTSTRAP_RELOC(rpnt, reloc_addr, symbol_addr, load_addr, &symtab[symtab_index]);
- } else {
- /* Use this machine-specific macro to perform the actual relocation. */
- PERFORM_BOOTSTRAP_RELOC(rpnt, reloc_addr, symbol_addr, load_addr, NULL);
}
+ /* Use this machine-specific macro to perform the actual relocation. */
+ PERFORM_BOOTSTRAP_RELOC(rpnt, reloc_addr, symbol_addr, load_addr, sym);
}
}
diff --git a/ldso/ldso/i386/elfinterp.c b/ldso/ldso/i386/elfinterp.c
index a80dcad54..dca5fe54d 100644
--- a/ldso/ldso/i386/elfinterp.c
+++ b/ldso/ldso/i386/elfinterp.c
@@ -183,6 +183,11 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
ELF_RELOC *rpnt;
int symtab_index;
+ /* When the dynamic linker bootstrapped itself, it resolved some symbols.
+ Make sure we do not do them again */
+ if (tpnt->libtype == program_interpreter)
+ return 0;
+
/* Now parse the relocation information */
rpnt = (ELF_RELOC *)(intptr_t) (rel_addr + tpnt->loadaddr);
rel_size = rel_size / sizeof(ELF_RELOC);
@@ -195,14 +200,6 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
symtab_index = ELF32_R_SYM(rpnt->r_info);
- /* When the dynamic linker bootstrapped itself, it resolved some symbols.
- Make sure we do not do them again */
- if (!symtab_index && tpnt->libtype == program_interpreter)
- continue;
- if (symtab_index && tpnt->libtype == program_interpreter &&
- _dl_symbol(strtab + symtab[symtab_index].st_name))
- continue;
-
#if defined (__SUPPORT_LD_DEBUG__)
debug_sym(symtab,strtab,symtab_index);
debug_reloc(symtab,strtab,rpnt);
diff --git a/ldso/ldso/mips/elfinterp.c b/ldso/ldso/mips/elfinterp.c
index 0b6a68005..dfbc88fdc 100644
--- a/ldso/ldso/mips/elfinterp.c
+++ b/ldso/ldso/mips/elfinterp.c
@@ -187,6 +187,9 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,
unsigned long old_val=0;
#endif
+ if (tpnt->libtype == program_interpreter)
+ return 0;
+
/* Now parse the relocation information */
rel_size = rel_size / sizeof(Elf32_Rel);
rpnt = (Elf32_Rel *) (rel_addr + tpnt->loadaddr);
@@ -202,9 +205,6 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,
symtab_index = ELF32_R_SYM(rpnt->r_info);
symbol_addr = 0;
- if (!symtab_index && tpnt->libtype == program_interpreter)
- continue;
-
#if defined (__SUPPORT_LD_DEBUG__)
debug_sym(symtab,strtab,symtab_index);
debug_reloc(symtab,strtab,rpnt);
diff --git a/ldso/ldso/powerpc/elfinterp.c b/ldso/ldso/powerpc/elfinterp.c
index e67128b2a..0cecf7dc8 100644
--- a/ldso/ldso/powerpc/elfinterp.c
+++ b/ldso/ldso/powerpc/elfinterp.c
@@ -443,6 +443,11 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
ELF_RELOC *rpnt;
int symtab_index;
+ /* When the dynamic linker bootstrapped itself, it resolved some symbols.
+ Make sure we do not do them again */
+ if (tpnt->libtype == program_interpreter)
+ return 0;
+
/* Now parse the relocation information */
rpnt = (ELF_RELOC *)(intptr_t) (rel_addr + tpnt->loadaddr);
rel_size = rel_size / sizeof(ELF_RELOC);
@@ -455,14 +460,6 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
symtab_index = ELF32_R_SYM(rpnt->r_info);
- /* When the dynamic linker bootstrapped itself, it resolved some symbols.
- Make sure we do not do them again */
- if (!symtab_index && tpnt->libtype == program_interpreter)
- continue;
- if (symtab_index && tpnt->libtype == program_interpreter &&
- _dl_symbol(strtab + symtab[symtab_index].st_name))
- continue;
-
#if defined (__SUPPORT_LD_DEBUG__)
debug_sym(symtab,strtab,symtab_index);
debug_reloc(symtab,strtab,rpnt);