如何使用LLVM 3.3执行位代码文件?

如何使用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

我开始使用LLVM编程,并尝试执行位代码。 我根据旧的示例编写了这段代码(我的疑问是创建
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);