¿Cómo se crean versiones anteriores de gcc? Errores acerca de crti.o no encontrados

¿Cómo se crean versiones anteriores de gcc? Errores acerca de crti.o no encontrados

¿Cómo puedo crear un gcc anterior (específicamente, 4.5.2) en Ubuntu 11.10 y evitar errores sobre "/usr/bin/ld: no se puede encontrar crti.o: no existe tal archivo o directorio"?

Investigué un poco y encontré varios elementos similares, pero ninguno que realmente resuelva mi problema:

  • He verificado que todos mis paquetes (libc6-dev y similares) están reinstalados segúnesta pregunta
  • He verificado que crti.o existe en /usr/lib32 y /usr/lib/x86_64-linux-gnu, y que mi ld.so.conf está configurado para buscar en esos directorios
  • He verificado que anteponer mi invocación make con LIBRARY_PATH=/usr/lib/x86_64-linux-gnu funciona, pero me gustaría evitarlo (se convierte en un punto divergente en los archivos make).
  • Probé varias cosas con --with-build-sysroot, pero sin éxito (léase: tal vez simplemente no sé cuál es el indicador correcto que debo configurar)
  • Al correr con strace (segúnesta respuesta), puedo ver la referencia simple a crti.o:

    13240 open("crti.o", O_RDONLY) = -1 ENOENT (No existe tal archivo o directorio)

¡Gracias!

Respuesta1

Incluso versiones muy nuevas de GCC fallan con ese mensaje. Esto se debe a que las nuevas versiones de Debian/Ubuntu admitirán multiarca (es decir, instalar archivos binarios para varias máquinas en un sistema de archivos), por lo que las bibliotecas se han alejado de los lugares estándar.

Hay parches GCC para solucionarloaquí(versiones finales aún no aprobadas, pero correctas para Ubuntu), y probablemente se apliquen a GCC anteriores sin mucho esfuerzo, tal vez. Creo que necesitas configurar GCC con--enable-multiarca, o algo.

Mientras tanto, crear enlaces blandos es una buena solución:

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

(el nombre de la carpeta será diferente en instalaciones de 32 bits).

Espero que ayude.

Respuesta2

Yo tuve el mismo problema. Hacer enlaces simbólicos desde /usr/libs/crt?.o a /usr/lib/x86_64-linux-gnu/crt?.ome resolvió el problema.

Respuesta3

Resolví este problema con un par de soluciones que podrían resultarle útiles.

Primero, cree GCC con LIBRARY_PATH=/usr/lib/x86_64-linux-gnu, para que el proceso de arranque de compilación sepa dónde encontrar los crt?.oarchivos de inicio.

Luego, en lugar de crear crt?.oenlaces simbólicos /usr/libque afecten a todo el sistema, puede vincular esos tres archivos al ${prefix}/lib/gcc/...directorio correspondiente al ${prefix}/bindirectorio gccen el que está instalado el ejecutable. En realidad, eso está casi en la parte superior de la ruta de búsqueda de los archivos de inicio, por lo que los encontrará, pero no afectan nada más.

En mi caso, el directorio específico para colocarlos fue lib/gcc/x86_64-unknown-linux-gnu/4.3.2/; puedes encontrar el correcto porque ya tiene otros archivos similares crtbegin.o.

Respuesta4

Construí GCC 4.1.2 en Ubuntu x86_64 preciso. Mientras lo hacías, eché un vistazo a la pista del último comando "xgcc" buscando un tiempo de ejecución de 32 bits c, grep-ped /32/ de la siguiente manera. El tiempo de ejecución de C en el mío está en /usr/lib32, que lo proporciona el paquete 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)

Entonces, creé los enlaces simbólicos crt?.o en el directorio que buscaba 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 

Construí GCC 4.1.2 con éxito con él.

información relacionada