From 76327d9cf598a17eb69ea928ca43fbacb6cc535e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 3 Jan 2008 07:10:51 +0000 Subject: [PATCH] =?UTF-8?q?Fix=20PR1873,=20a=20problem=20finding=20stat-re?= =?UTF-8?q?lated=20symbols=20on=20linux,=20due=20to=20"libc=5Fnonshared.a"?= =?UTF-8?q?.=20Patch=20by=20Edwin=20T=C3=B6r=C3=B6k!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45532 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/ExecutionEngine/JIT/Intercept.cpp | 29 ++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/ExecutionEngine/JIT/Intercept.cpp b/lib/ExecutionEngine/JIT/Intercept.cpp index ce5ac6ad18f..3e08ddbd250 100644 --- a/lib/ExecutionEngine/JIT/Intercept.cpp +++ b/lib/ExecutionEngine/JIT/Intercept.cpp @@ -50,16 +50,27 @@ static void runAtExitHandlers() { #if defined(HAVE_SYS_STAT_H) #include #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.