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() {}