[PATCH] D13888: [RuntimeDyld] Ignore ST_FILE symbols when constructing GlobalSymbolTable

Keno Fischer via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 20 05:30:24 PDT 2015


loladiro created this revision.
loladiro added a reviewer: lhames.
loladiro added a subscriber: llvm-commits.
loladiro set the repository for this revision to rL LLVM.

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.

Repository:
  rL LLVM

http://reviews.llvm.org/D13888

Files:
  lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
  test/ExecutionEngine/RuntimeDyld/X86/ELF_STT_FILE.s
  test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_FILE.s
  test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_GLOBAL.s

Index: test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_GLOBAL.s
===================================================================
--- /dev/null
+++ test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_GLOBAL.s
@@ -0,0 +1,2 @@
+.global foo.c
+foo.c:
Index: test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_FILE.s
===================================================================
--- /dev/null
+++ test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_FILE.s
@@ -0,0 +1,3 @@
+.file "foo.c"
+.global bar.c
+bar.c:
Index: test/ExecutionEngine/RuntimeDyld/X86/ELF_STT_FILE.s
===================================================================
--- /dev/null
+++ 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 at GOTPCREL(%rip), %rax
+    movq    bar.c at GOTPCREL(%rip), %rax
+    movq    $0, %rax
+    retq
Index: lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
===================================================================
--- lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
+++ lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
@@ -179,7 +179,8 @@
       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;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D13888.37860.patch
Type: text/x-patch
Size: 2211 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151020/3f5f5843/attachment.bin>


More information about the llvm-commits mailing list