gpt4 book ai didi

c - 链接的默认函数实现

转载 作者:行者123 更新时间:2023-12-04 05:12:20 24 4
gpt4 key购买 nike

我有一系列从一组 .o 文件拼凑而成的可执行文件。有一些可重用的,然后通常是几个可执行的特定模块。其中一个可重用的部分想要提供一种“应用程序 Hook ”。但是许多可执行文件只是做一个标准的无操作的事情。而其他几个人实际上想为所说的钩子(Hook)定义有趣的行为。

理想的情况是,如果有一种方法可以提供函数的标准默认版本,如果没有其他 .o 文件定义所述函数,则链接器将使用该函数,但如果有,则使用其他函数。

有什么方法/技术可以用直接的 C 来近似这种事情吗?

最佳答案

如果您使用 GCC 作为编译器,那么您可以像这样声明可替换函数:

void foo() __attribute__ ((weak));

这是一个有关其工作原理的示例。在您的 main.c 文件中:
#include <stdio.h>

void foo()__attribute__ ((weak))
{
printf("%s", "Hidden foo\n");
}

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

在另一个文件 foo.c 中:
#include <stdio.h>

void foo()
{
printf("%s", "foo\n");
}

现在当你只编译、链接和运行 main.c 时,你会得到:
gcc main.c -o main./mainHidden foo

If you instead also compile foo.c, you'll get:

gcc main.c foo.c -o main./mainfoo

The weak version of foo() was replaced.

On a real setup, you would probably use a header file to provide the function prototypes:

void foo();

然后像这样实现这些函数的弱版本:
__attribute__ ((weak)) void foo()
{
// ...
}

您还可以使用宏使其更具可读性:
#define WEAK_SYMBOL __attribute__ ((weak))

这样你会得到:
WEAK_SYMBOL void foo() { /* ... */ }

关于c - 链接的默认函数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14756214/

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