Add symbol version dumper for #30241
Details
Diff Detail
- Repository
- rL LLVM
- Build Status
Buildable 25584 Build 25583: arc lint + arc unit
Event Timeline
tools/llvm-objdump/ELFDump.cpp | ||
---|---|---|
294–314 | Seems that these codes are redundant, can we simplify this? |
Updating D54697: [llvm-objdump] Add Version References dumper (PR30241)
Rename some variables
Could you add tests for the cases where a) there is no DT_VERNEEDNUM tag, and b) where it has a value of 0, please.
Could you also point me at some documentation describing the VerNeed structs etc.
test/tools/llvm-objdump/private-headers-symbol-version.test | ||
---|---|---|
9 | Nit: Spurious blank line? | |
tools/llvm-objdump/ELFDump.cpp | ||
162 | printSymbolVersionRef -> printSymbolVersionRefs or printSymbolVersionReferences | |
164 | Why not use using here? | |
171 | d_val's type is different in 32 bit and 64-bit ELF, so this should be a type large enough to hold either version (i.e. uin64_t). | |
179–181 | Does GNU objdump print the header if there is a DT_VERNEEDNUM tag with a value of 0? I feel like it would be reasonable to do so in our case. | |
187 | You can use ELFT::Elf_Shdr here and elsewhere directly, and avoid the need for the typename. I'm also not sure what "GNUVerDepSec" means, so that probably needs expanding a bit more (especially the "Dep" part). | |
195 | Rather than having this big if statement, do if (GnuVerDepSec != nullptr) return; | |
197–198 | I'm trying to understand the structure of the VerNeed stuff. Is it a variable size block, and hence the need to iterate over bytes rather than struct instances? Also, prefer reinterpret_cast instead of C-style, here and elsewhere in this function. | |
202 | unsigned -> uint64_t to match my earlier comment. Maybe worth replacing I with VerNeedIndex or something, and J below similarly, just to disambiguate them a bit more. | |
208 | unsigned is probably the wrong type. Use the type of vn_cnt or just the largest uint*_t type needed. | |
294–314 | I'm not sure I follow what you mean? | |
tools/llvm-objdump/llvm-objdump.cpp | ||
2224 | put the return on a new line, since printELFSymbolVersionRef doesn't return anything. |
Sure, I will add them
Could you also point me at some documentation describing the VerNeed structs etc.
https://refspecs.linuxfoundation.org/LSB_2.1.0/LSB-Core-generic/LSB-Core-generic/symverdefs.html
https://refspecs.linuxfoundation.org/LSB_2.1.0/LSB-Core-generic/LSB-Core-generic/symverrqmts.html
PS. Thanks for your kind reviewing, I will cover them one by one :)
Updating D54697: [llvm-objdump] Add Version References dumper (PR30241)
Partially refactored some codes
Updating D54697: [llvm-objdump] Add Version References dumper (PR30241)
delete #include "llvm/Object/ELFTypes.h"
tools/llvm-objdump/ELFDump.cpp | ||
---|---|---|
187 | I change it to VerNeedSec |
I want to use YAML2Obj to generate the test files, but there are something wrong with that tool. So, I have to write a patch for that. This patch have to be suspended for some time, until that one landed ...
Hi @Higuoxing. Is this ready for review again? It is currently marked as WIP/changes planned.
This works, but there are some little refactors needed. Besides, I cannot give enough test cases right now ...
Sorry for not responding on this patch for 2 months. Could anyone review this? Thanks a lot.
I did not see this patch earlier and so worked on something very close to this for some time. I stopped my work
and shared the ideas/code I have in the comments here :)
tools/llvm-objdump/ELFDump.cpp | ||
---|---|---|
179 | If you move this loop to printSymbolVersionInfo and change the printSymbolVersionDependency signature I mean the code in printSymbolVersionInfo can be like: template <class ELFT> static void printSymbolVersionInfo(const ELFFile<ELFT> *Elf) { typedef typename ELFT::Shdr Elf_Shdr; auto SecOrErr = Elf->sections(); if (!SecOrErr) report_fatal_error(errorToErrorCode(SecOrErr.takeError()).message()); for (const Elf_Shdr &Shdr : *SecOrErr) { if (Shdr.sh_type != ELF::SHT_GNU_verdef && Shdr.sh_type != ELF::SHT_GNU_verneed) continue; auto ContentsOrErr = Elf->getSectionContents(&Shdr); if (!ContentsOrErr) report_fatal_error(errorToErrorCode(ContentsOrErr.takeError()).message()); if (Shdr.sh_type == ELF::SHT_GNU_verdef) printSymbolVersionDefinition<ELFT>(Shdr, *ContentsOrErr); else if (Shdr.sh_type == ELF::SHT_GNU_verneed) printSymbolVersionDependency<ELFT>(Shdr, *ContentsOrErr); } } | |
185 | Actually, you do not need this I think. | |
191 | I would use getSectionContents (see sample above), because it does more checks. | |
207 | The same, I think, you can simply iterate until vna_next != 0. |
test/tools/llvm-objdump/verneed-wrong-info.test | ||
---|---|---|
5 ↗ | (On Diff #187942) | The case looks simple, so I would remove the link and just describe it. "We have a SHT_GNU_verneed section with a broken sh_info field that says the section |
I found that elf2yaml codes could be used here, so I just do some copy and paste work.
I don't know if we need some checks on sh_info field and DT_VERNEED, just like what gnu-objdump do.
test/tools/llvm-objdump/verneed-wrong-info.test | ||
---|---|---|
5 ↗ | (On Diff #188074) | that->than, have->has (sorry, did these mistakes/mistypes when suggested it). I hope @jhenderson will re-check it though :) |
tools/llvm-objdump/ELFDump.cpp | ||
179 | I did not notice that, but if so then I guess GNU objdump just print them in the same order as they are in a section table probably. | |
194 | Shouldn't you be able to get Filename from Elf? | |
204 | If you're not going to implement SHT_GNU_verneed in this patch then I think you should |
tools/llvm-objdump/ELFDump.cpp | ||
---|---|---|
204 | I meant "if you're not going to implement ELF::SHT_GNU_verdef" of course.. |
test/tools/llvm-objdump/verneed-wrong-info.test | ||
---|---|---|
5 ↗ | (On Diff #188074) | Looks good to me here :) |
tools/llvm-objdump/ELFDump.cpp | ||
183 | Use PRIu16, not "u" here. | |
217 | You don't need this if as the early continue above means that this if will always be true. | |
294–314 | You're welcome to try some sort of refactor, but do it in another patch. |
Nit: Spurious blank line?