Skip to content

Commit

Permalink
[tools][llvm-rtdyld] Add a '-dylib <file>' option to llvm-rtdyld to l…
Browse files Browse the repository at this point in the history
…oad 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
  • Loading branch information
lhames committed May 13, 2014
1 parent 9c29061 commit f057625
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions tools/llvm-rtdyld/llvm-rtdyld.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -51,6 +52,11 @@ EntryPoint("entry",
cl::desc("Function to call as entry point."),
cl::init("_main"));

static cl::list<std::string>
Dylibs("dylib",
cl::desc("Add library."),
cl::ZeroOrMore);

/* *** */

// A trivial memory manager that doesn't do anything fancy, just uses the
Expand Down Expand Up @@ -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("-");
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit f057625

Please sign in to comment.