mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-03 01:12:59 +00:00
[llvm-readobj] Only print the real size of the note
Note payloads are padded to a multiple of 4 bytes in size, but the size of the string that should be print can be smaller e.g. the n_descsz field in gold's version note is 9, so that's the whole size of the string that should be printed. The padding is part of the format of a SHT_NOTE section or PT_NOTE segment, but it's not part of the note itself. Printing the extra null bytes may confuse some tools, e.g. when the llvm-readobj is sent to grep, it treats the output as binary because it contains a null byte. Differential Revision: https://reviews.llvm.org/D30804 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299576 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c0a481413e
commit
12290fa787
@ -3370,7 +3370,8 @@ static std::string getFreeBSDNoteTypeName(const uint32_t NT) {
|
||||
|
||||
template <typename ELFT>
|
||||
static void printGNUNote(raw_ostream &OS, uint32_t NoteType,
|
||||
ArrayRef<typename ELFFile<ELFT>::Elf_Word> Words) {
|
||||
ArrayRef<typename ELFFile<ELFT>::Elf_Word> Words,
|
||||
size_t Size) {
|
||||
switch (NoteType) {
|
||||
default:
|
||||
return;
|
||||
@ -3393,16 +3394,14 @@ static void printGNUNote(raw_ostream &OS, uint32_t NoteType,
|
||||
}
|
||||
case ELF::NT_GNU_BUILD_ID: {
|
||||
OS << " Build ID: ";
|
||||
ArrayRef<uint8_t> ID(reinterpret_cast<const uint8_t *>(Words.data()),
|
||||
Words.size() * 4);
|
||||
ArrayRef<uint8_t> ID(reinterpret_cast<const uint8_t *>(Words.data()), Size);
|
||||
for (const auto &B : ID)
|
||||
OS << format_hex_no_prefix(B, 2);
|
||||
break;
|
||||
}
|
||||
case ELF::NT_GNU_GOLD_VERSION:
|
||||
OS << " Version: "
|
||||
<< StringRef(reinterpret_cast<const char *>(Words.data()),
|
||||
Words.size() * 4);
|
||||
<< StringRef(reinterpret_cast<const char *>(Words.data()), Size);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3446,7 +3445,7 @@ void GNUStyle<ELFT>::printNotes(const ELFFile<ELFT> *Obj) {
|
||||
|
||||
if (Name == "GNU") {
|
||||
OS << getGNUNoteTypeName(Type) << '\n';
|
||||
printGNUNote<ELFT>(OS, Type, Descriptor);
|
||||
printGNUNote<ELFT>(OS, Type, Descriptor, DescriptorSize);
|
||||
} else if (Name == "FreeBSD") {
|
||||
OS << getFreeBSDNoteTypeName(Type) << '\n';
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user