Il test è su Ubuntu 12.04 64-bit. architettura x86.Quali sono le differenze confrontando PIE, codice PIC ed eseguibile su piattaforma x86 a 64 bit?
Sono confuso riguardo al concetto Eseguibile Indipendente dalla Posizione (PIE) e Indipendente dalla posizione (PIC), e suppongo che non siano ortogonali.
Ecco il mio rapido esperimento.
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
E ho i seguenti risultati.
A. a.out contiene un codice PIC, ma solo resiste nelle funzioni prologo e un epilogo libc, come mostrato in seguito:
4004d0: 48 83 3d 70 09 20 00 cmpq $0x0,0x200970(%rip) # 600e48 <__JCR_END__>
nelle istruzioni di montaggio del mio programma semplice quicksort , Non ho trovato alcuna istruzione PIC.
B. a_pic.out contiene il codice PIC, e non ho trovato alcun non PIC istruzioni ... nelle istruzioni del mio programma Quicksort, tutti i dati globali sono accessibili da istruzioni PIC come questo :
40053b: 48 8d 05 ea 02 00 00 lea 0x2ea(%rip),%rax # 40082c <_IO_stdin_used+0x4>
C. a_pie.out contiene istruzioni di sintassi identica confronto con a_pic.out. Tuttavia, gli indirizzi di memoria della sezione .text di a_pie.out vanno da 0x630 a 0xa57, mentre la stessa sezione di a_pic.out va da 0x400410 a 0x400817.
Qualcuno potrebbe darmi qualche spiegazione di questi fenomeni? Soprattutto il ritrovamento C. Anche in questo caso, sono davvero confuso circa PIE vs PIC, e non hanno alcuna idea di come spiegare la ricerca C ..
Fondamentalmente 'PIE' è destinato agli eseguibili e' PIC' per le librerie condivise. Non ha molto senso esaminare gli eseguibili di 'PIC'. Si noti inoltre che 'gcc' richiama il linker di conseguenza. – Jester