diff options
-rw-r--r-- | llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 10 | ||||
-rw-r--r-- | llvm/test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_debug_frame.s | 20 |
2 files changed, 27 insertions, 3 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index e9a4b71c903..ab86e5d6a0f 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -705,7 +705,7 @@ RuntimeDyldImpl::emitSection(const ObjectFile &Obj, unsigned Alignment = (unsigned)Alignment64 & 0xffffffffL; unsigned PaddingSize = 0; unsigned StubBufSize = 0; - bool IsRequired = isRequiredForExecution(Section) || ProcessAllSections; + bool IsRequired = isRequiredForExecution(Section); bool IsVirtual = Section.isVirtual(); bool IsZeroInit = isZeroInit(Section); bool IsReadOnly = isReadOnlyData(Section); @@ -745,8 +745,8 @@ RuntimeDyldImpl::emitSection(const ObjectFile &Obj, Alignment = std::max(Alignment, getStubAlignment()); // Some sections, such as debug info, don't need to be loaded for execution. - // Leave those where they are. - if (IsRequired) { + // Process those only if explicitly requested. + if (IsRequired || ProcessAllSections) { Allocate = DataSize + PaddingSize + StubBufSize; if (!Allocate) Allocate = 1; @@ -790,6 +790,10 @@ RuntimeDyldImpl::emitSection(const ObjectFile &Obj, Sections.push_back( SectionEntry(Name, Addr, DataSize, Allocate, (uintptr_t)pData)); + // Debug info sections are linked as if their load address was zero + if (!IsRequired) + Sections.back().setLoadAddress(0); + if (Checker) Checker->registerSection(Obj.getFileName(), SectionID); diff --git a/llvm/test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_debug_frame.s b/llvm/test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_debug_frame.s new file mode 100644 index 00000000000..8f907a6c499 --- /dev/null +++ b/llvm/test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_debug_frame.s @@ -0,0 +1,20 @@ +# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj -o %T/ELF_x86-64_debug_frame.o %s +# RUN: llvm-rtdyld -triple=x86_64-pc-linux -verify -check=%s %T/ELF_x86-64_debug_frame.o + + .text + .file "debug_frame_test.c" + .align 16, 0x90 + .type foo,@function +foo: + .cfi_startproc + retq +.Ltmp0: + .size foo, .Ltmp0-foo + .cfi_endproc + .cfi_sections .debug_frame + +# Check that .debug_frame is mapped to 0. +# rtdyld-check: section_addr(ELF_x86-64_debug_frame.o, .debug_frame) = 0 + +# Check that The relocated FDE's CIE offset also points to zero. +# rtdyld-check: *{4}(section_addr(ELF_x86-64_debug_frame.o, .debug_frame) + 0x1C) = 0 |