it-swarm-eu.dev

crti.o soubor chybí

Stavím projekt pomocí nástroje GNU a vše funguje dobře, dokud se nedostanu k propojení, kde linker stěžuje, že chybí/nemůže najít crti.o. Nejedná se o jeden z mých objektových souborů, zdá se, že souvisí s libc, ale nemohu pochopit, proč by to potřebovalo tento crti.o, nepoužil by soubor knihovny, např. libc.a?

Zkřížím kompilaci pro platformu paže. Mám soubor v toolchainu, ale jak mohu dostat linker, aby ho zahrnoval? 

crti.o je na jedné z vyhledávacích cest 'knihoven', ale měla by hledat soubor .o na cestě knihovny? 

Je cesta pro vyhledávání stejná pro gcc a ld?

23
Richard

crti.o je bootstrap knihovna, obecně docela malá. Obvykle je staticky propojen s vaším binárním souborem. Mělo by být nalezeno v /usr/lib.

Pokud používáte binární distribuci, mají tendenci vkládat všechny vývojáře do balíčků -dev (např. Libc6-dev), protože není nutné spouštět kompilované programy, jen je budovat.

Ty nejsi cross-kompilace jsi ty? 

Pokud se jedná o křížové kompilace, je to obvykle problém s vyhledávací cestou gcc, která neodpovídá, kde je vaše crti.o. Měla být postavena, když byla nástrojová nápověda. První věc, kterou je třeba zkontrolovat, je gcc -print-search-dirs a zjistit, zda je crti.o v některé z těchto cest.

Propojení je vlastně prováděno pomocí ld, ale má své cesty, které mu předává gcc. Pravděpodobně nejrychlejší způsob, jak zjistit, co se děje, je kompilovat program helloworld.c a sledovat jej, co se děje, a zjistit, co se děje.

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

Otevřete soubor protokolu a vyhledejte crti.o, jak vidíte můj non-cross kompilátor:

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

Pokud vidíte spoustu pokusů o open(...crti.o) = -1 ENOENT, ld je zmatený a chcete vidět, odkud pochází cesta, kterou otevírala ...

23
stsquad

Při křížovém kompilaci jsem měl stejný problém. crti.o byl v <sysroot>/usr/lib64 ale linker by ho nenalezl.

Ukázalo se, že vytvoření prázdného adresáře <sysroot>/usr/lib problém vyřešilo. Zdá se, že linker by hledal cestu <sysroot>/usr/lib first a pouze kdyby existoval, uvážil by to <sysroot>/usr/lib64 .

Je to chyba linkeru? Nebo je toto chování někde dokumentováno?

3
chris

V mém případě Linux Mint 18.0/Ubuntu 16.04 vůbec nemám crti.o:

$ find /usr/ -name crti*

Nenašel jsem nic, takže instaluji balíček pro vývojáře:

Sudo apt-get install libc6-dev

Pokud najdete nějaké libs read here

3
Eugen Konkov

Měl jsem podobný problém se špatně nastaveným cross-kompilátorem. Mám to tak rád:

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

To předpokládá, že/lib,/usr/include a tak dále existují v umístění, na které odkazuje volba sysroot. Pravděpodobně to není to, co by se mělo dělat, ale dostalo mě to z problémů, když jsem potřeboval sestavit jednoduchý soubor C.

1
Rob Fisher

OK Musel jsem přeinstalovat řetězec nástrojů, takže chybějící soubory byly pak zahrnuty. Zdá se to divné, protože by ho mělo najít na cestě gcc. Hlavní problém myslím, že jsem měl 15 nebo tak různé crti.o soubory na svém počítači a nebyl poukazovat na správné. Stále to ale nedělá, ale funguje to teď :-) Díky za pomoc :-)

1
Richard

Mám stejný druh problému na výchozí instalaci Ubuntu 8.04. Musel jsem ručně dostat záhlaví/soubory libc vývojářů, aby to fungovalo.

0
leppie

To se mi vyřešilo (křížové kompilace pjsipu pro ARM):

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