Der Test ist auf Ubuntu 12.04 64-Bit. x86-Architektur.
Ich bin verwirrt über das Konzept Position Independent Executable (PIE) und Position Independent Code (PIC), und ich denke, sie sind nicht orthogonal.
Hier ist mein schnelles Experiment.
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
Und ich habe folgende Erkenntnisse.
A. a.out enthält etwas PIC-Code, aber nur widersteht in den libc-Prolog- und Epilog-Funktionen, wie unten gezeigt:
4004d0: 48 83 3d 70 09 20 00 cmpq $0x0,0x200970(%rip) # 600e48 <__JCR_END__>
In der Bauanleitung meines einfachen Quicksort-Programms habe ich keine PIC-Anleitung gefunden.
B. a_pic.out enthält PIC-Code, und ich habe keinen gefunden Nicht-PIC Anweisungen … In den Anweisungen meines Quicksort-Programms wird auf alle globalen Daten durch PIC-Anweisungen wie folgt zugegriffen:
40053b: 48 8d 05 ea 02 00 00 lea 0x2ea(%rip),%rax # 40082c <_IO_stdin_used+0x4>
C. a_pie.out enthält syntaxidentische Anweisungen im Vergleich zu a_pic.out. Allerdings sind die Speicheradressen von a_pie.out’s .Text Bereich von 0x630 bis 0xa57, während der gleiche Abschnitt von a_pic.out von 0x400410 bis 0x400817 reicht.
Kann mir jemand diese Phänomene erklären? Vor allem der Befund C. Wieder bin ich wirklich verwirrt TORTE vs. PICund habe keine Ahnung, wie ich den Befund erklären soll C..
Grundsätzlich
PIE
ist für ausführbare Dateien vorgesehen undPIC
für gemeinsam genutzte Bibliotheken. Eine Untersuchung macht wenig SinnPIC
ausführbare Dateien. Beachte das auchgcc
ruft den Linker entsprechend auf.– Narr
23. Januar 2015 um 22:28 Uhr
-fPIC -pie
/Gesichtspalme. Du hättest die verwenden sollen-fPIE
Code-Gen-Option, nicht-fPIC
.-pie
ist eine Linker-Option, die steuert, in welche Art von ausführbarer Datei der Code tatsächlich eingefügt wird. (-pie
allein würde fehlschlagen, da es mit der absoluten 32-Bit-Adressierung nicht kompatibel ist). Siehe auch Absolute 32-Bit-Adressen, die in x86-64-Linux nicht mehr erlaubt sind? für mehr über ausführbare PIE-Dateien im Vergleich zu Nicht-PIE. (Und beachten Sie, dass die meisten Distributionen GCC mit bauen-fPIE -pie
ist die Vorgabe).– Peter Cordes
4. November 2019 um 3:33 Uhr