Тест находится на Ubuntu 12.04 64-бит. x86.
Я запутался в концепции "Независимый исполняемый файл Position (PIE) и независимый от положения код (PIC)", и я предполагаю, что они не ортогональны.
Вот мой быстрый эксперимент.
gcc -fPIC -pie quickSort.c -o a_pie.out
gcc -fPIC quickSort.c -o a_pic.out
gcc a.out
objdump -Dr -j .text a.out > a1.temp
objdump -Dr -j .text a_pic.out > a2.temp
objdump -Dr -j .text a_pie.out > a3.temp
И у меня есть следующие выводы.
A. a.out содержит некоторый код PIC, но только поддерживает функции пролога и эпилога libc, как показано ниже:
4004d0: 48 83 3d 70 09 20 00 cmpq $0x0,0x200970(%rip) # 600e48 <__JCR_END__>
В инструкциях по сборке моей простой программы быстрой сортировки я не нашел никаких инструкций PIC.
B. a_pic.out содержит код PIC, и я не нашел никаких инструкций не PIC... В инструкциях моей программы быстрой сортировки все Доступ к глобальным данным осуществляется с помощью инструкций ПОС:
40053b: 48 8d 05 ea 02 00 00 lea 0x2ea(%rip),%rax # 40082c <_IO_stdin_used+0x4>
C. a_pie.out содержит синтаксически идентичные инструкции по сравнению с a_pic.out. Однако адреса памяти раздела a_pie.out .text варьируются от 0x630 до 0xa57, тогда как тот же раздел a_pic.out находится в диапазоне от 0x400410 до 0x400817.
Может ли кто-нибудь дать мне некоторые объяснения этих феноменов? Особенно нахождение C. Опять же, я действительно запутался в PIE против PIC, и понятия не имею, как объяснить вывод C..