观察
当 Linux 可执行文件被编译为 PIE(位置独立可执行文件,Ubuntu 18.04 上的默认值)时,共享库(例如 libc)中的符号将在程序开始执行时解析,将 LD_BIND_NOW 环境变量设置为 null 不会延迟此过程。
但是,如果使用-no-pie
标志编译可执行文件,则符号解析可以由 LD_BIND_NOW 控制。
问题
是否可以控制何时在 ELF PIE 可执行文件上解析共享库中的符号?
下面是测试代码和系统信息,
ubuntu: 18.04
kernel: Linux 4.15.0-50-generic #54-Ubuntu SMP Mon May 6 18:46:08 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
gcc: gcc (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0
$ gcc -o helloworld helloworld.c
$ file helloworld
helloworld: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=70143fcc329797b2d0af84143ce0125775ab330f, not stripped
#include <stdio.h>
int main() {
printf("Hello world!\n");
}