Index: test/tools/llvm-objcopy/ELF/group-addr-misaligned.test =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/ELF/group-addr-misaligned.test @@ -0,0 +1,38 @@ +# RUN: yaml2obj %s > %t +# RUN: not llvm-objcopy %t %t2 2>&1 | FileCheck %s +# CHECK: error: Invalid alignment 1 of group section .group. + +# In this test, we check that llvm-objcopy reports an error +# for SHT_GROUP section with invalid alignment (not a multiple of 4). + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: +## It is not important for passing the test case to have this placeholder, +## but having it would trigger ubsan failure when writing the group section +## into a file if the error tested would not be reported by llvm-objcopy. + - Name: .placeholder + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000001 + Content: "00" + - Name: .group + Type: SHT_GROUP + Link: .symtab + AddressAlign: 0x0000000000000001 + Info: foo + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .text.foo + - Name: .text.foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] + AddressAlign: 0x0000000000000001 +Symbols: + Local: + - Name: foo + Section: .group Index: tools/llvm-objcopy/ELF/Object.cpp =================================================================== --- tools/llvm-objcopy/ELF/Object.cpp +++ tools/llvm-objcopy/ELF/Object.cpp @@ -957,6 +957,9 @@ template void ELFBuilder::initGroupSection(GroupSection *GroupSec) { auto SecTable = Obj.sections(); + if (GroupSec->Align % sizeof(ELF::Elf32_Word) != 0) + error("Invalid alignment " + Twine(GroupSec->Align) + " of group section " + + GroupSec->Name); auto SymTab = SecTable.template getSectionOfType( GroupSec->Link, "Link field value " + Twine(GroupSec->Link) + " in section " +