]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Fix 32085 Source file not recognized for gcc 11.4.0-compiled code
authorVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Tue, 7 Jan 2025 05:40:12 +0000 (21:40 -0800)
committerVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Wed, 8 Jan 2025 06:27:46 +0000 (22:27 -0800)
gprofng cannot read compressed section.
In the next release we plan to use libbfd everywhere instead of our ELF reader.
But in this release I use bfd_get_full_section_contents() only
when bfd_is_section_compressed() returns true.

gprofng/ChangeLog
2025-01-06  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

PR gprofng/32085
* src/Elf.cc: Use bfd_get_full_section_contents to decompress a section.
* src/Elf.h: Define SEC_DECOMPRESSED.

gprofng/src/Elf.cc
gprofng/src/Elf.h

index c2c44684472f766a7ddce30d307d2fe2387f7f53..b9da2403befa5f7e629428bec1ec90c4c5a340fa 100644 (file)
@@ -265,9 +265,14 @@ Elf::~Elf ()
       for (int i = 0; i < (int) ehdrp->e_shnum; i++)
        {
          Elf_Data *p = data[i];
-         if (p && !mmap_on_file && (p->d_flags & SHF_SUNW_ABSENT) == 0)
-           free (p->d_buf);
-         delete p;
+         if (p)
+           {
+             if (p->d_flags & SEC_DECOMPRESSED)
+               free (p->d_buf);
+             else if (!mmap_on_file && (p->d_flags & SHF_SUNW_ABSENT) == 0)
+               free (p->d_buf);
+             delete p;
+           }
        }
       free (data);
     }
@@ -443,11 +448,28 @@ Elf::elf_getdata (unsigned int sec)
                }
            }
        }
-      edta->d_buf = get_data (shdr->sh_offset, (size_t) shdr->sh_size, NULL);
-      edta->d_flags = shdr->sh_flags;
-      edta->d_size = ((edta->d_buf == NULL) || (shdr->sh_type == SHT_NOBITS)) ? 0 : shdr->sh_size;
-      edta->d_off = shdr->sh_offset;
-      edta->d_align = shdr->sh_addralign;
+
+      sec_ptr sp = shdr->bfd_section;
+      if (sp && bfd_is_section_compressed (abfd, sp))
+       {
+         bfd_byte *p = NULL;
+         if (bfd_get_full_section_contents (abfd, sp, &p))
+           {
+             edta->d_buf = p;
+             edta->d_size = p ? sp->size : 0;
+             edta->d_off = 0;
+             edta->d_flags = shdr->sh_flags | SEC_DECOMPRESSED;
+             edta->d_align = shdr->sh_addralign;
+           }
+       }
+      else
+       {
+         edta->d_buf = get_data (shdr->sh_offset, (size_t) shdr->sh_size, NULL);
+         edta->d_flags = shdr->sh_flags;
+         edta->d_size = ((edta->d_buf == NULL) || (shdr->sh_type == SHT_NOBITS)) ? 0 : shdr->sh_size;
+         edta->d_off = shdr->sh_offset;
+         edta->d_align = shdr->sh_addralign;
+       }
     }
   return edta;
 }
index 073586314bbca8d4a48230195242f0c9b8f1f039..7c32dfe10b10d98ac71a04acc2a735814f4a62d7 100644 (file)
@@ -41,6 +41,7 @@ template <typename Key_t, typename Value_t> class Map;
 #define GELF_R_TYPE(info)   ((((uint64_t)(info))<<56)>>56)
 
 #define        SHF_SUNW_ABSENT         0x00200000      /* section data not present */
+#define        SEC_DECOMPRESSED        0x00400000      /* bfd allocated this memory */
 
 // Ancillary values.
 #define ANC_SUNW_NULL       0