0

我的问题假设 x86 或 x86_64 的 gcc 或 clang。

假设我有以下文件:

// weak.c

#include <stdio.h>

__attribute__((weak))
void i_am_weak(void)
{
    printf("I am weak\n");
}

int main()
{
    i_am_weak();
    return 0;
}
// not_weak.c

#include <stdio.h>

void i_am_weak(void)
{
    printf("I am not weak\n");
}

如果我只编译weak.c:cc weak.c -o weak然后运行它,我会收到“我很弱”的消息。反过来,如果我编译并链接两者:cc weak.c not_weak.c我得到消息“我并不弱”。这是可以预料的。

我能以某种方式获得弱符号的地址吗?假设我想调用i_am_weakfrom weak.cfrom not_weak.c,类似于我在使用链接器标志时使用__real_i_am_weakfrom的方式。__wrap_i_am_weak--wrap

4

1 回答 1

2

我能以某种方式获得弱符号的地址吗?

通常的技术是使用一个强内部符号,它i_am_weak是一个弱别名(文档):

#include <stdio.h>

void i_am_internal(void)
{
    printf("I am weak\n");
}

void i_am_weak(void) __attribute__((weak, alias("i_am_internal"))) 

int main()
{
    i_am_weak();
    i_am_internal();
    return 0;
}
$ gcc weak.c && ./a.out
I am weak
I am weak

$ gcc weak.c not_weak.c && ./a.out
I am not weak
I am weak

您现在还可以获取弱符号和非弱符号的地址。

于 2020-09-24T03:11:08.447 回答