diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -796,8 +796,12 @@ "Section type is not SHT_REL nor SHT_RELA"); bool IsRela = Section.Type == llvm::ELF::SHT_RELA; - SHeader.sh_entsize = IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel); - SHeader.sh_size = SHeader.sh_entsize * Section.Relocations.size(); + if (Section.EntSize) + SHeader.sh_entsize = *Section.EntSize; + else + SHeader.sh_entsize = IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel); + SHeader.sh_size = (IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel)) * + Section.Relocations.size(); // For relocation section set link to .symtab by default. unsigned Link = 0; diff --git a/llvm/test/tools/yaml2obj/ELF/reloc-sec-entry-size.yaml b/llvm/test/tools/yaml2obj/ELF/reloc-sec-entry-size.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/tools/yaml2obj/ELF/reloc-sec-entry-size.yaml @@ -0,0 +1,73 @@ +## Test how yaml2obj sets values for sh_entsize fields of relocation sections. + +# RUN: yaml2obj --docnum=1 %s -o %t64 +# RUN: llvm-readelf --sections %t64 | FileCheck %s --check-prefix=ELF64 + +# RUN: yaml2obj --docnum=2 %s -o %t32 +# RUN: llvm-readelf --sections %t32 | FileCheck %s --check-prefix=ELF32 + +# ELF64: Name Type Address Off Size ES +# ELF64: .rela.default RELA 0000000000000000 000040 000000 18 +# ELF64: .rel.default REL 0000000000000000 000040 000000 10 +# ELF64: .relr.default RELR 0000000000000000 000040 000000 08 +# ELF64: .rela.custom RELA 0000000000000000 000040 000000 ff +# ELF64: .rel.custom REL 0000000000000000 000040 000000 ff +# ELF64: .relr.custom RELR 0000000000000000 000040 000000 ff + +# ELF32: Name Type Address Off Size ES +# ELF32: .rela.default RELA 00000000 000034 000000 0c +# ELF32: .rel.default REL 00000000 000034 000000 08 +# ELF32: .relr.default RELR 00000000 000034 000000 04 +# ELF32: .rela.custom RELA 00000000 000034 000000 ff +# ELF32: .rel.custom REL 00000000 000034 000000 ff +# ELF32: .relr.custom RELR 00000000 000034 000000 ff + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: +## Check default sh_entsize field values. + - Name: .rela.default + Type: SHT_RELA + - Name: .rel.default + Type: SHT_REL + - Name: .relr.default + Type: SHT_RELR +## Check we can set sh_entsize fields to arbitrary values. + - Name: .rela.custom + Type: SHT_RELA + EntSize: 0xFF + - Name: .rel.custom + Type: SHT_REL + EntSize: 0xFF + - Name: .relr.custom + Type: SHT_RELR + EntSize: 0xFF + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Sections: +## Check default sh_entsizes field values. + - Name: .rela.default + Type: SHT_RELA + - Name: .rel.default + Type: SHT_REL + - Name: .relr.default + Type: SHT_RELR +## Check we can set sh_entsize fields to arbitrary values. + - Name: .rela.custom + Type: SHT_RELA + EntSize: 0xFF + - Name: .rel.custom + Type: SHT_REL + EntSize: 0xFF + - Name: .relr.custom + Type: SHT_RELR + EntSize: 0xFF