Ответ 1
На самом деле все еще существует флаг -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
, пусть проверяет
$ 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
отсутствует:
$ 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
, и моя система Mavericks, похоже, все еще соблюдает его.
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, так как вы хотите протестировать код, предположительно свой собственный, просто связав ваши тестовые программы с -no_pie
или удалив флаг PIE
после этого из ваших тестовых двоичных файлов должно быть достаточно?