dwfl_module_addrsym.c revision 14c2d9e614cb0e3fd50ad757eaba686b37699580
16258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper/* Find debugging and symbol information for a module in libdwfl. 25083a70d3b64946fa47ea5766943a15a3ecc6891Mark Wielaard Copyright (C) 2005-2012 Red Hat, Inc. 3de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard This file is part of elfutils. 46258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper 5de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard This file is free software; you can redistribute it and/or modify 6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard it under the terms of either 76258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper 8de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard * the GNU Lesser General Public License as published by the Free 9de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard Software Foundation; either version 3 of the License, or (at 10de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard your option) any later version 11de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard 12de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard or 13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard 14de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard * the GNU General Public License as published by the Free 15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard Software Foundation; either version 2 of the License, or (at 16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard your option) any later version 17de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard 18de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard or both in parallel, as here. 19de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard 20de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard elfutils is distributed in the hope that it will be useful, but 216258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper WITHOUT ANY WARRANTY; without even the implied warranty of 226258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 236258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper General Public License for more details. 246258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper 25de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard You should have received copies of the GNU General Public License and 26de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard the GNU Lesser General Public License along with this program. If 27de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard not, see <http://www.gnu.org/licenses/>. */ 286258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper 296258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper#include "libdwflP.h" 306258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper 31b4d6f0f8064f2b706ea9035ef0393d8299671390Roland McGrath/* Returns the name of the symbol "closest" to ADDR. 32b4d6f0f8064f2b706ea9035ef0393d8299671390Roland McGrath Never returns symbols at addresses above ADDR. */ 33b4d6f0f8064f2b706ea9035ef0393d8299671390Roland McGrath 346258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepperconst char * 35819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaarddwfl_module_addrsym_elf (Dwfl_Module *mod, GElf_Addr addr, 36819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard GElf_Sym *closest_sym, GElf_Word *shndxp, 37819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard Elf **elfp, Dwarf_Addr *biasp) 386258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper{ 396258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper int syments = INTUSE(dwfl_module_getsymtab) (mod); 406258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper if (syments < 0) 416258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper return NULL; 426258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper 436258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper /* Return true iff we consider ADDR to lie in the same section as SYM. */ 446258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper GElf_Word addr_shndx = SHN_UNDEF; 45819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard Elf *addr_symelf = NULL; 46819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard inline bool same_section (const GElf_Sym *sym, Elf *symelf, GElf_Word shndx) 476258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper { 486258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper /* For absolute symbols and the like, only match exactly. */ 496258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper if (shndx >= SHN_LORESERVE) 506258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper return sym->st_value == addr; 516258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper 526258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper /* Figure out what section ADDR lies in. */ 53819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard if (addr_shndx == SHN_UNDEF || addr_symelf != symelf) 546258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper { 55819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard GElf_Addr mod_addr = dwfl_deadjust_st_value (mod, symelf, addr); 566258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper Elf_Scn *scn = NULL; 576258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper addr_shndx = SHN_ABS; 58819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard addr_symelf = symelf; 59819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard while ((scn = elf_nextscn (symelf, scn)) != NULL) 606258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper { 616258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper GElf_Shdr shdr_mem; 626258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); 636258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper if (likely (shdr != NULL) 646258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper && mod_addr >= shdr->sh_addr 656258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper && mod_addr < shdr->sh_addr + shdr->sh_size) 666258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper { 676258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper addr_shndx = elf_ndxscn (scn); 686258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper break; 696258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper } 706258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper } 716258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper } 726258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper 73819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard return shndx == addr_shndx && addr_symelf == symelf; 746258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper } 756258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper 7642f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath /* Keep track of the closest symbol we have seen so far. 7742f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath Here we store only symbols with nonzero st_size. */ 786258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper const char *closest_name = NULL; 796258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper GElf_Word closest_shndx = SHN_UNDEF; 80819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard Elf *closest_elf = NULL; 8142f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath 8242f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath /* Keep track of an eligible symbol with st_size == 0 as a fallback. */ 8342f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath const char *sizeless_name = NULL; 84099dd52727f2ce1a2c73cde82af8cd5e06368aecRoland McGrath GElf_Sym sizeless_sym = { 0, 0, 0, 0, 0, SHN_UNDEF }; 8542f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath GElf_Word sizeless_shndx = SHN_UNDEF; 86819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard Elf *sizeless_elf = NULL; 8742f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath 8842f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath /* Keep track of the lowest address a relevant sizeless symbol could have. */ 89b4d6f0f8064f2b706ea9035ef0393d8299671390Roland McGrath GElf_Addr min_label = 0; 9042f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath 9142f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath /* Look through the symbol table for a matching symbol. */ 92ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard inline void search_table (int start, int end) 936258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper { 94ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard for (int i = start; i < end; ++i) 956258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper { 96ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard GElf_Sym sym; 97ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard GElf_Word shndx; 98819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard Elf *elf; 99819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard const char *name = INTUSE(dwfl_module_getsym_elf) (mod, i, &sym, 100819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard &shndx, &elf, 101819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard NULL); 102ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard if (name != NULL && name[0] != '\0' 103ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard && sym.st_shndx != SHN_UNDEF 104ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard && sym.st_value <= addr 105ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard && GELF_ST_TYPE (sym.st_info) != STT_SECTION 106ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard && GELF_ST_TYPE (sym.st_info) != STT_FILE 107ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard && GELF_ST_TYPE (sym.st_info) != STT_TLS) 108c76f0b05676f6207affbfd85e75063db3b6eeccfRoland McGrath { 109ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard /* Even if we don't choose this symbol, its existence excludes 110ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard any sizeless symbol (assembly label) that is below its upper 111ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard bound. */ 112ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard if (sym.st_value + sym.st_size > min_label) 113ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard min_label = sym.st_value + sym.st_size; 114ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard 115ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard if (sym.st_size == 0 || addr - sym.st_value < sym.st_size) 116c76f0b05676f6207affbfd85e75063db3b6eeccfRoland McGrath { 11778dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil /* Return GELF_ST_BIND as higher-is-better integer. */ 11878dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil inline int binding_value (const GElf_Sym *symp) 11978dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil { 12078dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil switch (GELF_ST_BIND (symp->st_info)) 12178dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil { 12278dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil case STB_GLOBAL: 12378dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil return 3; 12478dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil case STB_WEAK: 12578dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil return 2; 12678dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil case STB_LOCAL: 12778dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil return 1; 12878dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil default: 12978dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil return 0; 13078dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil } 13178dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil } 132ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard /* This symbol is a better candidate than the current one 133ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard if it's closer to ADDR or is global when it was local. */ 134ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard if (closest_name == NULL 135ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard || closest_sym->st_value < sym.st_value 13678dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil || binding_value (closest_sym) < binding_value (&sym)) 137ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard { 138ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard if (sym.st_size != 0) 139ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard { 140ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard *closest_sym = sym; 141ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard closest_shndx = shndx; 142819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard closest_elf = elf; 143ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard closest_name = name; 144ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard } 145ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard else if (closest_name == NULL 146ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard && sym.st_value >= min_label 147819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard && same_section (&sym, elf, shndx)) 148ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard { 149ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard /* Handwritten assembly symbols sometimes have no 150ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard st_size. If no symbol with proper size includes 151ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard the address, we'll use the closest one that is in 152ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard the same section as ADDR. */ 153ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard sizeless_sym = sym; 154ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard sizeless_shndx = shndx; 155819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard sizeless_elf = elf; 156ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard sizeless_name = name; 157ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard } 158ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard } 159ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard /* When the beginning of its range is no closer, 16078dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil the end of its range might be. Otherwise follow 16178dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil GELF_ST_BIND preference. If all are equal prefer 16278dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil the first symbol found. */ 163ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard else if (sym.st_size != 0 164ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard && closest_sym->st_value == sym.st_value 16578dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil && ((closest_sym->st_size > sym.st_size 16678dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil && (binding_value (closest_sym) 16778dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil <= binding_value (&sym))) 16878dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil || (closest_sym->st_size >= sym.st_size 16978dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil && (binding_value (closest_sym) 17078dec228b3cfb2f9300cd0b682ebf416c9674c91Jan Kratochvil < binding_value (&sym))))) 171c76f0b05676f6207affbfd85e75063db3b6eeccfRoland McGrath { 172c76f0b05676f6207affbfd85e75063db3b6eeccfRoland McGrath *closest_sym = sym; 173c76f0b05676f6207affbfd85e75063db3b6eeccfRoland McGrath closest_shndx = shndx; 174819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard closest_elf = elf; 175c76f0b05676f6207affbfd85e75063db3b6eeccfRoland McGrath closest_name = name; 176c76f0b05676f6207affbfd85e75063db3b6eeccfRoland McGrath } 17742f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath } 1786258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper } 1796258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper } 1806258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper } 1816258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper 1825083a70d3b64946fa47ea5766943a15a3ecc6891Mark Wielaard /* First go through global symbols. mod->first_global and 1835083a70d3b64946fa47ea5766943a15a3ecc6891Mark Wielaard mod->aux_first_global are setup by dwfl_module_getsymtab to the 184697bdca1d7d70ebdcae90759dd885258400e1951Mark Wielaard index of the first global symbol in those symbol tables. Both 185697bdca1d7d70ebdcae90759dd885258400e1951Mark Wielaard are non-zero when the table exist, except when there is only a 186697bdca1d7d70ebdcae90759dd885258400e1951Mark Wielaard dynsym table loaded through phdrs, then first_global is zero and 187697bdca1d7d70ebdcae90759dd885258400e1951Mark Wielaard there will be no auxiliary table. All symbols with local binding 188697bdca1d7d70ebdcae90759dd885258400e1951Mark Wielaard come first in the symbol table, then all globals. The zeroth, 189697bdca1d7d70ebdcae90759dd885258400e1951Mark Wielaard null entry, in the auxiliary table is skipped if there is a main 190697bdca1d7d70ebdcae90759dd885258400e1951Mark Wielaard table. */ 19114c2d9e614cb0e3fd50ad757eaba686b37699580Mark Wielaard int first_global = INTUSE (dwfl_module_getsymtab_first_global) (mod); 19214c2d9e614cb0e3fd50ad757eaba686b37699580Mark Wielaard if (first_global < 0) 19314c2d9e614cb0e3fd50ad757eaba686b37699580Mark Wielaard return NULL; 194697bdca1d7d70ebdcae90759dd885258400e1951Mark Wielaard search_table (first_global == 0 ? 1 : first_global, syments); 195ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard 196ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard /* If we found nothing searching the global symbols, then try the locals. 197ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard Unless we have a global sizeless symbol that matches exactly. */ 1985083a70d3b64946fa47ea5766943a15a3ecc6891Mark Wielaard if (closest_name == NULL && first_global > 1 199ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard && (sizeless_name == NULL || sizeless_sym.st_value != addr)) 2005083a70d3b64946fa47ea5766943a15a3ecc6891Mark Wielaard search_table (1, first_global); 201ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard 20242f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath /* If we found no proper sized symbol to use, fall back to the best 20342f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath candidate sizeless symbol we found, if any. */ 20442f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath if (closest_name == NULL 20542f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath && sizeless_name != NULL && sizeless_sym.st_value >= min_label) 20642f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath { 20742f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath *closest_sym = sizeless_sym; 20842f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath closest_shndx = sizeless_shndx; 209819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard closest_elf = sizeless_elf; 21042f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath closest_name = sizeless_name; 21142f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath } 21242f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath 2136258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper if (shndxp != NULL) 2146258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper *shndxp = closest_shndx; 215819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard if (elfp != NULL) 216819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard *elfp = closest_elf; 217819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard if (biasp != NULL) 218819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard *biasp = dwfl_adjusted_st_value (mod, closest_elf, 0); 2196258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper return closest_name; 2206258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper} 221819c349f6339512d6961a6172c539fdf2c2f1328Mark WielaardINTDEF (dwfl_module_addrsym_elf) 222819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard 223819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard 224819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaardconst char * 225819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaarddwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr addr, 226819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard GElf_Sym *closest_sym, GElf_Word *shndxp) 227819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard{ 228819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard return INTUSE(dwfl_module_addrsym_elf) (mod, addr, closest_sym, shndxp, 229819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard NULL, NULL); 230819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard} 2316258e7486eb3eed6e50005946795c5fbf73aa106Ulrich DrepperINTDEF (dwfl_module_addrsym) 232