diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp --- a/bolt/lib/Rewrite/RewriteInstance.cpp +++ b/bolt/lib/Rewrite/RewriteInstance.cpp @@ -3798,6 +3798,16 @@ if (RuntimeLibrary *RtLibrary = BC->getRuntimeLibrary()) RtLibrary->addRuntimeLibSections(Sections); + if (!EHFrameSection || !EHFrameSection->isFinalized()) { + ErrorOr OldEHFrameSection = + BC->getUniqueSectionByName(Twine(getOrgSecPrefix(), ".eh_frame").str()); + if (OldEHFrameSection) { + RTDyld.reassignSectionAddress(OldEHFrameSection->getSectionID(), + NextAvailableAddress); + BC->deregisterSection(*OldEHFrameSection); + } + } + for (std::string &SectionName : Sections) { ErrorOr Section = BC->getUniqueSectionByName(SectionName); if (!Section || !Section->isAllocatable() || !Section->isFinalized()) diff --git a/bolt/test/X86/dummy-eh-frame-bug.s b/bolt/test/X86/dummy-eh-frame-bug.s new file mode 100644 --- /dev/null +++ b/bolt/test/X86/dummy-eh-frame-bug.s @@ -0,0 +1,27 @@ +# REQUIRES: system-linux + +# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t.o +# RUN: ld.lld %t.o -o %t.exe -q +# RUN: llvm-bolt %t.exe -o %t.bolt.exe --funcs=nocfi_function +# RUN: llvm-readelf --section-headers %t.bolt.exe | FileCheck %s + +## Check that llvm-bolt does not allocate unmarked space for original .eh_frame +## after .text when no update is needed to .eh_frame. + +# CHECK: {{ .text}} PROGBITS [[#%x,ADDR:]] [[#%x,OFFSET:]] [[#%x,SIZE:]] +# CHECK-NEXT: 0000000000000000 [[#%x, OFFSET + SIZE]] + + .text + .globl nocfi_function + .type nocfi_function,@function +nocfi_function: + ret + .size nocfi_function, .-nocfi_function + + .globl _start + .type _start,@function +_start: + .cfi_startproc + call nocfi_function + .size _start, .-_start + .cfi_endproc