mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
[yaml2obj][ELF] Add support for setting alignment in program headers
Sometimes program headers have larger alignments than any of the sections they contain. Currently yaml2obj can't produce such files. A bug recently appeared in llvm-objcopy that failed in such a case. I'd like to be able to add tests to llvm-objcopy for such cases. This change adds an optional alignment parameter to program headers that will be used instead of calculating the alignment. Differential Revision: https://reviews.llvm.org/D39130 llvm-svn: 317139
This commit is contained in:
parent
300e12b60f
commit
9584905a27
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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 {
|
||||
|
63
test/tools/yaml2obj/program-header-align.yaml
Normal file
63
test/tools/yaml2obj/program-header-align.yaml
Normal file
@ -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:]
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user