diff options
Diffstat (limited to 'ldso')
-rw-r--r-- | ldso/ldso/arm/elfinterp.c | 15 | ||||
-rw-r--r-- | ldso/ldso/dl-startup.c | 33 | ||||
-rw-r--r-- | ldso/ldso/i386/elfinterp.c | 13 | ||||
-rw-r--r-- | ldso/ldso/mips/elfinterp.c | 6 | ||||
-rw-r--r-- | ldso/ldso/powerpc/elfinterp.c | 13 |
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); |