diff --git a/llvm/test/Object/obj2yaml.test b/llvm/test/Object/obj2yaml.test --- a/llvm/test/Object/obj2yaml.test +++ b/llvm/test/Object/obj2yaml.test @@ -599,6 +599,21 @@ ELF-AVR-NEXT: Type: ET_EXEC ELF-AVR-NEXT: Machine: EM_AVR ELF-AVR-NEXT: Flags: [ EF_AVR_ARCH_AVR2 ] +ELF-AVR-NEXT: ProgramHeaders: +ELF-AVR-NEXT: - Type: PT_LOAD +ELF-AVR-NEXT: Flags: [ PF_X, PF_R ] +ELF-AVR-NEXT: Align: 0x0000000000000002 +ELF-AVR-NEXT: FileSize: 0x0000000000000004 +ELF-AVR-NEXT: MemSize: 0x0000000000000004 +ELF-AVR-NEXT: Offset: 0x0000000000000074 +ELF-AVR-NEXT: - Type: PT_LOAD +ELF-AVR-NEXT: Flags: [ PF_W, PF_R ] +ELF-AVR-NEXT: VAddr: 0x0000000000800060 +ELF-AVR-NEXT: PAddr: 0x0000000000000004 +ELF-AVR-NEXT: Align: 0x0000000000000001 +ELF-AVR-NEXT: FileSize: 0x0000000000000000 +ELF-AVR-NEXT: MemSize: 0x0000000000000000 +ELF-AVR-NEXT: Offset: 0x0000000000000078 ELF-AVR-NEXT: Sections: ELF-AVR-NEXT: - Name: .text ELF-AVR-NEXT: Type: SHT_PROGBITS diff --git a/llvm/test/tools/obj2yaml/program-headers.yaml b/llvm/test/tools/obj2yaml/program-headers.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/tools/obj2yaml/program-headers.yaml @@ -0,0 +1,66 @@ +# RUN: yaml2obj %s -o %t +# RUN: obj2yaml %t | FileCheck %s + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +ProgramHeaders: + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + VAddr: 0xAAAA4000 + PAddr: 0xFFFF4000 + Align: 0x4000 + Sections: + - Section: .foo + - Type: PT_NOTE + Flags: [ PF_R ] + VAddr: 0xAAAA7000 + PAddr: 0xFFFF7000 + Sections: + - Section: .bar + - Type: 0x1234 + Flags: [ PF_R ] + VAddr: 0xAAAA9000 + PAddr: 0xFFFF9000 + Sections: + - Section: .bar +Sections: + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000001000 + Content: "0000000000000000" + - Name: .bar + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + Content: "00000000" + AddressAlign: 0x0000000000001000 + +# CHECK: ProgramHeaders: +# CHECK-NEXT: - Type: PT_LOAD +# CHECK-NEXT: Flags: [ PF_X, PF_R ] +# CHECK-NEXT: VAddr: 0x00000000AAAA4000 +# CHECK-NEXT: PAddr: 0x00000000FFFF4000 +# CHECK-NEXT: Align: 0x0000000000004000 +# CHECK-NEXT: FileSize: 0x0000000000000008 +# CHECK-NEXT: MemSize: 0x0000000000000008 +# CHECK-NEXT: Offset: 0x0000000000001000 +# CHECK-NEXT: - Type: PT_NOTE +# CHECK-NEXT: Flags: [ PF_R ] +# CHECK-NEXT: VAddr: 0x00000000AAAA7000 +# CHECK-NEXT: PAddr: 0x00000000FFFF7000 +# CHECK-NEXT: Align: 0x0000000000001000 +# CHECK-NEXT: FileSize: 0x0000000000000004 +# CHECK-NEXT: MemSize: 0x0000000000000004 +# CHECK-NEXT: Offset: 0x0000000000002000 +# CHECK-NEXT: - Type: 0x00001234 +# CHECK-NEXT: Flags: [ PF_R ] +# CHECK-NEXT: VAddr: 0x00000000AAAA9000 +# CHECK-NEXT: PAddr: 0x00000000FFFF9000 +# CHECK-NEXT: Align: 0x0000000000001000 +# CHECK-NEXT: FileSize: 0x0000000000000004 +# CHECK-NEXT: MemSize: 0x0000000000000004 +# CHECK-NEXT: Offset: 0x0000000000002000 diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp --- a/llvm/tools/obj2yaml/elf2yaml.cpp +++ b/llvm/tools/obj2yaml/elf2yaml.cpp @@ -22,6 +22,7 @@ class ELFDumper { typedef object::Elf_Sym_Impl Elf_Sym; typedef typename ELFT::Dyn Elf_Dyn; + typedef typename ELFT::Phdr Elf_Phdr; typedef typename ELFT::Shdr Elf_Shdr; typedef typename ELFT::Word Elf_Word; typedef typename ELFT::Rel Elf_Rel; @@ -123,6 +124,24 @@ Y->Header.Flags = Obj.getHeader()->e_flags; Y->Header.Entry = Obj.getHeader()->e_entry; + auto PhdrRangeOrErr = Obj.program_headers(); + if (!PhdrRangeOrErr) + return errorToErrorCode(PhdrRangeOrErr.takeError()); + + for (const Elf_Phdr &Phdr : *PhdrRangeOrErr) { + ELFYAML::ProgramHeader PH; + PH.Type = Phdr.p_type; + PH.Flags = Phdr.p_flags; + PH.VAddr = Phdr.p_vaddr; + PH.PAddr = Phdr.p_paddr; + // Optional fields + PH.Align = {Phdr.p_align}; + PH.Offset = {Phdr.p_offset}; + PH.FileSize = {Phdr.p_filesz}; + PH.MemSize = {Phdr.p_memsz}; + Y->ProgramHeaders.push_back(PH); + } + const Elf_Shdr *Symtab = nullptr; const Elf_Shdr *DynSymtab = nullptr;