|
@@ -119,6 +119,7 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
|
|
|
char *new_addr;
|
|
|
char **got_addr;
|
|
|
unsigned long instr_addr;
|
|
|
+ char *symname;
|
|
|
|
|
|
rel_addr = (char *) (tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr);
|
|
|
|
|
@@ -128,6 +129,7 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
|
|
|
|
|
|
symtab = (Elf32_Sym *)(intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
|
|
|
strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
|
|
|
+ symname= strtab + symtab[symtab_index].st_name;
|
|
|
|
|
|
if (reloc_type != R_386_JMP_SLOT) {
|
|
|
_dl_dprintf(2, "%s: Incorrect relocation type in jump relocations\n",
|
|
@@ -141,11 +143,13 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
|
|
|
got_addr = (char **) instr_addr;
|
|
|
|
|
|
/* Get the address of the GOT entry */
|
|
|
- new_addr = _dl_find_hash(strtab + symtab[symtab_index].st_name,
|
|
|
- tpnt->symbol_scope, tpnt, resolver);
|
|
|
+ new_addr = _dl_find_hash(symname, tpnt->symbol_scope, tpnt, resolver);
|
|
|
if (!new_addr) {
|
|
|
- _dl_dprintf(2, "%s: can't resolve symbol '%s'\n",
|
|
|
- _dl_progname, strtab + symtab[symtab_index].st_name);
|
|
|
+ new_addr = _dl_find_hash(symname, NULL, NULL, resolver);
|
|
|
+ if (new_addr) {
|
|
|
+ return (unsigned long) new_addr;
|
|
|
+ }
|
|
|
+ _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname);
|
|
|
_dl_exit(1);
|
|
|
}
|
|
|
|
|
@@ -154,8 +158,7 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
|
|
|
{
|
|
|
if (_dl_debug_bindings)
|
|
|
{
|
|
|
- _dl_dprintf(_dl_debug_file, "\nresolve function: %s",
|
|
|
- strtab + symtab[symtab_index].st_name);
|
|
|
+ _dl_dprintf(_dl_debug_file, "\nresolve function: %s", symname);
|
|
|
if(_dl_debug_detail) _dl_dprintf(_dl_debug_file,
|
|
|
"\n\tpatched %x ==> %x @ %x\n", *got_addr, new_addr, got_addr);
|
|
|
}
|
|
@@ -361,6 +364,7 @@ _dl_do_copy (struct elf_resolve *tpnt, struct dyn_elf *scope,
|
|
|
unsigned long *reloc_addr;
|
|
|
unsigned long symbol_addr;
|
|
|
int goof = 0;
|
|
|
+ char *symname;
|
|
|
|
|
|
reloc_addr = (unsigned long *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset);
|
|
|
reloc_type = ELF32_R_TYPE(rpnt->r_info);
|
|
@@ -368,20 +372,17 @@ _dl_do_copy (struct elf_resolve *tpnt, struct dyn_elf *scope,
|
|
|
return 0;
|
|
|
symtab_index = ELF32_R_SYM(rpnt->r_info);
|
|
|
symbol_addr = 0;
|
|
|
+ symname = strtab + symtab[symtab_index].st_name;
|
|
|
|
|
|
if (symtab_index) {
|
|
|
-
|
|
|
- symbol_addr = (unsigned long) _dl_find_hash(strtab +
|
|
|
- symtab[symtab_index].st_name, scope,
|
|
|
- NULL, copyrel);
|
|
|
+ symbol_addr = (unsigned long) _dl_find_hash(symname, scope, NULL, copyrel);
|
|
|
if (!symbol_addr) goof++;
|
|
|
}
|
|
|
if (!goof) {
|
|
|
#if defined (__SUPPORT_LD_DEBUG__)
|
|
|
if(_dl_debug_move)
|
|
|
_dl_dprintf(_dl_debug_file,"\n%s move %x bytes from %x to %x",
|
|
|
- strtab + symtab[symtab_index].st_name,
|
|
|
- symtab[symtab_index].st_size,
|
|
|
+ symname, symtab[symtab_index].st_size,
|
|
|
symbol_addr, symtab[symtab_index].st_value);
|
|
|
#endif
|
|
|
_dl_memcpy((char *) symtab[symtab_index].st_value,
|