diff options
| -rw-r--r-- | src/ChangeLog | 7 | ||||
| -rw-r--r-- | src/elflint.c | 13 |
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); |
