From 30e2817dc5bfaadde6439131b4f280a79ee03950 Mon Sep 17 00:00:00 2001 From: Brian Gaeke Date: Fri, 10 Oct 2003 17:02:42 +0000 Subject: [PATCH] Change to use GetAddressOfSymbol instead of dlsym. llvm-svn: 9012 --- lib/ExecutionEngine/ExecutionEngine.cpp | 12 ++++-------- lib/ExecutionEngine/JIT/Intercept.cpp | 15 +++++---------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/lib/ExecutionEngine/ExecutionEngine.cpp b/lib/ExecutionEngine/ExecutionEngine.cpp index b7aa3ba87f5..fb70ff1e725 100644 --- a/lib/ExecutionEngine/ExecutionEngine.cpp +++ b/lib/ExecutionEngine/ExecutionEngine.cpp @@ -16,6 +16,7 @@ #include "llvm/Target/TargetData.h" #include "Support/Debug.h" #include "Support/Statistic.h" +#include "Support/DynamicLinker.h" #include "Config/dlfcn.h" Statistic<> NumInitBytes("lli", "Number of bytes of global vars initialized"); @@ -339,14 +340,9 @@ void ExecutionEngine::emitGlobals() { DEBUG(std::cerr << "Global '" << I->getName() << "' -> " << (void*)GlobalAddress[I] << "\n"); } else { - // On Sparc, RTLD_SELF is already defined and it's not zero - // Linux/x86 wants to use a 0, other systems may differ -#ifndef RTLD_SELF -#define RTLD_SELF 0 -#endif - // External variable reference, try to use dlsym to get a pointer to it in - // the LLI image. - if (void *SymAddr = dlsym(RTLD_SELF, I->getName().c_str())) + // External variable reference. Try to use the dynamic loader to + // get a pointer to it. + if (void *SymAddr = GetAddressOfSymbol(I->getName().c_str())) GlobalAddress[I] = SymAddr; else { std::cerr << "Could not resolve external global address: " diff --git a/lib/ExecutionEngine/JIT/Intercept.cpp b/lib/ExecutionEngine/JIT/Intercept.cpp index 09cbe28740a..6df6088a3a8 100644 --- a/lib/ExecutionEngine/JIT/Intercept.cpp +++ b/lib/ExecutionEngine/JIT/Intercept.cpp @@ -1,7 +1,7 @@ //===-- Intercept.cpp - System function interception routines -------------===// // // If a function call occurs to an external function, the JIT is designed to use -// dlsym on the current process to find a function to call. This is useful for +// the dynamic loader interface to find a function to call. This is useful for // calling system calls and library functions that are not available in LLVM. // Some system calls, however, need to be handled specially. For this reason, // we intercept some of them here and use our own stubs to handle them. @@ -9,7 +9,7 @@ //===----------------------------------------------------------------------===// #include "VM.h" -#include "Config/dlfcn.h" // dlsym access +#include "Support/DynamicLinker.h" #include // AtExitHandlers - List of functions to call when the program exits, @@ -50,8 +50,8 @@ static int jit_atexit(void (*Fn)(void)) { //===----------------------------------------------------------------------===// // /// getPointerToNamedFunction - This method returns the address of the specified -/// function by using the dlsym function call. As such it is only useful for -/// resolving library symbols, not code generated symbols. +/// function by using the dynamic loader interface. As such it is only useful +/// for resolving library symbols, not code generated symbols. /// void *VM::getPointerToNamedFunction(const std::string &Name) { // Check to see if this is one of the functions we want to intercept... @@ -59,12 +59,7 @@ void *VM::getPointerToNamedFunction(const std::string &Name) { if (Name == "atexit") return (void*)&jit_atexit; // If it's an external function, look it up in the process image... - // On Sparc, RTLD_SELF is already defined and it's not zero - // Linux/x86 wants to use a 0, other systems may differ -#ifndef RTLD_SELF -#define RTLD_SELF 0 -#endif - void *Ptr = dlsym(RTLD_SELF, Name.c_str()); + void *Ptr = GetAddressOfSymbol(Name); if (Ptr == 0) { std::cerr << "WARNING: Cannot resolve fn '" << Name << "' using a dummy noop function instead!\n";