So che l' -fPIC
opzione " " ha qualcosa a che fare con la risoluzione degli indirizzi e l'indipendenza tra i singoli moduli, ma non sono sicuro di cosa significhi veramente. Puoi spiegare?
So che l' -fPIC
opzione " " ha qualcosa a che fare con la risoluzione degli indirizzi e l'indipendenza tra i singoli moduli, ma non sono sicuro di cosa significhi veramente. Puoi spiegare?
Risposte:
PIC sta per Position Independent Code
e per citare man gcc
:
Se supportato per la macchina di destinazione, emette codice indipendente dalla posizione, adatto per il collegamento dinamico ed evitando qualsiasi limite alla dimensione della tabella offset globale. Questa opzione fa la differenza su m68k, PowerPC e SPARC. Il codice indipendente dalla posizione richiede un supporto speciale e quindi funziona solo su determinate macchine.
usalo quando costruisci oggetti condivisi (* .so) su quelle architetture menzionate.
/usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
quindi ho aggiunto fPIC e l'ho compilata.
Il f
è il prefisso gcc per le opzioni che "controllano le convenzioni dell'interfaccia utilizzate nella generazione di codice"
L' PIC
acronimo di "Position Independent Code", è una specializzazione di fpic
m68K e SPARC.
Modifica: dopo aver letto la pagina 11 del documento a cui fa riferimento 0x6adb015 e il commento di coryan, ho apportato alcune modifiche:
Questa opzione ha senso solo per le librerie condivise e stai dicendo al sistema operativo che stai utilizzando una tabella offset globale, GOT. Ciò significa che tutti i riferimenti agli indirizzi sono relativi al GOT e il codice può essere condiviso tra più processi.
Altrimenti, senza questa opzione, il caricatore dovrebbe modificare da solo tutti gli offset.
Inutile dire che usiamo quasi sempre -fpic / PIC.
man gcc
dice:
-fPIC Genera codice indipendente dalla posizione (PIC) adatto per l'uso in un file condiviso libreria, se supportata per la macchina di destinazione. Tale codice accede a tutti indirizzi costanti tramite una tabella di offset globale (GOT). La dinamica loader risolve le voci GOT all'avvio del programma (il file dynamic loader non fa parte di GCC; fa parte del sistema operativo). Se la dimensione GOT per l'eseguibile collegato supera una specifica della macchina dimensione massima, viene visualizzato un messaggio di errore dal linker che indica che -fpic non funziona; in tal caso, ricompilare con -fPIC invece. (Questi massimi sono 8k su SPARC e 32k su m68k e RS / 6000. Il 386 non ha tale limite.) Il codice indipendente dalla posizione richiede un supporto speciale e quindi funziona solo su alcune macchine. Per il 386, GCC supporta PIC per System V ma non per Sun 386i. Codice generato per IBM RS / 6000 è sempre indipendente dalla posizione. -fPIC Se supportato per la macchina di destinazione, emette codice indipendente dalla posizione, adatto per il collegamento dinamico ed evitando qualsiasi limite alla dimensione di la tabella offset globale. Questa opzione fa la differenza sull'm68k e lo SPARC. Il codice indipendente dalla posizione richiede un supporto speciale e quindi funziona solo su alcune macchine.