GNU/Linux >> Linux Esercitazione >  >> Linux

La compilazione fallisce con il riposizionamento R_X86_64_32 contro `.rodata.str1.8' non può essere utilizzato quando si crea un oggetto condiviso

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

Linux
  1. Ssh Inside Ssh non riesce con "stdin:Is Not A Tty"?

  2. Come mostrare tutte le librerie condivise utilizzate dagli eseguibili in Linux?

  3. Errore Linux durante il caricamento delle librerie condivise:impossibile aprire il file oggetto condiviso:file o directory non presenti

  4. dynamic_cast fallisce se usato con dlopen/dlsym

  5. Come sapere che la libreria condivisa data è costruita con simboli di debug o no?

Rileva librerie condivise obsolete in memoria con UChecker

Come elencare le librerie condivise utilizzate dagli eseguibili in Linux

Bash Beginner Series #7:Decision Making With If Else e Case Statements

Rimuovere la memoria condivisa posix quando non in uso?

Può eseguire il ping/ssh attraverso la LAN ma non con il Wi-Fi

Il malware Windows può danneggiare un computer Linux quando viene eseguito con Wine?