svn commit: trunk/uClibc/ldso/ldso: powerpc

jocke at uclibc.org jocke at uclibc.org
Sat Oct 29 13:46:28 UTC 2005


Author: jocke
Date: 2005-10-29 06:46:25 -0700 (Sat, 29 Oct 2005)
New Revision: 11985

Log:
Hopefully fix the bug Oleg reported in http://uclibc.org/lists/uclibc/2005-October/012809.html
This will only fix powerpc. Should be easy to fix the other arches.


Modified:
   trunk/uClibc/ldso/ldso/dl-elf.c
   trunk/uClibc/ldso/ldso/ldso.c
   trunk/uClibc/ldso/ldso/powerpc/elfinterp.c


Changeset:
Modified: trunk/uClibc/ldso/ldso/dl-elf.c
===================================================================
--- trunk/uClibc/ldso/ldso/dl-elf.c	2005-10-29 10:18:42 UTC (rev 11984)
+++ trunk/uClibc/ldso/ldso/dl-elf.c	2005-10-29 13:46:25 UTC (rev 11985)
@@ -631,7 +631,9 @@
 	ElfW(Addr) reloc_addr;
 
 	if (rpnt->next)
-		goof += _dl_fixup(rpnt->next, now_flag);
+		goof = _dl_fixup(rpnt->next, now_flag);
+	if (goof)
+		return goof;
 	tpnt = rpnt->dyn;
 
 	if(!(tpnt->init_flag & RELOCS_DONE)) 

Modified: trunk/uClibc/ldso/ldso/ldso.c
===================================================================
--- trunk/uClibc/ldso/ldso/ldso.c	2005-10-29 10:18:42 UTC (rev 11984)
+++ trunk/uClibc/ldso/ldso/ldso.c	2005-10-29 13:46:25 UTC (rev 11985)
@@ -122,7 +122,7 @@
 	ElfW(Phdr) *ppnt;
 	ElfW(Dyn) *dpnt;
 	char *lpntstr;
-	int i, goof = 0, unlazy = 0, trace_loaded_objects = 0;
+	int i, unlazy = 0, trace_loaded_objects = 0;
 	struct dyn_elf *rpnt;
 	struct elf_resolve *tcurr;
 	struct elf_resolve *tpnt1;
@@ -724,7 +724,8 @@
 	 * order so that COPY directives work correctly.
 	 */
 	if (_dl_symbol_tables)
-		goof += _dl_fixup(_dl_symbol_tables, unlazy);
+		if (_dl_fixup(_dl_symbol_tables, unlazy))
+			_dl_exit(-1);
 
 	for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) {
 		if (tpnt->relro_size)

Modified: trunk/uClibc/ldso/ldso/powerpc/elfinterp.c
===================================================================
--- trunk/uClibc/ldso/ldso/powerpc/elfinterp.c	2005-10-29 10:18:42 UTC (rev 11984)
+++ trunk/uClibc/ldso/ldso/powerpc/elfinterp.c	2005-10-29 13:46:25 UTC (rev 11985)
@@ -138,7 +138,7 @@
 	finaladdr = (Elf32_Addr) _dl_find_hash(symname,
 			tpnt->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT);
 	if (unlikely(!finaladdr)) {
-		_dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname);
+		_dl_dprintf(2, "%s: can't resolve symbol '%s' in lib '%s'.\n", _dl_progname, symname, tpnt->libname);
 		_dl_exit(1);
 	};
 	finaladdr += this_reloc->r_addend;
@@ -379,15 +379,15 @@
 		{
 		        int reloc_type = ELF32_R_TYPE(rpnt->r_info);
 #if defined (__SUPPORT_LD_DEBUG__)
-			_dl_dprintf(2, "can't handle reloc type %s\n ", _dl_reltypes(reloc_type));
+			_dl_dprintf(2, "can't handle reloc type '%s' in lib '%s'\n", _dl_reltypes(reloc_type), tpnt->libname);
 #else
-			_dl_dprintf(2, "can't handle reloc type %x\n", reloc_type);
+			_dl_dprintf(2, "can't handle reloc type %x in lib '%s'\n", reloc_type, tpnt->libname);
 #endif
-			_dl_exit(-res);
+			return res;
 		}
 		if (unlikely(res >0))
 		{
-			_dl_dprintf(2, "can't resolve symbol\n");
+			_dl_dprintf(2, "can't resolve symbol in lib '%s'.\n", tpnt->libname);
 			return res;
 		}
 	  }




More information about the uClibc-cvs mailing list