[uClibc-cvs] CVS uClibc/ldso/ldso/sh64

CVS User jocke jocke at codepoet.org
Wed Nov 10 15:27:24 UTC 2004


Update of /var/cvs/uClibc/ldso/ldso/sh64
In directory nail:/tmp/cvs-serv473/ldso/sh64

Modified Files:
	elfinterp.c 
Log Message:
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.


--- /var/cvs/uClibc/ldso/ldso/sh64/elfinterp.c	2004/09/23 07:00:43	1.7
+++ /var/cvs/uClibc/ldso/ldso/sh64/elfinterp.c	2004/11/10 15:27:23	1.8
@@ -190,7 +190,7 @@
 
 
 	/* Get the address of the GOT entry */
-	new_addr = _dl_find_hash(symname, tpnt->symbol_scope, ELF_RTYPE_CLASS_PLT);
+	new_addr = _dl_find_hash(symname, tpnt->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT);
 	if (unlikely(!new_addr)) {
 		_dl_dprintf(2, "%s: can't resolve symbol '%s'\n",
 			    _dl_progname, symname);
@@ -305,7 +305,7 @@
 	if (symtab_index) {
 		int stb;
 
-		symbol_addr = (unsigned long)_dl_find_hash(symname, scope,
+		symbol_addr = (unsigned long)_dl_find_hash(symname, scope, tpnt,
 							   elf_machine_type_class(reloc_type));
 
 		/*
@@ -445,59 +445,6 @@
 	return 0;
 }
 
-/* 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 */
-static int _dl_do_copy_reloc(struct elf_resolve *tpnt, struct dyn_elf *scope,
-		       ELF_RELOC *rpnt, Elf32_Sym *symtab, char *strtab)
-{
-        int reloc_type;
-	int symtab_index;
-	unsigned long *reloc_addr;
-	unsigned long symbol_addr;
-	char *symname;
-	int goof = 0;
-	return 0; /* disable now, remove later */
-	reloc_addr = (unsigned long *)(intptr_t)
-		(tpnt->loadaddr + (unsigned long)rpnt->r_offset);
-	reloc_type = ELF32_R_TYPE(rpnt->r_info);
-
-	if (reloc_type != R_SH_COPY)
-		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(symname, scope, ELF_RTYPE_CLASS_COPY);
-
-		if (!symbol_addr)
-			goof++;
-	}
-
-	if (!goof) {
-#ifdef __SUPPORT_LD_DEBUG__
-	        if (_dl_debug_move)
-			_dl_dprintf(_dl_debug_file,
-				    "\n%s move %x bytes from %x to %x",
-				    symname, symtab[symtab_index].st_size,
-				    symbol_addr, symtab[symtab_index].st_value);
-#endif
-
-		_dl_memcpy((char *)symtab[symtab_index].st_value,
-			   (char *)symbol_addr, symtab[symtab_index].st_size);
-	}
-
-	return goof;
-}
-
 void _dl_parse_lazy_relocation_information(struct dyn_elf *rpnt,
 	unsigned long rel_addr, unsigned long rel_size)
 {
@@ -509,10 +456,3 @@
 {
 	return _dl_parse(rpnt->dyn, rpnt->dyn->symbol_scope, rel_addr, rel_size, _dl_do_reloc);
 }
-
-int _dl_parse_copy_information(struct dyn_elf *rpnt,
-	unsigned long rel_addr, unsigned long rel_size)
-{
-	return _dl_parse(rpnt->dyn, rpnt->next, rel_addr, rel_size, _dl_do_copy_reloc);
-}
-



More information about the uClibc-cvs mailing list