Was sind die Unterschiede im Vergleich zu PIE, PIC-Code und ausführbaren Dateien auf einer 64-Bit-x86-Plattform?

Lesezeit: 2 Minuten

Benutzer-Avatar
llllllllllll

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 und PIC für gemeinsam genutzte Bibliotheken. Eine Untersuchung macht wenig Sinn PIC ausführbare Dateien. Beachte das auch gcc 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


1051240cookie-checkWas sind die Unterschiede im Vergleich zu PIE, PIC-Code und ausführbaren Dateien auf einer 64-Bit-x86-Plattform?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy