From 96e450b3b2de5dbd43b37bc6ae5350e76863998e Mon Sep 17 00:00:00 2001 From: Brian Gaeke Date: Tue, 9 Mar 2004 05:22:10 +0000 Subject: [PATCH] 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. llvm-svn: 12256 --- llvm/lib/ExecutionEngine/JIT/Intercept.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/llvm/lib/ExecutionEngine/JIT/Intercept.cpp b/llvm/lib/ExecutionEngine/JIT/Intercept.cpp index 0b1b976836b5..e4b9cc176771 100644 --- a/llvm/lib/ExecutionEngine/JIT/Intercept.cpp +++ b/llvm/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() {}