I almost always prefer readelf -Ws to objdump -t for ELF symbol information as the former presents all information without distortion. Certain symbol types have strange output for objdump -t output, e.g. STT_SECTION=>'d', STT_NOTYPE=>no particular character. There is, however, one feature that objdump -t is better: it displays the section name for a symbol defined relative to a section. readelf -Ws just prints st_shndx, which is sometimes less readable. I wonder whether readelf can add an option to change the "Ndx" column to display section names instead.
Hi Fanguri, I like the idea, although I am not sure of the format the output should take. I tried a small experiment and the output looked like this (pruned to just show some interesting cases): 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text 2: 0000000000000000 0 FILE LOCAL DEFAULT ABS crt1.o 3: 0000000000405fa6 0 NOTYPE LOCAL HIDDEN 14 (.text) .annobin_abi_note.c 12: 000000000040039c 32 OBJECT LOCAL DEFAULT 4 (.note.ABI-tag) __abi_tag 40: 0000000000423ea0 19 OBJECT LOCAL DEFAULT 16 (.rodata) __PRETTY_FUNCTION__.1 The problem is that I wanted to associate the section names with the section indexes, where the index is relevant, but this results in the symbol names being mis-indented and the output looking messy. Do you have any suggestions for a better format ? Cheers Nick
Created attachment 15012 [details] Proposed patch Have a play with this patch and let me know what you think. The patch is incomplete - it does not document the new behaviour and I have not added any new tests or tweaks to existing tests - but it does show how I think that the feature might work. The new behaviour is only enabled when the --wide option is enabled. In addition to decoding the symbol indicies, the patch also changes readelf's current behaviour slightly in that any non-visibility information in a symbols st_other field is now only displayed when --wide is active. I made this change because displaying the "other" information disrupts the layout of the table being displayed and I want to keep the non-wide display as uniform as possible. You may also wonder about/hate the display of "==>" for section symbols. I did not want to display the section name twice, but I did want a way to indicate that the section index does have a string associated with it.
Created attachment 15016 [details] Proposed patch And here is a full patch. After some more thought, I decided that the new behaviour needed to be gated by a command line option, so I have added --extra-sym-info to do this. I have also moved the display of non-visibility related bits in the st_other field to this new option. This means that by default the symbol table displayed by readelf should be completely uniform. I have discarded the "==>" for section symbols - it looked silly. Instead I just filled the gap with spaces. Any comments ?
(In reply to Nick Clifton from comment #3) > Created attachment 15016 [details] > Proposed patch > > And here is a full patch. > > After some more thought, I decided that the new behaviour needed to be gated > by a command line option, so I have added --extra-sym-info to do this. Thank you for implementing this! Yes, I think quite a few projects rely on the output of readelf -Ws. Using an opt-in option is necessary. The option name -X/--extra-sym-info looks good to me. Another long option name choice is --symbol-details to be similar to --section-details. > I have also moved the display of non-visibility related bits in the st_other > field to this new option. This means that by default the symbol table > displayed by readelf should be completely uniform. Like [<localentry>: 8] in the [Other] column for ppc64 ELFv2? Looks good to me, but I'd like to hear from Alan. > I have discarded the "==>" for section symbols - it looked silly. Instead I > just filled the gap with spaces. objdump -t shows the section name twice for STT_SECTION symbols as well. I think readelf -sX displaying the section name twice should be as well, to not make STT_SECTION special.
The master branch has been updated by Nick Clifton <nickc@sourceware.org>: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b6ac461ace19ba19aaf135a028df4e67e47e21d7 commit b6ac461ace19ba19aaf135a028df4e67e47e21d7 Author: Nick Clifton <nickc@redhat.com> Date: Tue Sep 5 11:08:23 2023 +0100 readelf: Add option to display the names of sections referenced by symbols. PR 30684 * readelf.c (extra_sym_info): New variable. (section_name_valid): Also check for filedata being NULL. (section_name_print): Delete. (section_index_real): New function. Returns true if the given section index references a real section. (print_symbol): Rename to print_sumbol_name. (printable_section_name): Use a rotating array of static buffers for the return string. (printable_section_name_from_index): Merge code from dump_relocations and get_symbol_index_type into here. (long_option_values): Add OPTION_NO_EXTRA_SYM_INFO. (options): Add "extra-sym-info" and "no-extra-sym-info". (usage): Mention new options. (parse_args): Parse new options. (get_symbol_index_type): Delete. (print_dynamic_symbol_size): Rename to print_symbol_size. (print_dynamic_symbol): Rename to print_symbol. (print_symbol_table_heading): New function. (process_symbol_table): Use new function. * doc/binutils.texi: Document the new option. * NEWS: Mention the new feature.
Right, sorry for the delay in responding. I have gone ahead and applied a variation on the patch which adds the -X option to display the section names, but which does not change when/where the information held in a symbol's st_other field is displayed. That change caused too many disruptions to the testsuites and was bound to upset some users.