ELFDumper(const ELFFile<ELFT> *Obj, ScopedPrinter &Writer);
void printFileHeaders() override;
- void printSections() override;
+ void printSectionHeaders() override;
void printRelocations() override;
void printDynamicRelocations() override;
void printSymbols() override;
virtual void printFileHeaders(const ELFFile<ELFT> *Obj) = 0;
virtual void printGroupSections(const ELFFile<ELFT> *Obj) = 0;
virtual void printRelocations(const ELFFile<ELFT> *Obj) = 0;
- virtual void printSections(const ELFFile<ELFT> *Obj) = 0;
+ virtual void printSectionHeaders(const ELFFile<ELFT> *Obj) = 0;
virtual void printSymbols(const ELFFile<ELFT> *Obj) = 0;
virtual void printDynamicSymbols(const ELFFile<ELFT> *Obj) = 0;
virtual void printDynamicRelocations(const ELFFile<ELFT> *Obj) = 0;
void printFileHeaders(const ELFO *Obj) override;
void printGroupSections(const ELFFile<ELFT> *Obj) override;
void printRelocations(const ELFO *Obj) override;
- void printSections(const ELFO *Obj) override;
+ void printSectionHeaders(const ELFO *Obj) override;
void printSymbols(const ELFO *Obj) override;
void printDynamicSymbols(const ELFO *Obj) override;
void printDynamicRelocations(const ELFO *Obj) override;
void printGroupSections(const ELFFile<ELFT> *Obj) override;
void printRelocations(const ELFO *Obj) override;
void printRelocations(const Elf_Shdr *Sec, const ELFO *Obj);
- void printSections(const ELFO *Obj) override;
+ void printSectionHeaders(const ELFO *Obj) override;
void printSymbols(const ELFO *Obj) override;
void printDynamicSymbols(const ELFO *Obj) override;
void printDynamicRelocations(const ELFO *Obj) override;
ELFDumperStyle->printFileHeaders(Obj);
}
-template<class ELFT>
-void ELFDumper<ELFT>::printSections() {
- ELFDumperStyle->printSections(Obj);
+template <class ELFT> void ELFDumper<ELFT>::printSectionHeaders() {
+ ELFDumperStyle->printSectionHeaders(Obj);
}
template<class ELFT>
return "";
}
-template <class ELFT> void GNUStyle<ELFT>::printSections(const ELFO *Obj) {
+template <class ELFT>
+void GNUStyle<ELFT>::printSectionHeaders(const ELFO *Obj) {
size_t SectionIndex = 0;
std::string Number, Type, Size, Address, Offset, Flags, Link, Info, EntrySize,
Alignment;
}
}
-template <class ELFT> void LLVMStyle<ELFT>::printSections(const ELFO *Obj) {
+template <class ELFT>
+void LLVMStyle<ELFT>::printSectionHeaders(const ELFO *Obj) {
ListScope SectionsD(W, "Sections");
int SectionIndex = -1;
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",
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"));
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",
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"),
"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>
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"),
if (opts::FileHeaders)
Dumper->printFileHeaders();
- if (opts::Sections)
- Dumper->printSections();
+ if (opts::SectionHeaders)
+ Dumper->printSectionHeaders();
if (opts::Relocations)
Dumper->printRelocations();
if (opts::DynRelocs)
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("-");