From d8e65585f7c7cddd63920d122a9e6368d91c9389 Mon Sep 17 00:00:00 2001 From: Alex Orlov <aorlov@accesssoftek.com> Date: Wed, 12 May 2021 12:39:30 +0400 Subject: [PATCH] Fixed llvm-objcopy to add correct symbol table for ELF with program headers. This fixes the following bugs: https://bugs.llvm.org/show_bug.cgi?id=43935 Reviewed By: jhenderson Differential Revision: https://reviews.llvm.org/D102258 --- .../ELF/add-symbol-no-symtab.test | 23 +++++++++++++++++++ llvm/tools/llvm-objcopy/ELF/Object.cpp | 4 ++++ 2 files changed, 27 insertions(+) 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 index d428d079efbf..292fe4d921ad 100644 --- 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 @@ DynamicSymbols: 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 index 0ac8b3a0c212..6764b30c9feb 100644 --- a/llvm/tools/llvm-objcopy/ELF/Object.cpp +++ b/llvm/tools/llvm-objcopy/ELF/Object.cpp @@ -1205,6 +1205,10 @@ static bool sectionWithinSegment(const SectionBase &Sec, const Segment &Seg) { // not the first. uint64_t SecSize = Sec.Size ? Sec.Size : 1; + // Ignore just added sections. + if (Sec.OriginalOffset == std::numeric_limits<uint64_t>::max()) + return false; + if (Sec.Type == SHT_NOBITS) { if (!(Sec.Flags & SHF_ALLOC)) return false;