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++;