linker: remove STB_LOCAL hack
The ARM static linker wasn't properly handling __exidx_start and __exidx_end symbols. Now that the static linker has been fixed, we don't need the dynamic linker to work around this problem. Change-Id: Ic567122b6c7746cc016795e2befba2c6bd7c0478
This commit is contained in:
parent
048822d6af
commit
61ff83475c
@ -408,33 +408,6 @@ static Elf32_Sym *_elf_lookup(soinfo *si, unsigned hash, const char *name)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Essentially the same method as _elf_lookup() above, but only
|
|
||||||
* searches for LOCAL symbols
|
|
||||||
*/
|
|
||||||
static Elf32_Sym *_elf_lookup_local(soinfo *si, unsigned hash, const char *name)
|
|
||||||
{
|
|
||||||
Elf32_Sym *symtab = si->symtab;
|
|
||||||
const char *strtab = si->strtab;
|
|
||||||
unsigned n = hash % si->nbucket;;
|
|
||||||
|
|
||||||
TRACE_TYPE(LOOKUP, "%5d LOCAL SEARCH %s in %s@0x%08x %08x %d\n", pid,
|
|
||||||
name, si->name, si->base, hash, hash % si->nbucket);
|
|
||||||
for(n = si->bucket[hash % si->nbucket]; n != 0; n = si->chain[n]){
|
|
||||||
Elf32_Sym *s = symtab + n;
|
|
||||||
if (strcmp(strtab + s->st_name, name)) continue;
|
|
||||||
if (ELF32_ST_BIND(s->st_info) != STB_LOCAL) continue;
|
|
||||||
/* no section == undefined */
|
|
||||||
if(s->st_shndx == 0) continue;
|
|
||||||
|
|
||||||
TRACE_TYPE(LOOKUP, "%5d FOUND LOCAL %s in %s (%08x) %d\n", pid,
|
|
||||||
name, si->name, s->st_value, s->st_size);
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned elfhash(const char *_name)
|
static unsigned elfhash(const char *_name)
|
||||||
{
|
{
|
||||||
const unsigned char *name = (const unsigned char *) _name;
|
const unsigned char *name = (const unsigned char *) _name;
|
||||||
@ -458,16 +431,6 @@ _do_lookup(soinfo *si, const char *name, unsigned *base)
|
|||||||
soinfo *lsi = si;
|
soinfo *lsi = si;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* If we are trying to find a symbol for the linker itself, look
|
|
||||||
* for LOCAL symbols first. Avoid using LOCAL symbols for other
|
|
||||||
* shared libraries until we have a better understanding of what
|
|
||||||
* might break by doing so. */
|
|
||||||
if (si->flags & FLAG_LINKER) {
|
|
||||||
s = _elf_lookup_local(si, elf_hash, name);
|
|
||||||
if(s != NULL)
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Look for symbols in the local scope (the object who is
|
/* Look for symbols in the local scope (the object who is
|
||||||
* searching). This happens with C++ templates on i386 for some
|
* searching). This happens with C++ templates on i386 for some
|
||||||
* reason.
|
* reason.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user