Come si creano versioni precedenti di gcc? Errori su crti.o non trovati


10

Come posso creare un vecchio gcc (in particolare, 4.5.2) su Ubuntu 11.10 ed evitare errori su "/ usr / bin / ld: impossibile trovare crti.o: nessun file o directory"?

Ho fatto un po 'di ricerche e ho trovato diversi oggetti simili, ma nessuno che risolva effettivamente il mio problema:

  • Ho verificato che tutti i miei pacchetti (libc6-dev e simili) siano reinstallati per questa domanda
  • Ho verificato che crti.o esiste in / usr / lib32 e / usr / lib / x86_64-linux-gnu e che il mio ld.so.conf è configurato per cercare in quelle directory
  • Ho verificato che anteporre la mia invocazione make con LIBRARY_PATH = / usr / lib / x86_64-linux-gnu funziona, ma vorrei evitarlo (diventa un punto divergente nei makefile)
  • Ho provato varie cose con --with-build-sysroot, ma senza successo (leggi: forse non conosco la bandiera giusta da impostare)
  • Quando corro con strace (come da questa risposta ), posso vedere il semplice riferimento a crti.o:

    13240 open ("crti.o", O_RDONLY) = -1 ENOENT (nessun file o directory)

Grazie!

Risposte:


7

Ho avuto lo stesso problema. Creare collegamenti simbolici /usr/libs/crt?.o per /usr/lib/x86_64-linux-gnu/crt?.orisolvere il problema per me.


Questo funziona, sì. Speravo in una soluzione che fosse più sulla falsariga dell'installazione di gcc piuttosto che confondere con le strutture di file sottostanti, però ...
Matt

Volevo aggiungere questo nel mio caso, ho ricompilato glibc e GCC, ma ho dimenticato di sbarazzarmi di una vecchia variante slackware-gcc che era in / usr / bin /. Quando ho rimosso quest'ultimo, ho potuto compilare di nuovo alcune cose (come di nuovo gcc).
shevy

10

Anche le versioni molto nuove di GCC falliscono con quel messaggio. È perché le nuove versioni di Debian / Ubuntu (supporteranno) supporteranno il multiarch (ovvero l'installazione di binari per più macchine in un unico file system), quindi le librerie sono state spostate dalle posizioni standard.

Ci sono patch GCC per risolverlo qui (versioni finali non ancora approvate, ma corrette per Ubuntu), e probabilmente si applicano a GCC precedenti senza troppi sforzi, forse. Penso che tu debba configurare GCC con --enable-multiarch , o qualcosa del genere.

Nel frattempo, la creazione di collegamenti software è una buona soluzione:

cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .

(il nome della cartella sarà diverso nelle installazioni a 32 bit).

Spero che aiuti.


Grazie per il punto sul fatto che è multiarca. Speravo in una risoluzione sul "perché" ha smesso di funzionare.
Matt,

2

Ho risolto questo problema con un paio di soluzioni alternative che potrebbero esserti utili.

Innanzitutto, compilare GCC con LIBRARY_PATH=/usr/lib/x86_64-linux-gnu, in modo che il processo di avvio bootstrap sappia dove trovare i crt?.ofile di avvio.

Quindi, invece di creare crt?.ocollegamenti simbolici nei punti in /usr/libcui incidono sull'intero sistema, è possibile collegare i tre file nella ${prefix}/lib/gcc/...directory corrispondente alla ${prefix}/bindirectory in cui gccè installato l' eseguibile. In realtà è quasi all'inizio del suo percorso di ricerca per i file di avvio, quindi li troverà, ma non influenzano nient'altro.

Nel mio caso, la directory specifica in cui inserirli era lib/gcc/x86_64-unknown-linux-gnu/4.3.2/; puoi trovare quello giusto perché contiene già altri file simili crtbegin.o.


1

Ho creato GCC 4.1.2 su Ubuntu preciso x86_64. Come hai fatto, ho dato un'occhiata alla sequenza dell'ultimo comando "xgcc" in cerca di runtime a 32 bit, grep-ped / 32 / come segue. Il mio runtime è in / usr / lib32 che è fornito dal pacchetto libc6-dev-i386.

fgrep /32/ strace-output.txt | grep /usr/lib | head -1
access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32/crti.o", R_OK) = -1 ENOENT (No such file or directory)

Quindi, ho creato i collegamenti simbolici crt? .O nella directory cercata da xgcc.

sudo mkdir -p /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
cd /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
sudo ln -s /usr/lib32/crt1.o 
sudo ln -s /usr/lib32/crtn.o 
sudo ln -s /usr/lib32/crti.o 

Ho costruito con successo GCC 4.1.2 con esso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.