Add symbol version dumper for #30241
Details
Diff Detail
- Repository
- rL LLVM
- Build Status
Buildable 25145 Build 25144: arc lint + arc unit
Event Timeline
| tools/llvm-objdump/ELFDump.cpp | ||
|---|---|---|
| 239–259 | 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 | 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. | |
| 239–259 | 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. | |
| 239–259 | You're welcome to try some sort of refactor, but do it in another patch. | |
Nit: Spurious blank line?