54 lines
2.2 KiB
Diff
54 lines
2.2 KiB
Diff
--- binutils-with-gold-2.45.50.orig/binutils/readelf.c 2025-12-08 10:51:19.287135564 +0000
|
|
+++ binutils-with-gold-2.45.50-8e992ccb1e4/binutils/readelf.c 2025-12-08 10:59:34.414789154 +0000
|
|
@@ -14667,6 +14667,18 @@ print_symbol_size (uint64_t vma, int bas
|
|
}
|
|
}
|
|
|
|
+/* The AArch64, ARM and RISC-V architectures define mapping
|
|
+ symbols (eg $d, $x, $t) which sometime should be ignored. */
|
|
+
|
|
+static bool
|
|
+is_mapping_symbol (const char * name)
|
|
+{
|
|
+ return name[0] == '$'
|
|
+ && name [1] != 0
|
|
+ /* FIXME: Check that name[1] is lower case ASCII ? */
|
|
+ && name [2] == 0;
|
|
+}
|
|
+
|
|
/* Print information on a single symbol. */
|
|
|
|
static void
|
|
@@ -14803,7 +14815,9 @@ print_symbol (Filedata * filed
|
|
|
|
/* Local symbols whose value is larger than their section's size are suspicious
|
|
especially if that section is mergeable - and hence might change offsets of
|
|
- the contents inside the section. */
|
|
+ the contents inside the section.
|
|
+ Note - for some reason we can get mapping symbols that do not relate to their
|
|
+ section's contents - so we ignore those type of symbol as well. */
|
|
if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
|
|
&& ! is_special
|
|
&& is_valid
|
|
@@ -14811,7 +14825,8 @@ print_symbol (Filedata * filed
|
|
&& filedata->section_headers != NULL
|
|
/* FIXME: Should we warn for non-mergeable sections ? */
|
|
&& (filedata->section_headers[psym->st_shndx].sh_flags & SHF_MERGE)
|
|
- && psym->st_value > filedata->section_headers[psym->st_shndx].sh_size)
|
|
+ && psym->st_value > filedata->section_headers[psym->st_shndx].sh_size
|
|
+ && ! is_mapping_symbol (strtab + psym->st_name))
|
|
warn (_("local symbol %s has a value (%#" PRIx64 ") which is larger than mergeable section %s's size (%#" PRIx64 ")\n"),
|
|
strtab + psym->st_name,
|
|
psym->st_value,
|
|
@@ -23034,9 +23049,7 @@ get_symbol_for_build_attribute (Filedata
|
|
|
|
/* The AArch64, ARM and RISC-V architectures define mapping symbols
|
|
(eg $d, $x, $t) which we want to ignore. */
|
|
- if (ba_cache.strtab[sym->st_name] == '$'
|
|
- && ba_cache.strtab[sym->st_name + 1] != 0
|
|
- && ba_cache.strtab[sym->st_name + 2] == 0)
|
|
+ if (is_mapping_symbol (ba_cache.strtab + sym->st_name))
|
|
continue;
|
|
|
|
if (is_open_attr)
|