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