diff options
author | Chris Lattner <sabre@nondot.org> | 2008-01-03 07:10:51 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-01-03 07:10:51 +0000 |
commit | 705dc51f2c2bc19ff3cdc554920596354800b3ce (patch) | |
tree | 503396bd25cb252b0b4dab09addb0ba9733a1fa0 /llvm/lib/ExecutionEngine/JIT/Intercept.cpp | |
parent | 1800c18ebd1c9ad5ea953ff85ba0fbe7361b00e2 (diff) | |
download | bcm5719-llvm-705dc51f2c2bc19ff3cdc554920596354800b3ce.tar.gz bcm5719-llvm-705dc51f2c2bc19ff3cdc554920596354800b3ce.zip |
Fix PR1873, a problem finding stat-related symbols on linux, due to
"libc_nonshared.a". Patch by Edwin Török!
llvm-svn: 45532
Diffstat (limited to 'llvm/lib/ExecutionEngine/JIT/Intercept.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/JIT/Intercept.cpp | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/llvm/lib/ExecutionEngine/JIT/Intercept.cpp b/llvm/lib/ExecutionEngine/JIT/Intercept.cpp index ce5ac6ad18f..3e08ddbd250 100644 --- a/llvm/lib/ExecutionEngine/JIT/Intercept.cpp +++ b/llvm/lib/ExecutionEngine/JIT/Intercept.cpp @@ -50,16 +50,27 @@ static void runAtExitHandlers() { #if defined(HAVE_SYS_STAT_H) #include <sys/stat.h> #endif -void *FunctionPointers[] = { - (void *)(intptr_t) stat, - (void *)(intptr_t) fstat, - (void *)(intptr_t) lstat, - (void *)(intptr_t) stat64, - (void *)(intptr_t) fstat64, - (void *)(intptr_t) lstat64, - (void *)(intptr_t) atexit, - (void *)(intptr_t) mknod + +/* stat functions are redirecting to __xstat with a version number. + * On x86-64 linking with libc_nonshared.a and -Wl,--export-dynamic + * doesn't make 'stat' available as an exported symbol, so we have to add it explicitely.*/ +class StatSymbols { + public: + StatSymbols() { + sys::DynamicLibrary::AddSymbol("stat", (void*)(intptr_t)stat); + sys::DynamicLibrary::AddSymbol("fstat", (void*)(intptr_t)fstat); + sys::DynamicLibrary::AddSymbol("fstatat", (void*)(intptr_t)fstatat); + sys::DynamicLibrary::AddSymbol("lstat", (void*)(intptr_t)lstat); + sys::DynamicLibrary::AddSymbol("stat64", (void*)(intptr_t)stat64); + sys::DynamicLibrary::AddSymbol("fstat64", (void*)(intptr_t)fstat64); + sys::DynamicLibrary::AddSymbol("fstatat64", (void*)(intptr_t)fstatat64); + sys::DynamicLibrary::AddSymbol("lstat64", (void*)(intptr_t)lstat64); + sys::DynamicLibrary::AddSymbol("atexit", (void*)(intptr_t)atexit); + sys::DynamicLibrary::AddSymbol("mknod", (void*)(intptr_t)mknod); + sys::DynamicLibrary::AddSymbol("mknodat", (void*)(intptr_t)mknodat); + } }; +static StatSymbols initStatSymbols; #endif // __linux__ // jit_exit - Used to intercept the "exit" library call. |