Domanda

Sto costruendo un progetto che utilizza uno strumento GNU catena e tutto funziona bene fino a che non arriva per il collegamento di esso, in cui il linker si lamenta che è mancante, non riesce a trovare crti.o.Questo non è uno dei miei file oggetto, sembra essere collegato a libc, ma non riesco a capire perché sarebbe bisogno di questo crti.o, non sarebbe utilizzare una libreria di file, ad esempio libc.a?

Sto cross compilazione per la piattaforma arm.Ho il file in toolchain, ma come faccio ad ottenere il linker di includere?

crti.o è una delle "biblioteche" percorso di ricerca, ma si dovrebbe cercare .o file nella libreria di percorso?

È il percorso di ricerca lo stesso per gcc e ld?

È stato utile?

Soluzione

crti.o è la libreria bootstrap, generalmente molto piccole.È di solito collegata staticamente nel binario.Deve essere trovato nella /usr/lib.

Se si esegue una distribuzione binaria tendono a mettere tutti i developer roba in pacchetti-dev (ad es.libc6-dev), in quanto non è necessario per eseguire programmi compilati, proprio per la loro costruzione.

Non siete cross-compilazione sei?

Se sei di cross-compilazione è di solito un problema con gcc percorso di ricerca che non hanno una corrispondenza in cui il vostro crti.o è.Dovrebbe essere stato costruito quando la toolchain è stato.La prima cosa da controllare è gcc -print-search-dirs e vedere se crti.o è in uno di quei percorsi.

Il collegamento è in realtà fatto da ld ma ha i suoi percorsi, tramandata da gcc.Probabilmente il modo più veloce per scoprire che cosa sta succedendo è compilare un helloworld.programma in c e strace per vedere che cosa è farsi passare per ld e vedere cosa succede.

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

Aprire il file di log e di ricerca per crti.o, come si può vedere il mio non-cross compilatore:

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

Se si vede un mucchio di tentativi di open(...crti.o) = -1 ENOENT, ld è sempre confuso e si vuole vedere dove il percorso si apre venuti...

Altri suggerimenti

Ho avuto lo stesso problema, mentre la cross-compilazione.crti.o è stato in <sysroot>/usr/lib64 ma il linker non trova.

Scopre che la creazione di una directory vuota <sysroot>/usr/lib risolto il problema.Sembra che il linker una ricerca di un percorso <sysroot>/usr/lib primo, e solo se esiste sarebbe nemmeno in considerazione <sysroot>/usr/lib64.

Si tratta di un bug nel linker?O è questo comportamento documentato da qualche parte?

Nel mio caso Linux Mint 18.0/Ubuntu 16.04, Io non ho crti.o a tutti:

$ find /usr/ -name crti*

Non trovo nulla, così ho installato sviluppatore pacchetto:

sudo apt-get install libc6-dev

Se trovate qualche libs leggi qui

OK ho dovuto reinstallare il tool chain, in modo che i file mancanti sono stati poi inclusi.Mi sembra strano dato che dovrebbe avere trovato il gcc percorso.Il problema principale, credo, è che ho avuto 15 o così diversi crti.o file sul mio computer e non era punto per il corretto uno.Ancora non dato, ma ora funziona :-) Grazie per il vostro aiuto :-)

Ho avuto un problema simile con un mal di set-up cross-compilatore.Ho ottenuto intorno ad esso in questo modo:

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

Questo presuppone /lib, /usr/include e così via esistere nella posizione indicata dal sysroot opzione.Questo probabilmente non è come le cose dovrebbero essere fatte, ma a me ha dato problemi quando ho bisogno di compilare un semplice file in C.

Ho lo stesso tipo di problema su un default di Ubuntu 8.04 installare.Ho avuto per le libc sviluppatore intestazioni/file manualmente per farlo funzionare.

Questo ha risolto per me (cross compilazione pjsip per BRACCIO):

export LDFLAGS='--sysroot=/home/me/<path-to-my-sysroot-parent>/sysroot'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top