实际上,仍然有一个-no_pie
链接器标志,但您可能认为它实际上被称为--no-pie
.
让我们有一个小测试程序:
#include <stdio.h>
const char *test = "test";
int main() {
printf("%p\n", (void*)test);
return 0;
}
并首先像往常一样编译:
cc -o test-pie test-pie.c
并检查标志
$ otool -hv test-pie
test-pie:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL LIB64 EXECUTE 16 1376 NOUNDEFS DYLDLINK TWOLEVEL PIE
好吧,里面有一个PIE
flag,让我们验证一下
$ for x in $(seq 1 5); do echo -n "$x "; ./test-pie; done
1 0x10a447f96
2 0x10e3cbf96
3 0x1005daf96
4 0x10df50f96
5 0x104e63f96
这看起来很随意。
现在,让我们告诉链接器我们不想PIE
使用-Wl,-no_pie
:
cc -o test-nopie test-pie.c -Wl,-no_pie
果然PIE
flag不见了:
$ otool -hv test-nopie
test-pie:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL LIB64 EXECUTE 16 1376 NOUNDEFS DYLDLINK TWOLEVEL
并测试:
$ for x in $(seq 1 5); do echo -n "$x "; ./test-nopie; done
1 0x100000f96
2 0x100000f96
3 0x100000f96
4 0x100000f96
5 0x100000f96
所以我们让链接器不加PIE
flag,我的小牛系统好像还是遵守的。
FWIW,该PIE
标志被定义并记录/usr/include/mach-o/loader.h
在MH_PIE
.
互联网上有很多工具可以从现有二进制文件中清除 PIE 标志,例如http://src.chromium.org/svn/trunk/src/build/mac/change_mach_o_flags.py
虽然我无法为您提供在PIE
没有 ASLR 的情况下启动 -flaged 二进制文件的记录方法,但由于您想测试代码(可能是您自己的代码),只需将您的测试程序与测试二进制文件-no_pie
中的标志链接或删除PIE
就足够了?