This is an archive of the discontinued LLVM Phabricator instance.

[llvm-readelf]Revert --dyn-symbols behaviour to make it GNU compatible, and add new --hash-symbols switch for old behaviour
ClosedPublic

Authored by jhenderson on Jan 18 2019, 7:48 AM.

Details

Summary

In rL287786, the behaviour of --dyn-symbols in llvm-readelf (but not llvm-readobj) was changed to print the dynamic symbols as derived from the hash table, rather than to print the dynamic symbol table contents directly. The original change was initially submitted without review, and some comments were made on the commit mailing list implying that the new behavious is GNU compatible. I argue that it is not:

  • It does not include a null symbol.
  • It prints the symbols based on an order derived from the hash table.
  • It prints an extra column indicating which bucket it came from. This could break parsers that expect a fixed number of columns, with the first column being the symbol index.
  • If the input happens to have both .hash and .gnu.hash section, it prints interpretations of them both, resulting in most symbols being printed twice.
  • There is no way of just printing the raw dynamic symbol table, because --symbols also prints the static symbol table.

This patch reverts the --dyn-symbols behaviour back to its old behaviour of just printing the contents of the dynamic symbol table, similar to what is printed by --symbols. As the hashed interpretation is still desirable to validate the hash table, it puts it under a new switch "--hash-symbols". This is a no-op on all output forms except for GNU output style for ELF. If there is no hash table, it does nothing, unlike the previous behaviour which printed the raw dynamic symbol table, since the raw dynsym is available under --dyn-symbols.

The yaml input for the test is based on that in test/tools/llvm-readobj/demangle.test, but stripped down to the bare minimum to provide a valid dynamic symbol.

Note: some LLD tests needed updating. I will put up a separate review for those.

Diff Detail

Repository
rL LLVM

Event Timeline

jhenderson created this revision.Jan 18 2019, 7:48 AM
rupprecht accepted this revision.Jan 18 2019, 10:58 AM

The patch description seems reasonable to me

This revision is now accepted and ready to land.Jan 18 2019, 10:58 AM
grimar accepted this revision.Jan 21 2019, 12:06 AM

Patch looks reasonable to me too.

test/tools/llvm-readobj/gnu-symbols.test
3 ↗(On Diff #182512)

nit: seems you changed --elf-output-style to -elf-output-style. That made more lines to be shown
as changes for probably no solid reason? I would commit such changes as NFC separately if you want them.

jhenderson marked an inline comment as done.Jan 21 2019, 1:40 AM
jhenderson added inline comments.
test/tools/llvm-readobj/gnu-symbols.test
3 ↗(On Diff #182512)

It's mostly just to make things consistent. I'll commit separately.