[RuntimeDyld] Ignore ST_FILE symbols when constructing GlobalSymbolTable
authorKeno Fischer <kfischer@college.harvard.edu>
Wed, 21 Oct 2015 20:22:04 +0000 (20:22 +0000)
committerKeno Fischer <kfischer@college.harvard.edu>
Wed, 21 Oct 2015 20:22:04 +0000 (20:22 +0000)
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

lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
test/ExecutionEngine/RuntimeDyld/X86/ELF_STT_FILE.s [new file with mode: 0644]
test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_FILE.s [new file with mode: 0644]
test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_GLOBAL.s [new file with mode: 0644]

index 1c276a8728ad85c8b8eaecb41741e5c52eb1ff2f..f24a49e8b292c7c774ae363adcc4fdebbcee16a4 100644 (file)
@@ -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 (file)
index 0000000..50cc650
--- /dev/null
@@ -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 (file)
index 0000000..7280c51
--- /dev/null
@@ -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 (file)
index 0000000..a7e5342
--- /dev/null
@@ -0,0 +1,2 @@
+.global foo.c
+foo.c: