From 0038f6a2297be2b66a0177bc74b468dddb0a89fa Mon Sep 17 00:00:00 2001 From: Joakim Tjernlund Date: Wed, 10 Nov 2004 15:27:26 +0000 Subject: Add RTLD_LOCAL support for dlopened libs. Reported by Andrew de Quincey, who has been most helpful getting this sorted out, thanks. Thanks also to Peter Mazinger who did alot of testing. Removed all traces of dl_parse_copy_information() since it is no longer used. --- ldso/ldso/m68k/elfinterp.c | 64 ++-------------------------------------------- 1 file changed, 2 insertions(+), 62 deletions(-) (limited to 'ldso/ldso/m68k') diff --git a/ldso/ldso/m68k/elfinterp.c b/ldso/ldso/m68k/elfinterp.c index dc5713422..3b2f13b48 100644 --- a/ldso/ldso/m68k/elfinterp.c +++ b/ldso/ldso/m68k/elfinterp.c @@ -98,7 +98,7 @@ unsigned int _dl_linux_resolver (int dummy1, int dummy2, /* Get the address of the GOT entry. */ new_addr = _dl_find_hash (strtab + symtab[symtab_index].st_name, - tpnt->symbol_scope, ELF_RTYPE_CLASS_PLT); + tpnt->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT); if (unlikely(!new_addr)) { _dl_dprintf (2, "%s: can't resolve symbol '%s'\n", @@ -204,7 +204,7 @@ int _dl_parse_relocation_information(struct dyn_elf *rpnt, { symbol_addr = (unsigned int) _dl_find_hash (strtab + symtab[symtab_index].st_name, - tpnt->symbol_scope, + tpnt->symbol_scope, tpnt, elf_machine_type_class(reloc_type)); /* We want to allow undefined references to weak symbols - @@ -272,63 +272,3 @@ int _dl_parse_relocation_information(struct dyn_elf *rpnt, } return goof; } - -/* This is done as a separate step, because there are cases where - information is first copied and later initialized. This results in - the wrong information being copied. Someone at Sun was complaining about - a bug in the handling of _COPY by SVr4, and this may in fact be what he - was talking about. Sigh. */ - -/* No, there are cases where the SVr4 linker fails to emit COPY relocs - at all. */ - -int _dl_parse_copy_information(struct dyn_elf *xpnt, - unsigned long rel_addr, unsigned long rel_size) -{ - int i; - char *strtab; - int reloc_type; - int goof = 0; - Elf32_Sym *symtab; - Elf32_Rela *rpnt; - unsigned int *reloc_addr; - unsigned int symbol_addr; - struct elf_resolve *tpnt; - int symtab_index; - /* Now parse the relocation information */ - return 0; /* disable now, remove later */ - tpnt = xpnt->dyn; - - rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr); - rel_size = rel_size / sizeof (Elf32_Rela); - - symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] - + tpnt->loadaddr); - strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr); - - for (i = 0; i < rel_size; i++, rpnt++) - { - reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset); - reloc_type = ELF32_R_TYPE (rpnt->r_info); - if (reloc_type != R_68K_COPY) - continue; - symtab_index = ELF32_R_SYM (rpnt->r_info); - symbol_addr = 0; - if (symtab_index) - { - symbol_addr = (unsigned int) - _dl_find_hash (strtab + symtab[symtab_index].st_name, - xpnt->next, ELF_RTYPE_CLASS_COPY); - if (!symbol_addr) - { - _dl_dprintf (2, "%s: can't resolve symbol '%s'\n", - _dl_progname, strtab + symtab[symtab_index].st_name); - goof++; - } - } - if (!goof) - _dl_memcpy ((void *) symtab[symtab_index].st_value, (void *) symbol_addr, - symtab[symtab_index].st_size); - } - return goof; -} -- cgit v1.2.3