2015-01-23 16 views
12

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 ..

+1

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

risposta

14

Sono confuso circa il concetto di posizione Independent Executable (PIE) e posizione del codice indipendente (PIC), e suppongo che non siano ortogonali.

L'unica vera differenza tra PIE e PIC è che si è permesso di frapporre simboli in PIC, ma non in PIE. Tranne quello, sono praticamente equivalenti.

È possibile leggere sull'interposizione dei simboli here.

C. a_pie.out contiene istruzioni identiche alla sintassi che confrontano 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.

È difficile capire cosa trovi sorprendente in questo.

Il binario PIE è collegato come una libreria condivisa e pertanto il suo indirizzo di caricamento predefinito (il .p_vaddr del primo segmento LOAD) è zero. L'aspettativa è che qualcosa rilascerà questo binario lontano dalla pagina zero e lo caricherà in un qualche indirizzo casuale.

D'altra parte, un eseguibile non- PIE è sempre caricato nel suo indirizzo collegato. Su Linux, l'indirizzo predefinito per i binari x86_64 è 0x400000, quindi lo .text finisce non lontano da lì.

Problemi correlati