Non è un bug perché ld
si comporta come la sua specifica. La pagina man di ld
2.28 recita:
Se il linker non è in grado di riconoscere il formato di un file oggetto, presumerà che si tratti di uno script del linker. Uno script specificato in questo modo aumenta lo script del linker principale utilizzato per il collegamento (lo script del linker predefinito o quello specificato utilizzando -T). Questa funzione consente al linker di collegarsi a un file che sembra essere un oggetto o un archivio, ma in realtà definisce semplicemente alcuni valori di simboli o utilizza "INPUT" o "GROUP" per caricare altri oggetti. Specificare uno script in questo modo aumenta semplicemente lo script del linker principale, con i comandi aggiuntivi posizionati dopo lo script principale; usa l'opzione -T per sostituire interamente lo script del linker predefinito, ma nota l'effetto del comando "INSERT".
TL; DR ☺. In poche parole:nella maggior parte dei casi gli utenti non sono a conoscenza dello script del linker che stanno utilizzando perché uno "script principale" (=script predefinito ) è fornito dalla catena degli strumenti. Lo script principale fa pesantemente riferimento agli intrinseci delle sezioni generate dal compilatore e devi imparare le corde per cambiarlo. La maggior parte degli utenti no.
L'approccio comune per fornire il proprio script è tramite il -T
opzione. In questo modo lo script del linker principale viene ignorato e il tuo script assume il controllo del collegamento. Ma devi scrivere tutto da zero.
Se vuoi solo aggiungere una funzionalità minore, puoi scrivere le tue specifiche in un file e aggiungere il nome del file alla riga di comando di ld
(o gcc / g++) senza il -T
opzione. In questo modo lo script del linker principale fa ancora il lavoro principale ma il tuo file lo aumenta. Se utilizzi questo approccio, ricevi il messaggio dell'intestazione di questo thread per informarti che potresti aver fornito un oggetto danneggiato involontariamente.
La fonte di questa confusione è che non c'è modo di specificare il ruolo del file aggiuntivo. Questo potrebbe essere facilmente risolto aggiungendo un'altra opzione a ld
proprio come il -dT
opzione per "d efault scriptfile”:introduce un -sT
opzione per "s file di script aggiuntivo”.
È un bug in alcune versioni di LD. Ignoralo per ora o controlla se la tua distribuzione ha un aggiornamento per il tuo LD. (pacchetto binutils)
http://www.freepascal.org/faq.var#unix-ld219