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