diff --git a/llvm/test/tools/llvm-objcopy/ELF/add-symbol-no-symtab.test b/llvm/test/tools/llvm-objcopy/ELF/add-symbol-no-symtab.test --- a/llvm/test/tools/llvm-objcopy/ELF/add-symbol-no-symtab.test +++ b/llvm/test/tools/llvm-objcopy/ELF/add-symbol-no-symtab.test @@ -105,3 +105,26 @@ Binding: STB_GLOBAL Symbols: [] ... + +## Check the created .symtab is correct when there are program headers. +# RUN: yaml2obj --docnum=4 %s -o %t4 +# RUN: llvm-objcopy %t4 %t4.add --add-symbol foo=1234 +# RUN: llvm-readelf -s %t4.add | FileCheck --check-prefix=SEC4 %s + +# SEC4: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND +# SEC4-NEXT: 1: 00000000000004d2 0 NOTYPE GLOBAL DEFAULT ABS foo + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .foo + Type: SHT_PROGBITS +ProgramHeaders: + - Type: PT_LOAD + FirstSec: .foo + LastSec: .foo +... diff --git a/llvm/tools/llvm-objcopy/ELF/Object.cpp b/llvm/tools/llvm-objcopy/ELF/Object.cpp --- a/llvm/tools/llvm-objcopy/ELF/Object.cpp +++ b/llvm/tools/llvm-objcopy/ELF/Object.cpp @@ -1205,6 +1205,10 @@ // not the first. uint64_t SecSize = Sec.Size ? Sec.Size : 1; + // Ignore just added sections. + if (Sec.OriginalOffset == std::numeric_limits::max()) + return false; + if (Sec.Type == SHT_NOBITS) { if (!(Sec.Flags & SHF_ALLOC)) return false;