如何从 LLVM 调用外部 DLL 的函数?如何从 LLVM 代码调用 DLL 文件中定义的函数?
最佳答案
由于您的问题缺少重要信息,我猜您想实现以下目标。我猜您将使用 c/c++ 接口(interface),并且该函数具有签名 void fun(void)
。我还猜测您将使用 LLVM Builder 创建对此函数的调用(而不是 clang 等)。
首先使用dlopen
/loadlibrary
动态加载函数并获取函数指针fnPtr
。
为函数的返回值创建一个Type*
Type* voidType[1];
voidType[0] = Type::getVoidTy(getGlobalContext());
ArrayRef<Type*> voidTypeARef (voidType, 1);
为该函数创建一个Function*
。您应该已经从初始化阶段获得了一个 Module* TheModule
。
FunctionType* signature = FunctionType::get(voidTypeARef, false);
Function* func = Function::Create(signature, Function::ExternalLinkage, "fun", TheModule);
使用addGlobalMapping
创建到函数的映射。您应该在初始化阶段就有一个 ExecutionEngine* TheExecutionEngine
。
TheExecutionEngine->addGlobalMapping(func, const_cast<void*>(fnPtr));
现在,在您想要调用的适当位置,您可以像这样使用 IRBuilder
插入对函数的调用。
Function *FuncToCall= TheModule->getFunction("fun");
std::vector<Value*> Args; // This is empty since void parameters of function
Value *Result = IRBuilder->CreateCall(FuncToCall, Args, "calltmp"); // Result is void
关于llvm - 如何使用 LLVM IRBuilder 从外部 DLL 调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24899568/