diff options
| -rw-r--r-- | llvm/test/tools/llvm-readobj/print-section.test | 8 | ||||
| -rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 15 |
2 files changed, 19 insertions, 4 deletions
diff --git a/llvm/test/tools/llvm-readobj/print-section.test b/llvm/test/tools/llvm-readobj/print-section.test new file mode 100644 index 00000000000..7cdd0ddc92b --- /dev/null +++ b/llvm/test/tools/llvm-readobj/print-section.test @@ -0,0 +1,8 @@ +RUN: llvm-readobj -p .text %p/Inputs/elf-groups.x86_64 \ +RUN: | FileCheck %s + +CHECK: [000000] UH..H....E. +CHECK: [00000f] .E.x.E.. +CHECK: [00001a] ..}.. +CHECK: [000023] .}.. +CHECK: [00002b] 1.H...]. diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 9a2be3100ac..6bf7a811e64 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -3275,6 +3275,11 @@ void GNUStyle<ELFT>::printProgramHeaders(const ELFO *Obj) { } } +void printAsPrintable(raw_ostream &W, StringRef S) { + for (char C : S) + W << (isprint(C) ? C : '.'); +} + template <class ELFT> void GNUStyle<ELFT>::printSectionAsString(const ELFO *Obj, StringRef SectionName) { @@ -3298,8 +3303,9 @@ void GNUStyle<ELFT>::printSectionAsString(const ELFO *Obj, CurrentWord++; continue; } - OS << format("[%6tx]", CurrentWord - SecContent); - OS << format(" %.*s\n", WordSize, CurrentWord); + OS << format("[%6tx] ", CurrentWord - SecContent); + printAsPrintable(OS, StringRef(CurrentWord, WordSize)); + OS << '\n'; CurrentWord += WordSize + 1; } OS.flush(); @@ -4361,8 +4367,9 @@ void LLVMStyle<ELFT>::printSectionAsString(const ELFO *Obj, W.startLine() << "[" << to_string( format_hex_no_prefix((CurrentWord - SecContent), 6)) - << "]"; - W.startLine() << format(" %.*s\n", WordSize, CurrentWord); + << "] "; + printAsPrintable(W.startLine(), StringRef(CurrentWord, WordSize)); + W.startLine() << '\n'; CurrentWord += WordSize + 1; } } |

