diff options
Diffstat (limited to 'ldso/ldso/dl-startup.c')
-rw-r--r-- | ldso/ldso/dl-startup.c | 33 |
1 files changed, 7 insertions, 26 deletions
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); } } |