2008-09-18 14 views
21

Estoy construyendo un proyecto usando una cadena de herramientas GNU y todo funciona bien hasta que llego a vincularlo, donde el enlazador se queja de que falta/no puede encontrar crti.o. Este no es uno de mis archivos objeto, parece estar relacionado con libc pero no puedo entender por qué necesitaría este crti.o, ¿no usaría un archivo de biblioteca, p. libc.a?falta el archivo crti.o

Estoy compilando de forma cruzada para la plataforma del brazo. Tengo el archivo en la cadena de herramientas, pero ¿cómo consigo que el enlazador lo incluya?

crti.o está en una de las 'bibliotecas' ruta de búsqueda, pero ¿debería buscar el archivo .o en la ruta de la biblioteca?

¿La ruta de búsqueda es la misma para gcc y ld?

+0

para Mac , ver: http://stackoverflow.com/questions/1365211/error-in-xcode-project-ld-library-not-found-for-lcrt1-10-6-o/16102800 http://stackoverflow.com/ questio ns/10941247/command-line-library-build-failed-with-linker-error/16102769 – kenorb

Respuesta

22

crti.o es la biblioteca de bootstrap, generalmente bastante pequeña. Por lo general, está vinculado de forma estática con tu binario. Se debe encontrar en /usr/lib.

Si está ejecutando una distribución binaria, tienden a poner todo el material de desarrollo en paquetes -dev (por ejemplo, libc6-dev) ya que no es necesario para ejecutar programas compilados, solo para compilarlos.

Usted no está compilando cruzado ¿verdad?

Si compila de forma cruzada, suele ser un problema que la ruta de búsqueda de gcc no coincida con su crti.o. Debería haberse construido cuando la cadena de herramientas estaba. Lo primero que debe verificar es gcc -print-search-dirs y vea si crti.o está en alguna de esas rutas.

El enlace se realiza en realidad por ld pero tiene sus rutas pasadas a él por gcc. Probablemente la manera más rápida de descubrir qué está pasando es compilar un programa helloworld.c y buscarlo para ver qué pasa a ld y ver qué está pasando.

strace -v -o log -f -e trace=open,fork,execve gcc hello.c -o test 

Abrir el archivo de registro y la búsqueda de crti.o, como se puede ver mi compilador no cruz:

10616 execve("/usr/bin/ld", ["/usr/bin/ld", "--eh-frame-hdr", "-m", "elf_x86_64", "--hash-style=both", "-dynamic-linker", "/lib64/ld-linux-x86-64.so.2", "-o" 
, "test", "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "-L/usr/lib/gcc/x86_64-linux-g 
nu/"..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., "-L/lib/../lib", "-L/usr/lib/../lib", "-L/usr/lib/gcc/x86_64-linux-gnu 
/"..., "/tmp/cc4rFJWD.o", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", "-lc", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", "/usr/lib/gcc/x86_ 
64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."...], "COLLECT_GCC=gcc", "COLLECT_GCC_OPTIONS=\'-o\' \'test\' "..., "COMPILER_PATH=/usr/lib/gcc/x86_6"..., "LIBRARY_PATH=/usr/lib/gcc/x86_64"..., "CO 
LLECT_NO_DEMANGLE="]) = 0 
10616 open("/etc/ld.so.cache", O_RDONLY) = 3 
10616 open("/usr/lib/libbfd-2.18.0.20080103.so", O_RDONLY) = 3 
10616 open("/lib/libc.so.6", O_RDONLY) = 3 
10616 open("test", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3 
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/../../../../lib/crt1.o", O_RDONLY) = 4 
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/../../../../lib/crti.o", O_RDONLY) = 5 
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/crtbegin.o", O_RDONLY) = 6 
10616 open("/tmp/cc4rFJWD.o", O_RDONLY) = 7 

Si ves un montón de intentos de open(...crti.o) = -1 ENOENT, ld se está confundiendo y desea ver de dónde vino el camino que está abriendo ...

+0

+1 para el truco de strace inmensamente útil. Pero mi problema aún no se ha resuelto (compilación cruzada de pjsip en ARM) – FractalSpace

+0

@FractalSpace podría ser un problema diferente. ¿Puedes publicar una pregunta con la salida que obtienes? – stsquad

+0

@stsquad Es el mismo problema de la cadena de herramientas de configuración incorrecta. He encontrado una solución que soluciona el problema para mí. Ver mi respuesta a continuación. – FractalSpace

0

Obtengo el mismo tipo de problema en una instalación predeterminada de Ubuntu 8.04. Tenía que obtener manualmente los encabezados/archivos del desarrollador de libc para que funcionara.

1

OK Tuve que volver a instalar la cadena de herramientas, para que los archivos faltados se incluyan. Parece extraño, ya que debería haberlo encontrado en la ruta gcc. El problema principal, supongo, es que tenía 15 o más archivos crti.o diferentes en mi computadora y no apuntaba a la correcta. Todavía no funciona desde entonces, pero funciona ahora :-) Gracias por su ayuda :-)

1

Tuve un problema similar con un compilador cruzado mal configurado. Tengo alrededor de ella, así:

/home/rob/compiler/usr/bin/arm-linux-gcc --sysroot=/home/rob/compiler hello.c 

Esto supone/lib,/usr/include y así sucesivamente en la ubicación en la que apunta la opción sysroot. Probablemente no sea así como se supone que deben hacerse las cosas, pero me sacó de problemas cuando necesité compilar un simple archivo C.

0

Esta resuelto para mí (compilación cruzada PJSIP para ARM):

export LDFLAGS='--sysroot=/home/me/<path-to-my-sysroot-parent>/sysroot' 
2

que tenían el mismo problema durante la compilación cruzada. crti.o estaba en <sysroot>/usr/lib64 pero el enlazador no lo encontraría.

Resulta que la creación de un directorio vacío <sysroot>/usr/lib ha solucionado el problema. Parece que el enlazador sería buscar un camino <sysroot>/usr/lib primero, y sólo si existe sería incluso considerar <sysroot>/usr/lib64.

¿Esto es un error en el vinculador? ¿O este comportamiento está documentado en alguna parte?

+0

Esto funcionó para mí. Me da miedo pensar cuánto tiempo tuve que pasar para descubrir eso. No sé si esto es un error o qué, pero tal vez valga la pena tomar el GNU ld bugzilla o la lista de correo o algo así. –

1

En mi caso Linux Mint 18.0/Ubuntu 16.04, no tengo crti.o en absoluto:

$ find /usr/ -name crti* 

no encuentro nada por lo que instalar el paquete desarrollador:

sudo apt-get install libc6-dev 

Si encuentra algunas librerías read here