From: Brian Gaeke Date: Tue, 9 Mar 2004 05:22:10 +0000 (+0000) Subject: Address PR274 - '[JIT] Programs cannot resolve the fstat function' X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=00f0a29e1c57d56e82b585007d1e518c35e25fc4;p=oota-llvm.git Address PR274 - '[JIT] Programs cannot resolve the fstat function' by trying to get the compiler to generate an undefined reference for it and related functions which live in libc_nonshared.a on Linux. Linkers... sigh. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12256 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ExecutionEngine/JIT/Intercept.cpp b/lib/ExecutionEngine/JIT/Intercept.cpp index 0b1b976836b..e4b9cc17677 100644 --- a/lib/ExecutionEngine/JIT/Intercept.cpp +++ b/lib/ExecutionEngine/JIT/Intercept.cpp @@ -18,6 +18,7 @@ #include "JIT.h" #include "Support/DynamicLinker.h" #include +#include using namespace llvm; // AtExitHandlers - List of functions to call when the program exits, @@ -40,6 +41,23 @@ static void runAtExitHandlers() { // Function stubs that are invoked instead of certain library calls //===----------------------------------------------------------------------===// +// Force the following functions to be linked in to anything that uses the +// JIT. This is a hack designed to work around the all-too-clever Glibc +// strategy of making these functions work differently when inlined vs. when +// not inlined, and hiding their real definitions in a separate archive file +// that the dynamic linker can't see. For more info, search for +// 'libc_nonshared.a' on Google, or read http://llvm.cs.uiuc.edu/PR274. +void *FunctionPointers[] = { + (void *) stat, + (void *) stat64, + (void *) fstat, + (void *) fstat64, + (void *) lstat, + (void *) lstat64, + (void *) atexit, + (void *) mknod +}; + // NoopFn - Used if we have nothing else to call... static void NoopFn() {}