[PATCH] elflint: Add two more symbols to gnuld list of allowed bad values.

Mark Wielaard mjw at redhat.com
Wed Feb 6 15:31:21 UTC 2013


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 <mjw at redhat.com>
---
 src/ChangeLog |    7 +++++++
 src/elflint.c |   13 ++++++++++---
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 4d00013..4c6a872 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,10 @@
+2013-02-06  Mark Wielaard  <mjw at redhat.com>
+
+	* 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-29  Jan Kratochvil  <jan.kratochvil at redhat.com>
 
 	* readelf.c (handle_core_items): Limit special repeated items handling
diff --git a/src/elflint.c b/src/elflint.c
index 4084987..bc5ed33 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);
-- 
1.7.1



More information about the elfutils-devel mailing list