[JITLink][ELF] Skip DWARF sections in ELF objects.

This matches current JITLink/MachO behavior and avoids processing currently
unsupported relocations.
This commit is contained in:
Lang Hames 2021-01-18 11:39:32 +11:00
parent b74ae43c44
commit a817f46d50
2 changed files with 290 additions and 0 deletions

View File

@ -24,6 +24,7 @@ using namespace llvm::jitlink;
using namespace llvm::jitlink::ELF_x86_64_Edges;
namespace {
class ELF_x86_64_GOTAndStubsBuilder
: public BasicGOTAndStubsBuilder<ELF_x86_64_GOTAndStubsBuilder> {
public:
@ -110,6 +111,14 @@ private:
Section *GOTSection = nullptr;
Section *StubsSection = nullptr;
};
const char *const DwarfSectionNames[] = {
#define HANDLE_DWARF_SECTION(ENUM_NAME, ELF_NAME, CMDLINE_NAME, OPTION) \
ELF_NAME,
#include "llvm/BinaryFormat/Dwarf.def"
#undef HANDLE_DWARF_SECTION
};
} // namespace
const uint8_t ELF_x86_64_GOTAndStubsBuilder::NullGOTEntryContent[8] = {
@ -191,6 +200,14 @@ static Error optimizeELF_x86_64_GOTAndStubs(LinkGraph &G) {
return Error::success();
}
static bool isDwarfSection(StringRef SectionName) {
for (auto &DwarfSectionName : DwarfSectionNames)
if (SectionName == DwarfSectionName)
return true;
return false;
}
namespace llvm {
namespace jitlink {
@ -305,6 +322,16 @@ private:
auto Name = Obj.getSectionName(SecRef);
if (!Name)
return Name.takeError();
// Skip Dwarf sections.
if (isDwarfSection(*Name)) {
LLVM_DEBUG({
dbgs() << *Name
<< " is a debug section: No graph section will be created.\n";
});
continue;
}
sys::Memory::ProtectionFlags Prot;
if (SecRef.sh_flags & ELF::SHF_EXECINSTR) {
Prot = static_cast<sys::Memory::ProtectionFlags>(sys::Memory::MF_READ |
@ -373,6 +400,10 @@ private:
auto RelSectName = Obj.getSectionName(SecRef);
if (!RelSectName)
return RelSectName.takeError();
LLVM_DEBUG({
dbgs() << "Adding relocations from section " << *RelSectName << "\n";
});
// Deal with .eh_frame later
if (*RelSectName == StringRef(".rela.eh_frame"))
continue;
@ -385,6 +416,18 @@ private:
if (!UpdateSectionName)
return UpdateSectionName.takeError();
// Don't process relocations for debug sections.
if (isDwarfSection(*UpdateSectionName)) {
LLVM_DEBUG({
dbgs() << " Target is dwarf section " << *UpdateSectionName
<< ". Skipping.\n";
});
continue;
} else
LLVM_DEBUG({
dbgs() << " For target section " << *UpdateSectionName << "\n";
});
auto JITSection = G->findSectionByName(*UpdateSectionName);
if (!JITSection)
return make_error<llvm::StringError>(
@ -473,6 +516,9 @@ private:
auto Name = Obj.getSectionName(SecRef);
if (!Name)
return Name.takeError();
LLVM_DEBUG(dbgs() << "Processing symbol section " << *Name << ":\n");
auto Section = G->findSectionByName(*Name);
if (!Section)
return make_error<llvm::StringError>("Could not find a section " +
@ -531,6 +577,10 @@ private:
if (!sectName)
return Name.takeError();
// Skip debug section symbols.
if (isDwarfSection(*sectName))
continue;
auto JitSection = G->findSectionByName(*sectName);
if (!JitSection)
return make_error<llvm::StringError>(

View File

@ -0,0 +1,240 @@
# RUN: llvm-mc -triple=x86_64-pc-linux-gnu -filetype=obj -o %t %s
# RUN: llvm-jitlink -debug-only=jitlink -noexec %t 2>&1 | FileCheck %s
#
# Check that debug sections are not emitted.
#
# CHECK: .debug_info is a debug section: No graph section will be created.
.text
.file "ELF_skip_debug_sections.c"
.globl foo
.p2align 4, 0x90
.type foo,@function
foo:
.Lfunc_begin0:
.file 1 "/tmp" "ELF_skip_debug_sections.c"
.loc 1 1 0
.cfi_startproc
.loc 1 2 3 prologue_end
movl $42, %eax
retq
.Ltmp0:
.Lfunc_end0:
.size foo, .Lfunc_end0-foo
.cfi_endproc
.globl main
.p2align 4, 0x90
.type main,@function
main:
.Lfunc_begin1:
.loc 1 5 0
.cfi_startproc
.loc 1 6 3 prologue_end
movl $42, %eax
retq
.Ltmp1:
.Lfunc_end1:
.size main, .Lfunc_end1-main
.cfi_endproc
.section .debug_str,"MS",@progbits,1
.Linfo_string0:
.asciz "clang version 10.0.0-4ubuntu1 "
.Linfo_string1:
.asciz "ELF_skip_debug_sections.c"
.Linfo_string2:
.asciz "/tmp"
.Linfo_string3:
.asciz "foo"
.Linfo_string4:
.asciz "int"
.Linfo_string5:
.asciz "main"
.Linfo_string6:
.asciz "argc"
.Linfo_string7:
.asciz "argv"
.Linfo_string8:
.asciz "char"
.section .debug_abbrev,"",@progbits
.byte 1
.byte 17
.byte 1
.byte 37
.byte 14
.byte 19
.byte 5
.byte 3
.byte 14
.byte 16
.byte 23
.byte 27
.byte 14
.byte 17
.byte 1
.byte 18
.byte 6
.byte 0
.byte 0
.byte 2
.byte 46
.byte 0
.byte 17
.byte 1
.byte 18
.byte 6
.byte 64
.byte 24
.ascii "\227B"
.byte 25
.byte 3
.byte 14
.byte 58
.byte 11
.byte 59
.byte 11
.byte 39
.byte 25
.byte 73
.byte 19
.byte 63
.byte 25
.byte 0
.byte 0
.byte 3
.byte 46
.byte 1
.byte 17
.byte 1
.byte 18
.byte 6
.byte 64
.byte 24
.ascii "\227B"
.byte 25
.byte 3
.byte 14
.byte 58
.byte 11
.byte 59
.byte 11
.byte 39
.byte 25
.byte 73
.byte 19
.byte 63
.byte 25
.byte 0
.byte 0
.byte 4
.byte 5
.byte 0
.byte 2
.byte 24
.byte 3
.byte 14
.byte 58
.byte 11
.byte 59
.byte 11
.byte 73
.byte 19
.byte 0
.byte 0
.byte 5
.byte 36
.byte 0
.byte 3
.byte 14
.byte 62
.byte 11
.byte 11
.byte 11
.byte 0
.byte 0
.byte 6
.byte 15
.byte 0
.byte 73
.byte 19
.byte 0
.byte 0
.byte 0
.section .debug_info,"",@progbits
.Lcu_begin0:
.long .Ldebug_info_end0-.Ldebug_info_start0
.Ldebug_info_start0:
.short 4
.long .debug_abbrev
.byte 8
.byte 1
.long .Linfo_string0
.short 12
.long .Linfo_string1
.long .Lline_table_start0
.long .Linfo_string2
.quad .Lfunc_begin0
.long .Lfunc_end1-.Lfunc_begin0
.byte 2
.quad .Lfunc_begin0
.long .Lfunc_end0-.Lfunc_begin0
.byte 1
.byte 87
.long .Linfo_string3
.byte 1
.byte 1
.long 119
.byte 3
.quad .Lfunc_begin1
.long .Lfunc_end1-.Lfunc_begin1
.byte 1
.byte 87
.long .Linfo_string5
.byte 1
.byte 5
.long 119
.byte 4
.byte 1
.byte 85
.long .Linfo_string6
.byte 1
.byte 5
.long 119
.byte 4
.byte 1
.byte 84
.long .Linfo_string7
.byte 1
.byte 5
.long 126
.byte 0
.byte 5
.long .Linfo_string4
.byte 5
.byte 4
.byte 6
.long 131
.byte 6
.long 136
.byte 5
.long .Linfo_string8
.byte 6
.byte 1
.byte 0
.Ldebug_info_end0:
.ident "clang version 10.0.0-4ubuntu1 "
.section ".note.GNU-stack","",@progbits
.addrsig
.section .debug_line,"",@progbits
.Lline_table_start0: