考虑一个类似这样的程序:
#include <stdio.h>
void foo() __attribute__((__weak__));
int main()
{
printf("%p\n", (void *)foo);
if (foo) foo();
}如果编译为常规的、非PIE动态链接的可执行文件,则在ld时会解决foo不存在的问题,即使使用LD_PRELOAD来定义foo,也看不到它。另一方面,如果程序被编译为foo,则弱动态符号引用最终会出现在输出中,并且LD_PRELOAD可以使符号PIE可见。
有没有办法强制PIE可执行文件的非PIE行为(在ld时解决弱引用符号的不存在问题,而不是在运行时)?
发布于 2014-10-17 14:39:53
具有此属性的函数将其名称作为弱符号而不是全局名称发出。这主要用于命名可由用户代码覆盖的库例程。
具有两个或多个具有相同名称的全局符号的弱符号不会导致冲突,只要它们中除一个之外的所有符号都被声明为弱符号。链接器忽略弱符号的定义,并使用普通全局符号定义来解析所有引用,但如果普通全局符号不可用,则将使用弱符号。弱符号可用于命名可由用户代码重写的函数和数据。弱符号也称为弱别名,或简称为弱符号。
来自互联网!
https://stackoverflow.com/questions/25679030
复制相似问题