diff options
| author | Petr Hosek <phosek@chromium.org> | 2017-04-05 18:55:50 +0000 |
|---|---|---|
| committer | Petr Hosek <phosek@chromium.org> | 2017-04-05 18:55:50 +0000 |
| commit | 02185c04b2334d962c2a8918c16cf3d5182c5fbb (patch) | |
| tree | 207a124fd7600e13c7493973c375610e1a1d715b /llvm | |
| parent | 9ac2cc7812b1dcfe0b9a27c1627822c4b5cacfe1 (diff) | |
| download | bcm5719-llvm-02185c04b2334d962c2a8918c16cf3d5182c5fbb.tar.gz bcm5719-llvm-02185c04b2334d962c2a8918c16cf3d5182c5fbb.zip | |
[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
llvm-svn: 299576
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 264d5730525..7893eea5d22 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -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 { |

