LD_BIND_NOW 似乎对 ELF PIE 可执行文件不起作用?

逆向工程 小精灵 馅饼
2021-06-19 12:00:23

观察

当 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");
}
1个回答

是的,使用clang:编译时是可能的clang -o helloworld helloworld.c要测试它,请运行:

export LD_DEBUG=reloc,symbols
./helloWorld

LD_BIND_NOWnull 然后与LD_BIND_NOWequal 1您将看到,在第一种情况下,调用printf确实是在需要时解决的,而在第二种情况下,它将在将控制转移到程序之前解决。

LD_BIND_NOW=null

LD_BIND_NOW_NULL

LD_BIND_NOW=1

LD_BIND_NOW_1

GCC正如您所注意到的,由于某种原因它不起作用,至少没有指定相关选项。