diff options
-rw-r--r-- | include/llvm/ObjectYAML/ELFYAML.h | 1 | ||||
-rw-r--r-- | lib/ObjectYAML/ELFYAML.cpp | 1 | ||||
-rw-r--r-- | test/tools/yaml2obj/program-header-align.yaml | 63 | ||||
-rw-r--r-- | tools/yaml2obj/yaml2elf.cpp | 20 |
4 files changed, 77 insertions, 8 deletions
diff --git a/include/llvm/ObjectYAML/ELFYAML.h b/include/llvm/ObjectYAML/ELFYAML.h index 3468979d869..e9f9eb914d9 100644 --- a/include/llvm/ObjectYAML/ELFYAML.h +++ b/include/llvm/ObjectYAML/ELFYAML.h @@ -83,6 +83,7 @@ struct ProgramHeader { ELF_PF Flags; llvm::yaml::Hex64 VAddr; llvm::yaml::Hex64 PAddr; + Optional<llvm::yaml::Hex64> Align; std::vector<SectionName> Sections; }; diff --git a/lib/ObjectYAML/ELFYAML.cpp b/lib/ObjectYAML/ELFYAML.cpp index b19a57585a3..ada9ff89b8e 100644 --- a/lib/ObjectYAML/ELFYAML.cpp +++ b/lib/ObjectYAML/ELFYAML.cpp @@ -719,6 +719,7 @@ void MappingTraits<ELFYAML::ProgramHeader>::mapping( IO.mapOptional("Sections", Phdr.Sections); IO.mapOptional("VAddr", Phdr.VAddr, Hex64(0)); IO.mapOptional("PAddr", Phdr.PAddr, Hex64(0)); + IO.mapOptional("Align", Phdr.Align); } namespace { diff --git a/test/tools/yaml2obj/program-header-align.yaml b/test/tools/yaml2obj/program-header-align.yaml new file mode 100644 index 00000000000..de51f5dc070 --- /dev/null +++ b/test/tools/yaml2obj/program-header-align.yaml @@ -0,0 +1,63 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj -program-headers %t | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000008 + Content: "00000000" + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Content: "00000000" + AddressAlign: 0x0000000000000010 +ProgramHeaders: + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + VAddr: 0xAAAA1030 + PAddr: 0xFFFF1030 + Align: 0x1000 + Sections: + - Section: .text + - Type: PT_LOAD + Flags: [ PF_R ] + VAddr: 0xAAAA2040 + PAddr: 0xFFFF2040 + Align: 0x1000 + Sections: + - Section: .data + +#CHECK: ProgramHeaders [ +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD +#CHECK-NEXT: Offset: 0x230 +#CHECK-NEXT: VirtualAddress: 0xAAAA1030 +#CHECK-NEXT: PhysicalAddress: 0xFFFF1030 +#CHECK-NEXT: FileSize: 4 +#CHECK-NEXT: MemSize: 4 +#CHECK-NEXT: Flags [ +#CHECK-NEXT: PF_R +#CHECK-NEXT: PF_X +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD +#CHECK-NEXT: Offset: 0x240 +#CHECK-NEXT: VirtualAddress: 0xAAAA2040 +#CHECK-NEXT: PhysicalAddress: 0xFFFF2040 +#CHECK-NEXT: FileSize: 4 +#CHECK-NEXT: MemSize: 4 +#CHECK-NEXT: Flags [ +#CHECK-NEXT: PF_R +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT:] diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index 9328048c425..913f19050dc 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -378,15 +378,19 @@ void ELFState<ELFT>::setProgramHeaderLayout(std::vector<Elf_Phdr> &PHeaders, } // Set the alignment of the segment to be the same as the maximum alignment - // of the the sections with the same offset so that by default the segment + // of the sections with the same offset so that by default the segment // has a valid and sensible alignment. - PHeader.p_align = 1; - for (auto SecName : YamlPhdr.Sections) { - uint32_t Index = 0; - SN2I.lookup(SecName.Section, Index); - const auto &SHeader = SHeaders[Index]; - if (SHeader.sh_offset == PHeader.p_offset) - PHeader.p_align = std::max(PHeader.p_align, SHeader.sh_addralign); + if (YamlPhdr.Align) { + PHeader.p_align = *YamlPhdr.Align; + } else { + PHeader.p_align = 1; + for (auto SecName : YamlPhdr.Sections) { + uint32_t Index = 0; + SN2I.lookup(SecName.Section, Index); + const auto &SHeader = SHeaders[Index]; + if (SHeader.sh_offset == PHeader.p_offset) + PHeader.p_align = std::max(PHeader.p_align, SHeader.sh_addralign); + } } } } |