109 lines
3.9 KiB
Diff
109 lines
3.9 KiB
Diff
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
|
From: Keith Seitz <keiths@redhat.com>
|
|
Date: Fri, 23 Oct 2020 17:12:26 -0400
|
|
Subject:
|
|
gdb-rhbz1878810-bfd-suppress-loadable-section-outside-ELF-sections.patch
|
|
|
|
;; Backport "Stop the BFD library from issuing a warning message when
|
|
;; processing allocated sections in debuginfo files that lie outside of
|
|
;; Nick Clifton and Keith Seitz, RH BZ 1878810
|
|
|
|
Stop the BFD library from issuing a warning message when processing allocated sections in debuginfo files that lie outside of any loadable segment.
|
|
|
|
bfd/ChangeLog
|
|
PR 24717
|
|
* elf.c (is_debuginfo_file): New function.
|
|
(assign_file_positions_for_non_load_sections): Do not warn about
|
|
allocated sections outside of loadable segments if they are found
|
|
in a debuginfo file.
|
|
* elf-bfd.h (is_debuginfo_file): Prototype.
|
|
|
|
gdb/ChangeLog
|
|
https://bugzilla.redhat.com/show_bug.cgi?id=1553086
|
|
* elfread.c (elf_symfile_segments): Omit "Loadable section ...
|
|
outside of ELF segments" warning for debugin
|
|
|
|
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
|
|
--- a/bfd/elf-bfd.h
|
|
+++ b/bfd/elf-bfd.h
|
|
@@ -2740,6 +2740,8 @@ extern bfd_vma elf64_r_sym (bfd_vma);
|
|
extern bfd_vma elf32_r_info (bfd_vma, bfd_vma);
|
|
extern bfd_vma elf32_r_sym (bfd_vma);
|
|
|
|
+extern bfd_boolean is_debuginfo_file (bfd *);
|
|
+
|
|
/* Large common section. */
|
|
extern asection _bfd_elf_large_com_section;
|
|
|
|
diff --git a/bfd/elf.c b/bfd/elf.c
|
|
--- a/bfd/elf.c
|
|
+++ b/bfd/elf.c
|
|
@@ -5725,6 +5725,35 @@ assign_file_positions_for_load_sections (bfd *abfd,
|
|
return TRUE;
|
|
}
|
|
|
|
+/* Determine if a bfd is a debuginfo file. Unfortunately there
|
|
+ is no defined method for detecting such files, so we have to
|
|
+ use heuristics instead. */
|
|
+
|
|
+bfd_boolean
|
|
+is_debuginfo_file (bfd *abfd)
|
|
+{
|
|
+ if (abfd == NULL || bfd_get_flavour (abfd) != bfd_target_elf_flavour)
|
|
+ return FALSE;
|
|
+
|
|
+ Elf_Internal_Shdr **start_headers = elf_elfsections (abfd);
|
|
+ Elf_Internal_Shdr **end_headers = start_headers + elf_numsections (abfd);
|
|
+ Elf_Internal_Shdr **headerp;
|
|
+
|
|
+ for (headerp = start_headers; headerp < end_headers; headerp ++)
|
|
+ {
|
|
+ Elf_Internal_Shdr *header = * headerp;
|
|
+
|
|
+ /* Debuginfo files do not have any allocated SHT_PROGBITS sections.
|
|
+ The only allocated sections are SHT_NOBITS or SHT_NOTES. */
|
|
+ if ((header->sh_flags & SHF_ALLOC) == SHF_ALLOC
|
|
+ && header->sh_type != SHT_NOBITS
|
|
+ && header->sh_type != SHT_NOTE)
|
|
+ return FALSE;
|
|
+ }
|
|
+
|
|
+ return TRUE;
|
|
+}
|
|
+
|
|
/* Assign file positions for the other sections. */
|
|
|
|
static bfd_boolean
|
|
@@ -5758,7 +5787,13 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
|
|
BFD_ASSERT (hdr->sh_offset == hdr->bfd_section->filepos);
|
|
else if ((hdr->sh_flags & SHF_ALLOC) != 0)
|
|
{
|
|
- if (hdr->sh_size != 0)
|
|
+ if (hdr->sh_size != 0
|
|
+ /* PR 24717 - debuginfo files are known to be not strictly
|
|
+ compliant with the ELF standard. In particular they often
|
|
+ have .note.gnu.property sections that are outside of any
|
|
+ loadable segment. This is not a problem for such files,
|
|
+ so do not warn about them. */
|
|
+ && ! is_debuginfo_file (abfd))
|
|
_bfd_error_handler
|
|
/* xgettext:c-format */
|
|
(_("%pB: warning: allocated section `%s' not in segment"),
|
|
diff --git a/gdb/elfread.c b/gdb/elfread.c
|
|
--- a/gdb/elfread.c
|
|
+++ b/gdb/elfread.c
|
|
@@ -143,7 +143,12 @@ elf_symfile_segments (bfd *abfd)
|
|
RealView) use SHT_NOBITS for uninitialized data. Since it is
|
|
uninitialized, it doesn't need a program header. Such
|
|
binaries are not relocatable. */
|
|
- if (bfd_get_section_size (sect) > 0 && j == num_segments
|
|
+
|
|
+ /* Exclude debuginfo files from this warning, too, since those
|
|
+ are often not strictly compliant with the standard. See, e.g.,
|
|
+ ld/24717 for more discussion. */
|
|
+ if (!is_debuginfo_file (abfd)
|
|
+ && bfd_get_section_size (sect) > 0 && j == num_segments
|
|
&& (bfd_get_section_flags (abfd, sect) & SEC_LOAD) != 0)
|
|
warning (_("Loadable section \"%s\" outside of ELF segments"),
|
|
bfd_section_name (abfd, sect));
|