Add symbol version dumper for #30241
Details
Diff Detail
- Repository
- rL LLVM
Event Timeline
| tools/llvm-objdump/ELFDump.cpp | ||
|---|---|---|
| 239–259 ↗ | (On Diff #174605) | 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 | ||
|---|---|---|
| 8 ↗ | (On Diff #174605) | Nit: Spurious blank line? |
| tools/llvm-objdump/ELFDump.cpp | ||
| 171 ↗ | (On Diff #174737) | 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 ↗ | (On Diff #174737) | 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 ↗ | (On Diff #174737) | 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 ↗ | (On Diff #174737) | Rather than having this big if statement, do if (GnuVerDepSec != nullptr) return; |
| 202 ↗ | (On Diff #174737) | 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 ↗ | (On Diff #174737) | unsigned is probably the wrong type. Use the type of vn_cnt or just the largest uint*_t type needed. |
| 197–198 ↗ | (On Diff #174716) | 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. |
| 162 ↗ | (On Diff #174605) | printSymbolVersionRef -> printSymbolVersionRefs or printSymbolVersionReferences |
| 164 ↗ | (On Diff #174605) | Why not use using here? |
| 239–259 ↗ | (On Diff #174605) | I'm not sure I follow what you mean? |
| tools/llvm-objdump/llvm-objdump.cpp | ||
| 2224 ↗ | (On Diff #174716) | 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 | ||
|---|---|---|
| 164 ↗ | (On Diff #174605) | I use typedef here, just like what they do in other functions. |
| 239–259 ↗ | (On Diff #174605) | I mean, these functions are similar (they all cast ELF<32|64><BE|LE> to ElfObj), can we simplify these functions? printELFFileHeader printELFDynamicSection printELFSymbolVersionRefs |
| tools/llvm-objdump/ELFDump.cpp | ||
|---|---|---|
| 187 ↗ | (On Diff #174737) | 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 | ||
|---|---|---|
| 288 ↗ | (On Diff #187942) | 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);
}
} |
| 294 ↗ | (On Diff #187942) | Actually, you do not need this I think. |
| 300 ↗ | (On Diff #187942) | I would use getSectionContents (see sample above), because it does more checks. |
| 316 ↗ | (On Diff #187942) | 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 | ||
| 303 ↗ | (On Diff #188074) | Shouldn't you be able to get Filename from Elf? |
| 313 ↗ | (On Diff #188074) | If you're not going to implement SHT_GNU_verneed in this patch then I think you should |
| 288 ↗ | (On Diff #187942) | 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. |
| tools/llvm-objdump/ELFDump.cpp | ||
|---|---|---|
| 313 ↗ | (On Diff #188074) | 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 | ||
| 292 ↗ | (On Diff #188105) | Use PRIu16, not "u" here. |
| 326 ↗ | (On Diff #188105) | You don't need this if as the early continue above means that this if will always be true. |
| 239–259 ↗ | (On Diff #174605) | You're welcome to try some sort of refactor, but do it in another patch. |