diff --git a/llvm/lib/ObjCopy/ELF/ELFObject.cpp b/llvm/lib/ObjCopy/ELF/ELFObject.cpp --- a/llvm/lib/ObjCopy/ELF/ELFObject.cpp +++ b/llvm/lib/ObjCopy/ELF/ELFObject.cpp @@ -1704,6 +1704,11 @@ else return Data.takeError(); case SHT_SYMTAB: { + // Duplicate SHT_SYMTAB sections are forbidden by the ELF gABI. + if (Obj.SymbolTable != nullptr) + return createStringError(llvm::errc::invalid_argument, + "found multiple SHT_SYMTAB sections. " + "Currently, an object file may have only one"); auto &SymTab = Obj.addSection(); Obj.SymbolTable = &SymTab; return SymTab; diff --git a/llvm/test/tools/llvm-objcopy/ELF/symtab-duplicate.test b/llvm/test/tools/llvm-objcopy/ELF/symtab-duplicate.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/ELF/symtab-duplicate.test @@ -0,0 +1,18 @@ +# RUN: yaml2obj %s -o %t +# RUN: not llvm-objcopy -O binary %t - 2>&1 | FileCheck %s --check-prefix=SYMTAB +# SYMTAB: found multiple SHT_SYMTAB sections. Currently, an object file may have only one + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .symtab + Type: SHT_SYMTAB + Flags: [ SHF_ALLOC ] + - Name: .symtab2 + Type: SHT_SYMTAB + Flags: [ SHF_ALLOC ] + \ No newline at end of file