Index: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp =================================================================== --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ llvm/trunk/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; Index: llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/ELF_STT_FILE.s =================================================================== --- llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/ELF_STT_FILE.s +++ llvm/trunk/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 Index: llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_FILE.s =================================================================== --- llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_FILE.s +++ llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_FILE.s @@ -0,0 +1,3 @@ +.file "foo.c" +.global bar.c +bar.c: Index: llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_GLOBAL.s =================================================================== --- llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_GLOBAL.s +++ llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ELF_STT_FILE_GLOBAL.s @@ -0,0 +1,2 @@ +.global foo.c +foo.c: