From: Keno Fischer Date: Wed, 21 Oct 2015 20:22:04 +0000 (+0000) Subject: [RuntimeDyld] Ignore ST_FILE symbols when constructing GlobalSymbolTable X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9e6956041749816a6ec05147c7a41aa866156391;p=llvm [RuntimeDyld] Ignore ST_FILE symbols when constructing GlobalSymbolTable Summary: ELF's STT_File symbols may overlap with regular globals in other files, so we should ignore them here in order to avoid having bogus entries in the symbol table that confuse us when resolving relocations. Reviewers: lhames Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D13888 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250942 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index 1c276a8728a..f24a49e8b29 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -179,7 +179,8 @@ RuntimeDyldImpl::loadObjectImpl(const object::ObjectFile &Obj) { if (Flags & SymbolRef::SF_Exported) RTDyldSymFlags |= JITSymbolFlags::Exported; - if (Flags & SymbolRef::SF_Absolute) { + if (Flags & SymbolRef::SF_Absolute && + SymType != object::SymbolRef::ST_File) { auto Addr = I->getAddress(); Check(Addr.getError()); uint64_t SectOffset = *Addr; diff --git a/test/ExecutionEngine/RuntimeDyld/X86/ELF_STT_FILE.s b/test/ExecutionEngine/RuntimeDyld/X86/ELF_STT_FILE.s new file mode 100644 index 00000000000..50cc65079bd --- /dev/null +++ b/test/ExecutionEngine/RuntimeDyld/X86/ELF_STT_FILE.s @@ -0,0 +1,14 @@ +# RUN: llvm-mc -triple=x86_64-pc-linux -relocation-model=pic -filetype=obj -o %T/test_ELF_STT_FILE_FILE_x86-64.o %p/Inputs/ELF_STT_FILE_FILE.s +# RUN: llvm-mc -triple=x86_64-pc-linux -relocation-model=pic -filetype=obj -o %T/test_ELF_STT_FILE_GLOBAL_x86-64.o %p/Inputs/ELF_STT_FILE_GLOBAL.s +# RUN: llvm-mc -triple=x86_64-pc-linux -relocation-model=pic -filetype=obj -o %T/test_ELF_STT_FILE_x86-64.o %s +# RUN: llvm-rtdyld -triple=x86_64-pc-linux -verify %T/test_ELF_STT_FILE_GLOBAL_x86-64.o %T/test_ELF_STT_FILE_FILE_x86-64.o %T/test_ELF_STT_FILE_x86-64.o + +# Test that RTDyldELF ignores STT_FILE symbols, and in particular does +# crash if we are relocating against a symbol that happens to have the +# same name as an STT_FILE symbol. + +_main: + movq foo.c@GOTPCREL(%rip), %rax + movq bar.c@GOTPCREL(%rip), %rax + movq $0, %rax + retq diff --git a/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_FILE.s b/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_FILE.s new file mode 100644 index 00000000000..7280c51b586 --- /dev/null +++ b/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_FILE.s @@ -0,0 +1,3 @@ +.file "foo.c" +.global bar.c +bar.c: diff --git a/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_GLOBAL.s b/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_GLOBAL.s new file mode 100644 index 00000000000..a7e5342746e --- /dev/null +++ b/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_GLOBAL.s @@ -0,0 +1,2 @@ +.global foo.c +foo.c: