gpt4 book ai didi

llvm 用另一个函数替换一个函数

转载 作者:行者123 更新时间:2023-12-04 02:39:45 29 4
gpt4 key购买 nike

我正在尝试用另一个函数调用替换一个函数调用。例如这是具有 3 个函数的代码 - print1、print2 和 main:

#include <stdio.h>
extern "C" {
int print1()
{
printf("Inside print1\n");
return 0xdeadbeef;
}
int print2()
{
printf("Inside print2\n");
return 0xbeefdead;
}
int main(void)
{
return print1();
}
}"

我的目标是用 print2 替换 print1(在 main 中)的使用。我将上面的代码编译成一个 llvm::Module*(在下面的代码中称为 main),然后从中创建一个执行引擎。

std::string errMsg;
llvm::ExecutionEngine *ee =
llvm::EngineBuilder( main ).setErrorStr( &errMsg ).create();
ASSERT_NE( ee, nullptr )<<"Execution engine is nullptr:"<<errMsg;

此时,我能够从执行引擎获取所有 3 个函数(print1、print2 和 main)并能够正常执行它们。但是,当我尝试用“print2”替换函数“print1”时出现问题,如下所示:

llvm::Function *print1f = main->getFunction( "print1" );
llvm::Function *print2f = main->getFunction( "print2" );
llvm::Function *mainf = main->getFunction( "main" );

//carry out the replacement
print2f->takeName( print1f );
ee->freeMachineCodeForFunction( mainf );
ee->freeMachineCodeForFunction( print1f );
print1f->replaceAllUsesWith( print2f );
print1f->deleteBody();
print1f->dropAllReferences();
print1f->eraseFromParent();

//run main
void *mainfPtr = ee->getPointerToFunction( mainf );
mainfPtr = ee->recompileAndRelinkFunction( mainf );
ASSERT_NE( mainfPtr, nullptr );
ret = ((int(*)(void))(mainfPtr))();
*EXPECT_EQ(0xbeefdead, ret);*

但是,ret 返回为 0xdeadbeef,就好像正在调用 print1 而不是 print2。如果我按照正确的步骤替换函数调用,有人可以告诉我吗?如果有其他方法,请告诉我。

谢谢维卡斯。

==========

最佳答案

如果编译器将 print1 内联到 main 中,该函数将永远不会被调用;相反,main 将粘贴它自己的 print1 代码的私有(private)版本。因为它实际上不必引用共享的 print1 换入 print2 可能不会影响 main 的行为。

如果您想验证这是问题所在(和/或防止它发生,如果是的话),请尝试告诉编译器不要内联。

关于llvm 用另一个函数替换一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20152276/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com