[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

llvm-svn: 250942
This commit is contained in:
Keno Fischer 2015-10-21 20:22:04 +00:00
parent dccad5b9c3
commit ddad187ce7
4 changed files with 21 additions and 1 deletions

View 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;

View File

@ -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

View File

@ -0,0 +1,3 @@
.file "foo.c"
.global bar.c
bar.c:

View File

@ -0,0 +1,2 @@
.global foo.c
foo.c: