我开始使用LLVM进行编程,并尝试执行bitcode。
我想到了这个代码,改编自旧例子(我怀疑是MemoryBuffer
的创建,getFile(string)
不再存在了):
string *errorString = new string;
LLVMContext context;
OwningPtr<MemoryBuffer> *mb = new OwningPtr<MemoryBuffer>;
MemoryBuffer::getFileOrSTDIN(argv[1], *mb);
Module *m = ParseBitcodeFile(mb->take(), context, errorString);
ExecutionEngine *ee = EngineBuilder(m).create();
Function *main = m->getFunction("main");
从这一行起无效(分段错误)
1 - “标准”方法?
void * f = ee->getPointerToFunction(main);
void (*FP)() = (void (*)()) f;
2 - lli的方法,不确定envp的'0'
vector<string> *argList = new vector<string>;
ee->runFunctionAsMain(main, *argList, 0);
3 - 2的概括。
vector<struct GenericValue> *argList = new vector<struct GenericValue>;
ee->runFunction(main, *argList);
答案 0 :(得分:1)
lli
工具是您的参考。作为官方LLVM工具以及存储库和发行版的一部分,它始终与最新的LLVM API保持同步。文件tools/lli/lli.cpp
只有大约500行代码,大部分是头文件,选项定义和注释。 main
函数包含确切的执行流程,并且结构清晰,注释完整。
您可以选择以下两种方法之一:
lli.cpp
开始,逐步剥离您不需要的内容。lli.cpp
中的相关部分放入您自己的主文件中。如果问题出在您的main
上,您总是可以在LLVM测试中找到实际与lli
一起运行的bitcode文件示例 - test/ExecutionEngine
- 大多数测试都有bitcode文件调用lli
并成功运行。
答案 1 :(得分:0)
在遇到与您相同的问题后,我通过lli.cpp搜索了对模块,引擎制造商等的所有非可选调用...
我相信你缺少的是对“ee-&gt; runStaticConstructorDestructors(false)”的调用
至少,这为我解决了这个问题
注意:这是在llvm3.4下,但我已经验证llvm3.1中也存在相同的指令,表明它可以存在于3.3中。