summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2013-02-06 16:20:17 +0100
committerMark Wielaard <[email protected]>2013-02-06 23:29:04 +0100
commit3bdc16ce98295463c071192eab2ec611a8edc508 (patch)
treef1207a3aba56e17d72d226ad02afe99552d7b16d /src
parent1d5037f725b691929396896fd2b6be3cae1d87ef (diff)
elflint: Add two more symbols to gnuld list of allowed bad values.
Add __bss_start and __TMC_END__ to the list of symbols allowed to have out of section values because of the following GNU ld bug: http://sourceware.org/bugzilla/show_bug.cgi?id=13621. Allow them to appear in either .symtab or .dynsym, but only when they are zero sized. It is impossible to define a general rule for this bug, but this should catch most common issues that are mostly harmless because the symbols signify the removed section was empty to being with. This catches at least all symbols often flagged in the tests. Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog7
-rw-r--r--src/elflint.c13
2 files changed, 17 insertions, 3 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index f3f9b51d..7d7b66fa 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,10 @@
+2013-02-06 Mark Wielaard <[email protected]>
+
+ * elflint.c (check_symtab): Add __bss_start and __TMC_END__ to the
+ list of symbols allowed to have out of section values because of
+ GNU ld bugs in either .symtab or .dynsym, but only when they are
+ zero sized.
+
2013-01-24 Mark Wielaard <[email protected]>
* readelf.c (argp_option): Add unresolved-address-offsets, U.
diff --git a/src/elflint.c b/src/elflint.c
index 4084987f..bc5ed33d 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -767,15 +767,22 @@ section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"),
{
/* GNU ld has severe bugs. When it decides to remove
empty sections it leaves symbols referencing them
- behind. These are symbols in .symtab. */
+ behind. These are symbols in .symtab or .dynsym
+ and for the named symbols have zero size. See
+ sourceware PR13621. */
if (!gnuld
- || strcmp (section_name (ebl, idx), ".symtab")
+ || (strcmp (section_name (ebl, idx), ".symtab")
+ && strcmp (section_name (ebl, idx),
+ ".dynsym"))
+ || sym->st_size != 0
|| (strcmp (name, "__preinit_array_start") != 0
&& strcmp (name, "__preinit_array_end") != 0
&& strcmp (name, "__init_array_start") != 0
&& strcmp (name, "__init_array_end") != 0
&& strcmp (name, "__fini_array_start") != 0
- && strcmp (name, "__fini_array_end") != 0))
+ && strcmp (name, "__fini_array_end") != 0
+ && strcmp (name, "__bss_start") != 0
+ && strcmp (name, "__TMC_END__") != 0))
ERROR (gettext ("\
section [%2d] '%s': symbol %zu: st_value out of bounds\n"),
idx, section_name (ebl, idx), cnt);