Hi! info->dlpi_addr == 0 is true for executables (but those have also info->dlpi_name set to ""), but not just for those, it is true also for successfully prelinked shared libraries or any other libraries that have been linked at non-zero offset and the dynamic linker managed to mmap them where they were prelinked resp. linked to.
BTW, I'm surprised you aren't adding base_address (well, in fact it is actually not base address, but load bias, difference between load address and link base address) to elf_initialize_syminfo created symbol addresses, because all of them should be biased by the load address. And, elf_initialize_syminfo should ignore st_shndx == SHN_UNDEF symbols, those shouldn't be biased but not even entered into the table. 2013-11-18 Jakub Jelinek <ja...@redhat.com> * elf.c (phdr_callback): Process info->dlpi_addr == 0 normally. --- libbacktrace/elf.c.jj 2013-11-18 09:59:08.000000000 +0100 +++ libbacktrace/elf.c 2013-11-18 12:48:07.780700382 +0100 @@ -863,12 +863,8 @@ phdr_callback (struct dl_phdr_info *info fileline elf_fileline_fn; int found_dwarf; - /* There is not much we can do if we don't have the module name. If - the base address is 0, this is probably the executable, which we - already loaded. */ - if (info->dlpi_name == NULL - || info->dlpi_name[0] == '\0' - || info->dlpi_addr == 0) + /* There is not much we can do if we don't have the module name. */ + if (info->dlpi_name == NULL || info->dlpi_name[0] == '\0') return 0; descriptor = backtrace_open (info->dlpi_name, pd->error_callback, pd->data, Jakub