TCF Agent: Fixed computation of run-time addresses of symbols from a separate debug info file
In the latest debug info files, program headers are not valid and should not be used to compute run-time addresses
diff --git a/agent/tcf/services/tcf_elf.c b/agent/tcf/services/tcf_elf.c
index ce73c47..90292cc 100644
--- a/agent/tcf/services/tcf_elf.c
+++ b/agent/tcf/services/tcf_elf.c
@@ -1802,13 +1802,29 @@
errno = 0;
if (r->sect_name == NULL) {
ContextAddress rt = 0;
- if (r->size == 0) {
+ ELF_File * mem_file = file;
+ int same_file = 0;
+ if (r->dev == 0) {
+ same_file = file_name_equ(file, r->file_name);
+ }
+ else {
+ ino_t ino = r->ino;
+ if (ino == 0) ino = elf_ino(r->file_name);
+ same_file = file->ino == ino && file->dev == r->dev;
+ }
+ if (!same_file) {
+ /* Check if the memory map entry has a separate debug info file */
+ if (!file->debug_info_file) mem_file = NULL;
+ else mem_file = elf_open_memory_region_file(r, NULL);
+ if (mem_file != NULL && get_dwarf_file(mem_file) != file) mem_file = NULL;
+ }
+ if (mem_file == NULL || r->size == 0) {
errno = ERR_INV_ADDRESS;
return 0;
}
- for (i = 0; i < file->pheader_cnt; i++) {
- ELF_PHeader * p = file->pheaders + i;
- if (!is_p_header_region(file, p, r)) continue;
+ for (i = 0; i < mem_file->pheader_cnt; i++) {
+ ELF_PHeader * p = mem_file->pheaders + i;
+ if (!is_p_header_region(mem_file, p, r)) continue;
if (addr < p->address || addr >= p->address + p->mem_size) continue;
rt = (ContextAddress)(addr - p->address + p->offset - r->file_offs + r->addr);
if (rt < r->addr || rt > r->addr + r->size - 1) continue;
@@ -1842,25 +1858,7 @@
if (elf_get_map(ctx, 0, ~(ContextAddress)0, &elf_map) < 0) return 0;
for (i = 0; i < elf_map.region_cnt; i++) {
MemoryRegion * r = elf_map.regions + i;
- ContextAddress a = 0;
- int same_file = 0;
- if (r->dev == 0) {
- same_file = file_name_equ(file, r->file_name);
- }
- else {
- ino_t ino = r->ino;
- if (ino == 0) ino = elf_ino(r->file_name);
- same_file = file->ino == ino && file->dev == r->dev;
- }
- if (!same_file) {
- /* Check if the memory map entry has a separate debug info file */
- ELF_File * exec = NULL;
- if (!file->debug_info_file) continue;
- exec = elf_open_memory_region_file(r, NULL);
- if (exec == NULL) continue;
- if (get_dwarf_file(exec) != file) continue;
- }
- a = elf_run_time_address_in_region(ctx, r, file, sec, addr);
+ ContextAddress a = elf_run_time_address_in_region(ctx, r, file, sec, addr);
if (errno == 0) {
rt = a;
cnt++;