Index: llvm/trunk/test/tools/llvm-readobj/print-section.test =================================================================== --- llvm/trunk/test/tools/llvm-readobj/print-section.test +++ llvm/trunk/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...]. Index: llvm/trunk/tools/llvm-readobj/ELFDumper.cpp =================================================================== --- llvm/trunk/tools/llvm-readobj/ELFDumper.cpp +++ llvm/trunk/tools/llvm-readobj/ELFDumper.cpp @@ -3275,6 +3275,11 @@ } } +void printAsPrintable(raw_ostream &W, StringRef S) { + for (char C : S) + W << (isprint(C) ? C : '.'); +} + template void GNUStyle::printSectionAsString(const ELFO *Obj, StringRef SectionName) { @@ -3298,8 +3303,9 @@ 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 @@ 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; } }