Skip to content
Snippets Groups Projects
Commit 84d9219e authored by Vivek Das Mohapatra's avatar Vivek Das Mohapatra
Browse files

We need to reinstate the maybe-base-offset-pointer calculation hack

Some ElfW(Rel[a]) d_ptr items are pre-calculated form base, others not.
parent 7dff05a5
No related branches found
No related tags found
1 merge request!311Build capsule-capture-libs from a bundled copy of libcapsule
......@@ -607,7 +607,7 @@ process_pt_dynamic (void *start,
break;
case DT_SYMTAB:
symtab = (const void *) entry->d_un.d_ptr;
symtab = (const void *) fix_addr( base, entry->d_un.d_ptr );
DEBUG( DEBUG_ELF, "symtab is %p", symtab );
break;
......@@ -617,7 +617,7 @@ process_pt_dynamic (void *start,
DEBUG( DEBUG_ELF, "processing DT_RELA section" );
if( relasz == -1 )
relasz = find_value( base, start, DT_RELASZ );
relstart = (void *) entry->d_un.d_ptr;
relstart = (void *) fix_addr( base, entry->d_un.d_ptr );
process_rela( relstart, relasz, strtab, symtab, base, data );
}
else
......@@ -652,7 +652,7 @@ process_pt_dynamic (void *start,
{
DEBUG( DEBUG_ELF|DEBUG_RELOCS,
"processing DT_JMPREL/DT_REL section" );
relstart = (void *) entry->d_un.d_ptr;
relstart = (void *) fix_addr( base, entry->d_un.d_ptr );
DEBUG( DEBUG_ELF, " -> REL antry #0 at %p", relstart );
ret = process_rel( relstart, jmprelsz, strtab,
symtab, base, data );
......@@ -669,7 +669,7 @@ process_pt_dynamic (void *start,
{
DEBUG( DEBUG_ELF,
"processing DT_JMPREL/DT_RELA section" );
relstart = (void *) entry->d_un.d_ptr;
relstart = (void *) fix_addr( base, entry->d_un.d_ptr );
ret = process_rela( relstart, jmprelsz, strtab,
symtab, base, data );
}
......
......@@ -31,6 +31,12 @@ unsigned long debug_flags;
// linker, or we may beed to adjust it by the value of base ourselves:
// this is effectively private linker information and there's no
// hard and fast rule:
ElfW(Addr)
fix_addr (ElfW(Addr) base, ElfW(Addr) addr)
{
return ( addr < base ) ? base + addr : addr;
}
const ElfW(Dyn) *
find_dyn (ElfW(Addr) base, void *start, int what)
{
......@@ -71,16 +77,19 @@ const char *
find_strtab (ElfW(Addr) base, void *start, int *siz)
{
ElfW(Dyn) *entry;
const char *rval;
const char *tab = NULL;
ElfW(Addr) stab = NULL;
for( entry = start + base; entry->d_tag != DT_NULL; entry++ )
if( entry->d_tag == DT_STRTAB )
tab = (const char *) entry->d_un.d_ptr;
stab = entry->d_un.d_ptr;
else if( entry->d_tag == DT_STRSZ )
*siz = entry->d_un.d_val;
return tab;
rval = (const char *) ( (stab < base) ? base + stab : stab );
return rval;
}
const ElfW(Sym) *
......
......@@ -47,6 +47,7 @@ char *safe_strncpy (char *dest, const char *src, size_t n);
int resolve_link (const char *prefix, char *path, char *dir);
int soname_matches_path (const char *soname, const char *path);
ElfW(Addr) fix_addr (ElfW(Addr) base, ElfW(Addr) addr);
const ElfW(Dyn) * find_dyn (ElfW(Addr) base, void *start, int what);
int find_value (ElfW(Addr) base, void *start, int what);
ElfW(Addr) find_ptr (ElfW(Addr) base, void *start, int what);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment