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