[llvm] [llvm-objdump] print out xcoff file header and load section header for xcoff object file with option private-headers (PR #96350)

Chen Zheng via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 4 19:06:03 PDT 2024


================
@@ -30,10 +32,131 @@ using namespace llvm::support;
 
 namespace {
 class XCOFFDumper : public objdump::Dumper {
+  const XCOFFObjectFile &Obj;
+  unsigned Width;
 public:
-  XCOFFDumper(const object::XCOFFObjectFile &O) : Dumper(O) {}
-  void printPrivateHeaders() override {}
+  XCOFFDumper(const object::XCOFFObjectFile &O) : Dumper(O), Obj(O) {}
+  void printPrivateHeaders() override;
+  void printFileHeader();
+  void printAuxiliaryHeader(){};
+  void printLoaderSectionHeader();
+  FormattedString formatName(StringRef Name);
+  void printHex(StringRef Name, uint64_t Value);
+  void printNumber(StringRef Name, uint64_t Value);
+  void printStrHex(StringRef Name, StringRef Str, uint64_t Value);
+  void setWidth(unsigned W) {Width =W;};
 };
+
+void XCOFFDumper::printPrivateHeaders() {
+  printFileHeader();
+  printAuxiliaryHeader();
+  printLoaderSectionHeader();
----------------
chenzheng1030 wrote:

OK, thank you Digger. Maybe we should first decide what contents do we plan to display in `llvm-objdump --private-header`.

With GNU's objdump, I see:
```
$/opt/freeware/bin/objdump --help
  -p, --private-headers    Display object format specific file header contents
  -P, --private=OPT,OPT... Display object format specific contents

Options supported for -P/--private switch:
For XCOFF files:
  header      Display the file header
  aout        Display the auxiliary header
  sections    Display the section headers
  syms        Display the symbols table
  relocs      Display the relocation entries
  lineno      Display the line number entries
  loader      Display loader section
  except      Display exception table
  typchk      Display type-check section
  traceback   Display traceback tags
  toc         Display toc symbols
  ldinfo      Display loader info in core files
```

With GNU's `objdump --private-headers sharedlib`, I saw:
```
$/opt/freeware/bin/objdump --private-header libtest.a

libtest.a:     file format aixcoff-rs6000
```

With GNU's `objdump --private=loader sharedlib`, I saw:
```
$/opt/freeware/bin/objdump --private=loader libtest.a
libtest.a:     file format aixcoff-rs6000
Loader header:
  version:           1
  nbr symbols:       2
  nbr relocs:        3
  import strtab len: 174
  nbr import files:  1
  import file off:   116
  string table len:  0
  string table off:  0
Dynamic symbols:
     # value     sc IFEW ty class file  pa name
     0 20000164   2   E  SD RW       0   0 a
     1 20000168   2   E  SD DS       0   0 foo
Dynamic relocs:
  vaddr    sec    sz typ   sym
  20000168   2 U  32 POS   .text
  2000016c   2 U  32 POS   .data
  20000174   2 U  32 POS   0
Import files:
  0: /usr/lib:/lib,,
```

If we are going to display loader section content in `llvm-objdump --private-header`, that's fine for me only if we doc the implementation well in the `--help`.

Let me know your thoughts, Thanks again, Digger.

https://github.com/llvm/llvm-project/pull/96350


More information about the llvm-commits mailing list