¿Cómo se compilan versiones anteriores de gcc? Errores sobre crti.o no se encuentran

10

¿Cómo puedo construir 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 artículos similares, pero ninguno que realmente resuelva mi problema:

  • Verifiqué que todos mis paquetes (libc6-dev y similares) se reinstalan según esta 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
  • Verifiqué que anteponer mi invocación de make con LIBRARY_PATH = / usr / lib / x86_64-linux-gnu funciona, pero me gustaría evitar esto (se convierte en un punto divergente en los makefiles)
  • He intentado varias cosas con --with-build-sysroot, pero sin éxito (léase: tal vez simplemente no conozco la bandera correcta para configurar)
  • Cuando se ejecuta con strace (según esta respuesta ), puedo ver la referencia desnuda a crti.o:

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

¡Gracias!

Mate
fuente

Respuestas:

7

Yo tuve el mismo problema. Hacer enlaces simbólicos /usr/libs/crt?.o para /usr/lib/x86_64-linux-gnu/crt?.oresolver el problema para mí.

Yoav
fuente
Esto funciona, sí. Sin embargo, esperaba una solución que estuviera más en la línea de ajustar la instalación de gcc en lugar de muckear con las estructuras de archivos subyacentes ...
Matt
Quería agregar que en mi caso, volví a compilar glibc y GCC, pero olvidé deshacerme de una variante slackware-gcc anterior que estaba en / usr / bin /. Cuando eliminé este último, pude compilar ciertas cosas nuevamente (como gcc nuevamente).
shevy
10

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

Hay parches de GCC para arreglarlo aquí (aún no se aprobaron las versiones finales, pero son correctas para Ubuntu), y probablemente se apliquen a GCC anteriores sin mucho esfuerzo, tal vez. Creo que necesita configurar GCC con --enable-multiarch , o algo así.

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

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

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

Espero que ayude.

ams
fuente
Gracias por el punto sobre ser multiarch. Esperaba una resolución sobre "por qué" dejó de funcionar.
Matt
2

Resolví este problema con un par de soluciones que podrían serle ú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 en los /usr/libque afectan a todo el sistema, puede vincular esos tres archivos en el ${prefix}/lib/gcc/...directorio correspondiente al ${prefix}/bindirectorio en el que gccestá instalado el ejecutable. En realidad, está casi en la parte superior de su ruta de búsqueda para los archivos de inicio, por lo que los encontrará, pero no afectan a 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 como crtbegin.oen él.

Brooks Moses
fuente
1

Construí GCC 4.1.2 en Ubuntu precisa x86_64. Como lo hizo, eché un vistazo a la secuencia del último comando "xgcc" en busca de 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 es proporcionado por 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 xgcc buscado.

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í con éxito GCC 4.1.2 con él.

Naoyuki Tai
fuente