强制ld在ld时解析弱引用

时间:2014-09-05 05:18:28

标签: c linux linker binutils

考虑一个类似的程序:

#include <stdio.h>
void foo() __attribute__((__weak__));
int main()
{
    printf("%p\n", (void *)foo);
    if (foo) foo();
}

如果编译为常规的非PIE动态链接可执行文件,foo的不存在将在ld时解析,即使LD_PRELOAD用于定义{ {1}},它不会被看到。另一方面,如果程序编译为PIE,则弱动态符号引用最终会出现在输出中,foo可以使符号LD_PRELOAD可见。

对于PIE可执行文件,是否有办法强制非PIE行为(在ld时解决弱引用符号的不存在而不是在运行时)?

1 个答案:

答案 0 :(得分:0)

具有此属性的函数将其名称作为弱值发出 符号而不是全局名称。这主要是为了命名 可以被用户代码覆盖的库例程。

弱的符号 具有两个或多个相同名称的全局符号不会引起冲突,只要其中一个符号被声明为弱符号即可。链接器忽略弱符号的定义,并使用常规全局符号定义来解析所有引用,但如果普通全局符号不可用,则将使用弱符号。弱符号可用于命名可由用户代码覆盖的函数和数据。弱符号也称为弱别名,或简称为弱。

来自互联网!