|
@@ -1067,7 +1067,11 @@ int dladdr(const void *__address, Dl_info * __info)
|
|
|
ElfW(Addr) symbol_addr;
|
|
|
|
|
|
symbol_addr = (ElfW(Addr)) DL_RELOC_ADDR(pelf->loadaddr, symtab[si].st_value);
|
|
|
- if (symbol_addr <= (ElfW(Addr))__address && (!sf || sa < symbol_addr)) {
|
|
|
+ if ((symtab[si].st_shndx != SHN_UNDEF
|
|
|
+ || symtab[si].st_value != 0)
|
|
|
+ && ELF_ST_TYPE(symtab[si].st_info) != STT_TLS
|
|
|
+ && DL_ADDR_SYM_MATCH(symbol_addr, &symtab[si], sa,
|
|
|
+ (ElfW(Addr)) __address)) {
|
|
|
sa = symbol_addr;
|
|
|
sn = si;
|
|
|
sf = 1;
|
|
@@ -1083,7 +1087,11 @@ int dladdr(const void *__address, Dl_info * __info)
|
|
|
ElfW(Addr) symbol_addr;
|
|
|
|
|
|
symbol_addr = (ElfW(Addr)) DL_RELOC_ADDR(pelf->loadaddr, symtab[si].st_value);
|
|
|
- if (symbol_addr <= (ElfW(Addr))__address && (!sf || sa < symbol_addr)) {
|
|
|
+ if ((symtab[si].st_shndx != SHN_UNDEF
|
|
|
+ || symtab[si].st_value != 0)
|
|
|
+ && ELF_ST_TYPE(symtab[si].st_info) != STT_TLS
|
|
|
+ && DL_ADDR_SYM_MATCH(symbol_addr, &symtab[si], sa,
|
|
|
+ (ElfW(Addr)) __address)) {
|
|
|
sa = symbol_addr;
|
|
|
sn = si;
|
|
|
sf = 1;
|