Fai quello che ti dice il compilatore, cioè ricompila con -fPIC
. Per sapere cosa fa questo flag e perché ne hai bisogno in questo caso, vedi Opzioni di generazione del codice del manuale GCC.
In breve, il termine codice indipendente dalla posizione (PIC) si riferisce al codice macchina generato che è indipendente dall'indirizzo di memoria, ovvero non fa alcuna ipotesi su dove è stato caricato nella RAM. Solo il codice indipendente dalla posizione dovrebbe essere incluso negli oggetti condivisi (SO) in quanto dovrebbero avere la capacità di cambiare dinamicamente la loro posizione nella RAM.
Infine, puoi leggerlo su Wikipedia anche.
Nel mio caso questo errore si è verificato perché un make
Il comando si aspettava di recuperare le librerie condivise (*.so
files) da una directory remota indicata da un LDFLAGS
variabile d'ambiente. Per errore, lì erano disponibili solo librerie statiche (*.la
o *.a
File).
Quindi, il mio problema non risiedeva nel programma che stavo compilando ma nelle librerie remote che stava tentando di recuperare. Quindi, non avevo bisogno di aggiungere alcun flag (diciamo, -fPIC
) alla compilazione interrotta dall'errore di rilocazione. Invece, ho ricompilato la libreria remota in modo che gli oggetti condivisi fossero disponibili.
Fondamentalmente, è stato un errore di file non trovato sotto mentite spoglie.
Nel mio caso ho dovuto rimuovere un --disable-shared
fuori posto inserire configure
invocazione per il programma richiesto, poiché le librerie condivise e statiche sono state entrambe create per impostazione predefinita.
Ho notato che la maggior parte dei programmi crea entrambi i tipi di librerie contemporaneamente, quindi il mio è probabilmente un caso d'angolo. In generale, potrebbe essere necessario abilitare le librerie condivise, a seconda delle impostazioni predefinite.
Per ispezionare la tua situazione particolare con le opzioni di compilazione e le impostazioni predefinite, leggerei il riepilogo che viene visualizzato con ./configure --help | less
, in genere nella sezione Funzionalità opzionali. Ho spesso scoperto che questa lettura è più affidabile delle guide all'installazione che non vengono aggiornate mentre i programmi di dipendenza si evolvono.
Risolto con -no-pie
opzione nella fase del linker:
g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...