gpt4 book ai didi

c - 如何在 C 中包装现有函数

转载 作者:太空狗 更新时间:2023-10-29 14:54:40 26 4
gpt4 key购买 nike

我正在尝试包装现有函数。

下面的代码是完美的。

#include<stdio.h>

int __real_main();

int __wrap_main()
{
printf("Wrapped main\n");
return __real_main();
}

int main()
{
printf("main\n");
return 0;
}

命令:

gcc main.c -Wl,-wrap,main

输出:

Wrapped main
main

所以我用 temp 改变了 main 函数。我的目标是包装 temp() 函数。

下面是代码

温度.c

#include<stdio.h>

int temp();

int __real_temp();

int __wrap_temp()
{
printf("Wrapped temp\n");
return __real_temp();
}

int temp()
{
printf("temp\n");
return 0;
}

int main()
{
temp();
return 0;
}

命令:

gcc temp.c -Wl,-wrap,temp

输出:

temp

包装的温度不打印。请指导我包装函数温度。

最佳答案

ld 的联机帮助页说:

   --wrap=symbol
Use a wrapper function for symbol. Any undefined reference to symbol will be resolved to "__wrap_symbol". Any
undefined reference to "__real_symbol" will be resolved to symbol.

此处关键字未定义。

如果您将定义 temp 放在与使用它的代码相同的翻译单元中,则它不会在使用它的代码中未定义。

您需要拆分代码定义和使用它的代码:

#!/bin/sh

cat > user.c <<'EOF'
#include<stdio.h>

int temp(void);

int __real_temp(void);

int __wrap_temp()
{
printf("Wrapped temp\n");
return __real_temp();
}
int main()
{
temp();
return 0;
}
EOF

cat > temp.c <<'EOF'
#include<stdio.h>
int temp()
{
printf("temp\n");
return 0;
}
EOF


gcc user.c -Wl,-wrap,temp temp.c # OK
./a.out

将构建分成两个单独的编译可能会使其更清晰:

$ gcc -c user.c
$ gcc -c temp.c
$ nm user.o temp.o

temp.o:
U puts
0000000000000000 T temp

user.o:
0000000000000015 T main
U puts
U __real_temp
U temp
0000000000000000 T __wrap_temp

现在由于 user.c 中未定义 temp,链接器可以执行其 __real_/__wrap_ 魔法在上面。

$ gcc  user.o temp.o  -Wl,-wrap=temp
$ ./a.out
Wrapped temp
temp

关于c - 如何在 C 中包装现有函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43183060/

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