如何使用LLVM 3.3执行位代码文件?
我开始使用LLVM编程,并尝试执行位代码。 我根据旧的示例编写了这段代码(我的疑问是创建如何使用LLVM 3.3执行位代码文件?,llvm,Llvm,我开始使用LLVM编程,并尝试执行位代码。 我根据旧的示例编写了这段代码(我的疑问是创建MemoryBuffer,getFile(string)不再存在): 2-lli的方法,不确定envp的“0” vector<string> *argList = new vector<string>; ee->runFunctionAsMain(main, *argList, 0); vector*argList=新向量; ee->RunFunctionsMa
MemoryBuffer
,getFile(string)
不再存在):
2-lli的方法,不确定envp的“0”
vector<string> *argList = new vector<string>;
ee->runFunctionAsMain(main, *argList, 0);
vector*argList=新向量;
ee->RunFunctionsMain(主,*argList,0);
3-2的推广
vector<struct GenericValue> *argList = new vector<struct GenericValue>;
ee->runFunction(main, *argList);
vector*argList=新向量;
ee->runFunction(main,*argList);
您可以在此参考lli
工具。作为官方LLVM工具和存储库及发行版的一部分,它始终是最新LLVM API的最新版本。文件tools/lli/lli.cpp
只有约500行代码,其中大部分是头文件、选项定义和注释。main
函数包含精确的执行流,并且结构清晰,注释清晰
您可以从两种方法中选择一种:
lli.cpp
开始,逐渐剥离不需要的东西lli.cpp
中的相关部分放入您自己的主文件中如果问题与您的
main
有关,您总是可以在LLVM测试中找到实际使用lli
运行的位代码文件的示例-test/ExecutionEngine
-大多数测试都有位代码文件,在这些位代码文件上调用了lli
,并成功运行。lli
工具是您在此的参考资料。作为官方LLVM工具和存储库及发行版的一部分,它始终是最新LLVM API的最新版本。文件tools/lli/lli.cpp
只有约500行代码,其中大部分是头文件、选项定义和注释。main
函数包含精确的执行流,并且结构清晰,注释清晰
您可以从两种方法中选择一种:
lli.cpp
开始,逐渐剥离不需要的东西lli.cpp
中的相关部分放入您自己的主文件中如果问题出在您的
main
上,您总是可以在LLVM测试中找到实际使用lli
运行的位代码文件示例-test/ExecutionEngine
-大多数测试都有位代码文件,其中lli
被调用并成功运行。在遇到与您相同的问题后,我在lli.cpp中搜索所有对模块、enginebuilders等的非可选调用
我相信您缺少的是对“ee->runstaticConstructorDistructors(false)”的调用
至少,这为我解决了这个问题
注意:这在llvm3.4下,但我已经验证了同样的指令也存在于llvm3.1中,表明它可能也存在于3.3中。在遇到与您相同的问题后,我通过lli.cpp搜索了所有对模块、enginebuilders等的非可选调用 我相信您缺少的是对“ee->runstaticConstructorDistructors(false)”的调用 至少,这为我解决了这个问题
注意:这是在llvm3.4下,但我已经验证了同样的指令也存在于llvm3.1中,表明它可能也存在于3.3中。顺便说一句,您可能需要使用,它包装了所有内存缓冲区的内容,并为您提供了一个简单的“给我文件名,获取
模块”
”界面。非常感谢,现在代码更干净了,但我仍然在尝试执行main
时遇到“分段错误”。您是否验证了“main”确实存在?您可以使用m->getFunctionList()
和->dump()
验证每个函数。是的,function*main=m->getFunction(“main”);主->转储()
打印正确的IR.BTW,您可能想使用它,它包装了所有内存缓冲区内容,并为您提供了一个简单的“给我文件名,获取模块
”界面。非常感谢,现在代码更干净了,但我仍然在尝试执行main
时遇到“分段错误”。您验证了“main”吗真的有吗?您可以使用m->getFunctionList()
和->dump()
验证每个函数。是的,function*main=m->getFunction(“main”);主->转储()代码>打印正确的IR。谢谢。事实上,我正在阅读lli.cpp,并在代码中遵循它(上面的第2点),但像getPointerToFunction
和runfunctions这样的函数可能会导致分段错误。正如我之前所说,dump()
为函数打印正确的IR代码,因此这不是解析问题。@luomoradioattivo:所以您的IR可能有问题。您的代码能否成功运行我指出的其中一个测试?如果是,问题是用IR,如果不是,则是用C++驱动程序。甚至在测试中,比如Helo.LL,分段错误调用<代码> GoPotoTopTuntus<代码>或<代码> RunMealsAsMasu< /C>。顺便说一句,我的IR是用clang生成的,所以我认为它是正确的。@Luomaridioattivo:那么很有可能你的代码是错的。如果您遵循的是lli.cpp
的main
,则可能采取了错误的措施或删除了太多内容。我建议您要么仔细比较不同之处,要么从全新的lli.cpp
开始。作为一项健全性检查,请确保LLVM3.3中的实际lli
工具成功运行了这些测试(以及您的代码)。谢谢。事实上,我正在阅读lli.cpp,并在代码中遵循它(上面的第2点),但像getPointerToFunction
和runfunctions这样的函数可能会导致分段错误。正如我之前所说,dump()
为函数打印正确的IR代码,因此这不是解析问题。@luomoradioattivo:所以您的IR可能有问题。您的代码能否成功运行我指出的其中一个测试?如果是,问题在于IR,如果不是,则在于
vector<string> *argList = new vector<string>;
ee->runFunctionAsMain(main, *argList, 0);
vector<struct GenericValue> *argList = new vector<struct GenericValue>;
ee->runFunction(main, *argList);