diff options
author | Jordan Rupprecht <rupprecht@google.com> | 2018-11-12 18:02:38 +0000 |
---|---|---|
committer | Jordan Rupprecht <rupprecht@google.com> | 2018-11-12 18:02:38 +0000 |
commit | dbf552c40f3916d1ec0deca11bc432b91b8ea17a (patch) | |
tree | d9a3e9c0c9bf599a74a0a83c8013fbabed5ec37f /llvm/tools/llvm-readobj/llvm-readobj.cpp | |
parent | ec3c0854ecaf85d878342f252ab877b53cfeae68 (diff) | |
download | llvm-dbf552c40f3916d1ec0deca11bc432b91b8ea17a.zip llvm-dbf552c40f3916d1ec0deca11bc432b91b8ea17a.tar.gz llvm-dbf552c40f3916d1ec0deca11bc432b91b8ea17a.tar.bz2 |
[llvm-readelf] Make llvm-readelf more compatible with GNU readelf.
Summary:
This change adds a bunch of options that GNU readelf supports. There is one breaking change when invoked as `llvm-readobj`, and three breaking changes when invoked as `llvm-readelf`:
- Add --all (implies --file-header, --program-headers, etc.)
- [Breaking] -a is --all instead of --arm-attributes
- Add --file-header as an alias for --file-headers
- Replace --sections with --sections-headers, keeping --sections as an alias for it
- Add --relocs as an alias for --relocations
- Add --dynamic as an alias for --dynamic-table
- Add --segments as an alias for --program-headers
- Add --section-groups as an alias for --elf-section-groups
- Add --dyn-syms as an alias for --dyn-symbols
- Add --syms as an alias for --symbols
- Add --histogram as an alias for --elf-hash-histogram
- [Breaking] When invoked as `llvm-readelf`, -s is --symbols instead of --sections
- [Breaking] When invoked as `llvm-readelf`, -t is no longer an alias for --symbols
Reviewers: MaskRay, phosek, mcgrathr, jhenderson
Reviewed By: MaskRay, jhenderson
Subscribers: sbc100, aheejin, edd, jhenderson, silvas, echristo, compnerd, kristina, javed.absar, kristof.beyls, llvm-commits, Bigcheese
Differential Revision: https://reviews.llvm.org/D54124
llvm-svn: 346685
Diffstat (limited to 'llvm/tools/llvm-readobj/llvm-readobj.cpp')
-rw-r--r-- | llvm/tools/llvm-readobj/llvm-readobj.cpp | 154 |
1 files changed, 105 insertions, 49 deletions
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp index 61bec32..ab954a4 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.cpp +++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp @@ -48,30 +48,41 @@ namespace opts { cl::desc("<input object files>"), cl::ZeroOrMore); + // -all, -a + cl::opt<bool> + All("all", + cl::desc("Equivalent to setting: --file-headers, --program-headers, " + "--section-headers, --symbols, --relocations, " + "--dynamic-table, --notes, --version-info, --unwind, " + "--section-groups and --elf-hash-histogram.")); + cl::alias AllShort("a", cl::desc("Alias for --all"), cl::aliasopt(All)); + // -wide, -W - cl::opt<bool> WideOutput("wide", - cl::desc("Ignored for compatibility with GNU readelf")); + cl::opt<bool> + WideOutput("wide", cl::desc("Ignored for compatibility with GNU readelf"), + cl::Hidden); cl::alias WideOutputShort("W", cl::desc("Alias for --wide"), cl::aliasopt(WideOutput)); - // -file-headers, -h + // -file-headers, -file-header, -h cl::opt<bool> FileHeaders("file-headers", cl::desc("Display file headers ")); - cl::alias FileHeadersShort("h", - cl::desc("Alias for --file-headers"), - cl::aliasopt(FileHeaders)); - - // -sections, -s, -S - // Note: In GNU readelf, -s means --symbols! - cl::opt<bool> Sections("sections", - cl::desc("Display all sections.")); - cl::alias SectionsShort("s", - cl::desc("Alias for --sections"), - cl::aliasopt(Sections)); - cl::alias SectionsShortUpper("S", - cl::desc("Alias for --sections"), - cl::aliasopt(Sections)); + cl::alias FileHeadersShort("h", cl::desc("Alias for --file-headers"), + cl::aliasopt(FileHeaders), cl::NotHidden); + cl::alias FileHeadersSingular("file-header", + cl::desc("Alias for --file-headers"), + cl::aliasopt(FileHeaders)); + + // -section-headers, -sections, -S + // Also -s in llvm-readobj mode. + cl::opt<bool> SectionHeaders("section-headers", + cl::desc("Display all section headers.")); + cl::alias SectionsShortUpper("S", cl::desc("Alias for --section-headers"), + cl::aliasopt(SectionHeaders), cl::NotHidden); + cl::alias SectionHeadersAlias("sections", + cl::desc("Alias for --section-headers"), + cl::aliasopt(SectionHeaders), cl::NotHidden); // -section-relocations, -sr cl::opt<bool> SectionRelocations("section-relocations", @@ -94,12 +105,13 @@ namespace opts { cl::desc("Alias for --section-data"), cl::aliasopt(SectionData)); - // -relocations, -r + // -relocations, -relocs, -r cl::opt<bool> Relocations("relocations", cl::desc("Display the relocation entries in the file")); - cl::alias RelocationsShort("r", - cl::desc("Alias for --relocations"), - cl::aliasopt(Relocations)); + cl::alias RelocationsShort("r", cl::desc("Alias for --relocations"), + cl::aliasopt(Relocations), cl::NotHidden); + cl::alias RelocationsGNU("relocs", cl::desc("Alias for --relocations"), + cl::aliasopt(Relocations)); // -notes, -n cl::opt<bool> Notes("notes", cl::desc("Display the ELF notes in the file")); @@ -109,19 +121,21 @@ namespace opts { cl::opt<bool> DynRelocs("dyn-relocations", cl::desc("Display the dynamic relocation entries in the file")); - // -symbols, -t + // -symbols + // Also -s in llvm-readelf mode, or -t in llvm-readobj mode. cl::opt<bool> Symbols("symbols", cl::desc("Display the symbol table")); - cl::alias SymbolsShort("t", - cl::desc("Alias for --symbols"), - cl::aliasopt(Symbols)); + cl::alias SymbolsGNU("syms", cl::desc("Alias for --symbols"), + cl::aliasopt(Symbols)); - // -dyn-symbols, -dt + // -dyn-symbols, -dyn-syms, -dt cl::opt<bool> DynamicSymbols("dyn-symbols", cl::desc("Display the dynamic symbol table")); cl::alias DynamicSymbolsShort("dt", cl::desc("Alias for --dyn-symbols"), cl::aliasopt(DynamicSymbols)); + cl::alias DynSymsGNU("dyn-syms", cl::desc("Alias for --dyn-symbols"), + cl::aliasopt(DynamicSymbols)); // -unwind, -u cl::opt<bool> UnwindInfo("unwind", @@ -130,29 +144,33 @@ namespace opts { cl::desc("Alias for --unwind"), cl::aliasopt(UnwindInfo)); - // -dynamic-table + // -dynamic-table, -dynamic, -d cl::opt<bool> DynamicTable("dynamic-table", cl::desc("Display the ELF .dynamic section table")); cl::alias DynamicTableShort("d", cl::desc("Alias for --dynamic-table"), + cl::aliasopt(DynamicTable), cl::NotHidden); + cl::alias DynamicTableAlias("dynamic", cl::desc("Alias for --dynamic-table"), cl::aliasopt(DynamicTable)); // -needed-libs cl::opt<bool> NeededLibraries("needed-libs", cl::desc("Display the needed libraries")); - // -program-headers + // -program-headers, -segments, -l cl::opt<bool> ProgramHeaders("program-headers", cl::desc("Display ELF program headers")); cl::alias ProgramHeadersShort("l", cl::desc("Alias for --program-headers"), - cl::aliasopt(ProgramHeaders)); + cl::aliasopt(ProgramHeaders), cl::NotHidden); + cl::alias SegmentsAlias("segments", cl::desc("Alias for --program-headers"), + cl::aliasopt(ProgramHeaders)); - // -string-dump + // -string-dump, -p cl::list<std::string> StringDump("string-dump", cl::desc("<number|name>"), cl::ZeroOrMore); cl::alias StringDumpShort("p", cl::desc("Alias for --string-dump"), cl::aliasopt(StringDump)); - // -hex-dump + // -hex-dump, -x cl::list<std::string> HexDump("hex-dump", cl::desc("<number|name>"), cl::ZeroOrMore); cl::alias HexDumpShort("x", cl::desc("Alias for --hex-dump"), @@ -188,11 +206,9 @@ namespace opts { "codeview-subsection-bytes", cl::desc("Dump raw contents of codeview debug sections and records")); - // -arm-attributes, -a + // -arm-attributes cl::opt<bool> ARMAttributes("arm-attributes", cl::desc("Display the ARM attributes section")); - cl::alias ARMAttributesShort("a", cl::desc("Alias for --arm-attributes"), - cl::aliasopt(ARMAttributes)); // -mips-plt-got cl::opt<bool> @@ -283,28 +299,40 @@ namespace opts { PrintStackMap("stackmap", cl::desc("Display contents of stackmap section")); - // -version-info + // -version-info, -V cl::opt<bool> VersionInfo("version-info", cl::desc("Display ELF version sections (if present)")); cl::alias VersionInfoShort("V", cl::desc("Alias for -version-info"), cl::aliasopt(VersionInfo)); + // -elf-section-groups, -section-groups, -g cl::opt<bool> SectionGroups("elf-section-groups", cl::desc("Display ELF section group contents")); + cl::alias SectionGroupsAlias("section-groups", + cl::desc("Alias for -elf-sections-groups"), + cl::aliasopt(SectionGroups)); cl::alias SectionGroupsShort("g", cl::desc("Alias for -elf-sections-groups"), cl::aliasopt(SectionGroups)); + + // -elf-hash-histogram, -histogram, -I cl::opt<bool> HashHistogram( "elf-hash-histogram", cl::desc("Display bucket list histogram for hash sections")); cl::alias HashHistogramShort("I", cl::desc("Alias for -elf-hash-histogram"), cl::aliasopt(HashHistogram)); + cl::alias HistogramAlias("histogram", + cl::desc("Alias for --elf-hash-histogram"), + cl::aliasopt(HashHistogram)); + // -elf-cg-profile cl::opt<bool> CGProfile("elf-cg-profile", cl::desc("Display callgraph profile section")); + // -addrsig cl::opt<bool> Addrsig("addrsig", cl::desc("Display address-significance table")); + // -elf-output-style cl::opt<OutputStyleTy> Output("elf-output-style", cl::desc("Specify ELF dump style"), cl::values(clEnumVal(LLVM, "LLVM default style"), @@ -418,8 +446,8 @@ static void dumpObject(const ObjectFile *Obj, ScopedPrinter &Writer) { if (opts::FileHeaders) Dumper->printFileHeaders(); - if (opts::Sections) - Dumper->printSections(); + if (opts::SectionHeaders) + Dumper->printSectionHeaders(); if (opts::Relocations) Dumper->printRelocations(); if (opts::DynRelocs) @@ -588,28 +616,56 @@ static void dumpInput(StringRef File) { reportError(File, readobj_error::unrecognized_file_format); } +/// Registers aliases that should only be allowed by readobj. +static void registerReadobjAliases() { + // -s has meant --sections for a very long time in llvm-readobj despite + // meaning --symbols in readelf. + static cl::alias SectionsShort("s", cl::desc("Alias for --section-headers"), + cl::aliasopt(opts::SectionHeaders), + cl::NotHidden); + + // Only register -t in llvm-readobj, as readelf reserves it for + // --section-details (not implemented yet). + static cl::alias SymbolsShort("t", cl::desc("Alias for --symbols"), + cl::aliasopt(opts::Symbols), cl::NotHidden); +} + +/// Registers aliases that should only be allowed by readelf. +static void registerReadelfAliases() { + // -s is here because for readobj it means --sections. + static cl::alias SymbolsShort("s", cl::desc("Alias for --symbols"), + cl::aliasopt(opts::Symbols), cl::NotHidden); +} + int main(int argc, const char *argv[]) { InitLLVM X(argc, argv); // Register the target printer for --version. cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion); - // Make some commonly used short options visibile in -help. - opts::DynamicTableShort.setHiddenFlag(cl::NotHidden); - opts::FileHeadersShort.setHiddenFlag(cl::NotHidden); - opts::ProgramHeadersShort.setHiddenFlag(cl::NotHidden); - opts::RelocationsShort.setHiddenFlag(cl::NotHidden); - opts::SectionsShort.setHiddenFlag(cl::NotHidden); - opts::SectionsShortUpper.setHiddenFlag(cl::NotHidden); - opts::SymbolsShort.setHiddenFlag(cl::NotHidden); - - opts::WideOutput.setHiddenFlag(cl::Hidden); - - if (sys::path::stem(argv[0]).find("readelf") != StringRef::npos) + if (sys::path::stem(argv[0]).contains("readelf")) { opts::Output = opts::GNU; + registerReadelfAliases(); + } else { + registerReadobjAliases(); + } cl::ParseCommandLineOptions(argc, argv, "LLVM Object Reader\n"); + if (opts::All) { + opts::FileHeaders = true; + opts::ProgramHeaders = true; + opts::SectionHeaders = true; + opts::Symbols = true; + opts::Relocations = true; + opts::DynamicTable = true; + opts::Notes = true; + opts::VersionInfo = true; + opts::UnwindInfo = true; + opts::SectionGroups = true; + opts::HashHistogram = true; + } + // Default to stdin if no filename is specified. if (opts::InputFilenames.size() == 0) opts::InputFilenames.push_back("-"); |