1b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma/* libunwind - a platform-independent unwind library
2b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
3b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaThis file is part of libunwind.
4b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
5b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaPermission is hereby granted, free of charge, to any person obtaining
6b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmaa copy of this software and associated documentation files (the
7b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma"Software"), to deal in the Software without restriction, including
8b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmawithout limitation the rights to use, copy, modify, merge, publish,
9b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmadistribute, sublicense, and/or sell copies of the Software, and to
10b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmapermit persons to whom the Software is furnished to do so, subject to
11b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmathe following conditions:
12b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
13b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaThe above copyright notice and this permission notice shall be
14b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmaincluded in all copies or substantial portions of the Software.
15b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
16b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
23b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
24b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#include "_UCD_lib.h"
25b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#include "_UCD_internal.h"
26b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
27b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
28b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma/* Find the ELF image that contains IP and return the "closest"
29b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma   procedure name, if there is one.  With some caching, this could be
30b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma   sped up greatly, but until an application materializes that's
31b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma   sensitive to the performance of this routine, why bother...  */
32b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmastatic int
33b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmaelf_w (CD_get_proc_name) (struct UCD_info *ui, unw_addr_space_t as, unw_word_t ip,
34b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma		       char *buf, size_t buf_len, unw_word_t *offp)
35b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma{
36b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  unsigned long segbase, mapoff;
37b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  int ret;
38b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
39b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  /* Used to be tdep_get_elf_image() in ptrace unwinding code */
40b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  coredump_phdr_t *cphdr = _UCD_get_elf_image(ui, ip);
41b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  if (!cphdr)
42b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma    {
43e61c6f69c30d85584ece5250b8b82b03898384f5Tommi Rantala      Debug(1, "returns error: _UCD_get_elf_image failed\n");
44b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      return -UNW_ENOINFO;
45b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma    }
46b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  /* segbase: where it is mapped in virtual memory */
47b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  /* mapoff: offset in the file */
48b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  segbase = cphdr->p_vaddr;
49b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  /*mapoff  = phdr->p_offset; WRONG! phdr->p_offset is the offset in COREDUMP file */
50b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  mapoff  = 0;
51b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
52b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  ret = elf_w (get_proc_name_in_image) (as, &ui->edi.ei, segbase, mapoff, ip, buf, buf_len, offp);
53b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
54b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  return ret;
55b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma}
56b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
57b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmaint
58b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma_UCD_get_proc_name (unw_addr_space_t as, unw_word_t ip,
59b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma		    char *buf, size_t buf_len, unw_word_t *offp, void *arg)
60b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma{
61b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  struct UCD_info *ui = arg;
62b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
63b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#if ELF_CLASS == ELFCLASS64
64b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  return _Uelf64_CD_get_proc_name (ui, as, ip, buf, buf_len, offp);
65b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#elif ELF_CLASS == ELFCLASS32
66b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  return _Uelf32_CD_get_proc_name (ui, as, ip, buf, buf_len, offp);
67b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#else
68b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  return -UNW_ENOINFO;
69b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#endif
70b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma}
71