From f0576256763afb947e6f38d92c5e6a297eff2548 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Tue, 13 May 2014 22:37:41 +0000 Subject: [tools][llvm-rtdyld] Add a '-dylib ' option to llvm-rtdyld to load shared libraries before linking and executing the target objects. This allows programs that use external calls (e.g. to libc) to be run under llvm-rtdyld. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208739 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-rtdyld/llvm-rtdyld.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'tools') diff --git a/tools/llvm-rtdyld/llvm-rtdyld.cpp b/tools/llvm-rtdyld/llvm-rtdyld.cpp index 2cea30cabd..be5c345c61 100644 --- a/tools/llvm-rtdyld/llvm-rtdyld.cpp +++ b/tools/llvm-rtdyld/llvm-rtdyld.cpp @@ -18,6 +18,7 @@ #include "llvm/ExecutionEngine/RuntimeDyld.h" #include "llvm/Object/MachO.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/Memory.h" #include "llvm/Support/MemoryBuffer.h" @@ -51,6 +52,11 @@ EntryPoint("entry", cl::desc("Function to call as entry point."), cl::init("_main")); +static cl::list +Dylibs("dylib", + cl::desc("Add library."), + cl::ZeroOrMore); + /* *** */ // A trivial memory manager that doesn't do anything fancy, just uses the @@ -121,9 +127,25 @@ static int Error(const Twine &Msg) { return 1; } +static void loadDylibs() { + for (const std::string &Dylib : Dylibs) { + if (sys::fs::is_regular_file(Dylib)) { + std::string ErrMsg; + if (sys::DynamicLibrary::LoadLibraryPermanently(Dylib.c_str(), &ErrMsg)) + llvm::errs() << "Error loading '" << Dylib << "': " + << ErrMsg << "\n"; + } else + llvm::errs() << "Dylib not found: '" << Dylib << "'.\n"; + } +} + + /* *** */ static int printLineInfoForInput() { + // Load any dylibs requested on the command line. + loadDylibs(); + // If we don't have any input files, read from stdin. if (!InputFileList.size()) InputFileList.push_back("-"); @@ -182,6 +204,9 @@ static int printLineInfoForInput() { } static int executeInput() { + // Load any dylibs requested on the command line. + loadDylibs(); + // Instantiate a dynamic linker. TrivialMemoryManager MemMgr; RuntimeDyld Dyld(&MemMgr); -- cgit v1.2.3