考虑一个类似的程序:
#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时解决弱引用符号的不存在而不是在运行时)?
答案 0 :(得分:0)
具有此属性的函数将其名称作为弱值发出 符号而不是全局名称。这主要是为了命名 可以被用户代码覆盖的库例程。
弱的符号 具有两个或多个相同名称的全局符号不会引起冲突,只要其中一个符号被声明为弱符号即可。链接器忽略弱符号的定义,并使用常规全局符号定义来解析所有引用,但如果普通全局符号不可用,则将使用弱符号。弱符号可用于命名可由用户代码覆盖的函数和数据。弱符号也称为弱别名,或简称为弱。来自互联网!