Recentemente stavo costruendo una certa libreria condivisa (ELF) mira architettura x86-64, in questo modo:Differenza di codice indipendente dalla posizione: 86 vs x86-64
g++ -o binary.so -shared --no-undefined ... -lfoo -lbar
Questo non è riuscita con il seguente errore:
relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
Ovviamente, significa che ho bisogno di ricostruirlo come codice indipendente dalla posizione, quindi è adatto per il collegamento in una libreria condivisa.
Ma questo funziona perfettamente su x86 con gli stessi argomenti di build. Quindi la domanda è: in che modo il riposizionamento su x86 è diverso da x86-64 e perché non devo compilare con -fPIC
sul primo?
Non l'ho mai capito. Se il compilatore può dirti esattamente quale opzione usare automaticamente, perché richiede che tu pronunci parole magiche per farlo funzionare correttamente? Grrr .. –
@Billy ONeal, ora credo che sia il caso di un'astrazione che perde. Differiscono nel modo in cui caricano i dati globali, il che influisce sul fatto che il PIC sia necessario o meno. –
Capisco la necessità della differenza. Quello che non capisco è il motivo per cui è necessario dare al compilatore un passaggio per farlo fare. –