crti.o brak pliku

Buduję projekt używając łańcucha narzędzi GNU i wszystko działa dobrze, dopóki nie dojdę do linkowania, gdzie linker skarży się, że go brakuje/nie może znaleźć crti.o. Nie jest to jeden z moich plików obiektowych, wydaje się, że jest związany z libc, ale nie rozumiem, po co mu ten crti.o, czy nie użyłby pliku bibliotecznego, np. libc.a?

/ Align = "left" / Mam plik w toolchainie, ale jak mogę zmusić linker do włączenia go?

crti.o jest na jednym z ścieżka wyszukiwania 'libraries' , ale czy powinna szukać pliku .o na ścieżce biblioteki?

Czy ścieżka wyszukiwania jest taka sama dla gcc i ld?

Author: Karl Richter, 2008-09-18

7 answers

crti.o jest biblioteką bootstrap, na ogół dość małą. Zazwyczaj jest statycznie połączony z Twoim binarnym. Należy go znaleźć w /usr/lib.

Jeśli używasz dystrybucji binarnej, to zazwyczaj umieszczasz wszystkie rzeczy deweloperskie w pakietach-dev (np. libc6-dev), ponieważ nie jest to potrzebne do uruchamiania skompilowanych programów, tylko do ich budowania.

Nie kompilujesz, prawda?

Jeśli kompilujesz krzyżowo, zwykle jest to problem ze ścieżką wyszukiwania gcc nie pasującą do miejsca, w którym twój crti.o jest. Powinien być zbudowany, gdy toolchain był. Pierwszą rzeczą do sprawdzenia jest gcc -print-search-dirs i sprawdzić, czy crti.o jest na każdej z tych ścieżek.

Linkowanie jest w rzeczywistości wykonywane przez ld, ale ma swoje ścieżki przekazywane do niego przez gcc. Prawdopodobnie najszybszym sposobem, aby dowiedzieć się, co się dzieje, jest skompilowanie helloworld.program c i strace go, aby zobaczyć, co jest przekazywane do ld i zobaczyć, co się dzieje.

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

Otwórz plik dziennika i wyszukaj crti.o, jak widać mój Nie-krzyż kompilator:

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

Jeśli zobaczysz kilka prób open(...crti.o) = -1 ENOENT, ld robi się zdezorientowany i chcesz zobaczyć, skąd wzięła się ścieżka, którą otwiera...

 23
Author: stsquad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 18:18:16

W moim przypadku Linux Mint 18.0/Ubuntu 16.04 w ogóle nie mam crti.o:

$ find /usr/ -name crti*

Nic nie znajduję więc instaluję Pakiet Programisty:

sudo apt-get install libc6-dev

Jeśli znajdziesz jakieś libs przeczytaj tutaj

 3
Author: Eugen Konkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-01 07:30:05

Miałem ten sam problem podczas kompilacji krzyżowej. crti.o był w / usr / lib64, ale linker go nie znalazł.

Okazało się, że utworzenie pustego katalogu /usr/lib naprawiło problem. Wygląda na to, że linker najpierw wyszukuje ścieżkę /usr/lib i tylko jeśli istnieje, rozważy nawet /usr/lib64.

Czy to błąd w linkerze? Czy to zachowanie jest gdzieś udokumentowane?

 2
Author: chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-08 06:52:14

OK musiałem ponownie zainstalować łańcuch narzędzi, tak, że brakujące pliki zostały następnie włączone. Wydaje się to dziwne, ponieważ powinien był znaleźć go na ścieżce gcc. Głównym problemem było chyba to, że miałem 15 lub tak różnych crti.o pliki na moim komputerze i nie wskazywał na poprawny. Nadal nie robi, ale teraz działa: -) dzięki za pomoc: -)

 1
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 14:41:26

Miałem podobny problem z źle skonfigurowanym cross-kompilatorem. Obejrzałem tak:

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

Zakłada, że /lib, /usr/include i tak dalej istnieją w lokalizacji wskazywanej przez opcję sysroot. Prawdopodobnie tak nie powinno się robić, ale wyciągnęło mnie to z kłopotów, gdy potrzebowałem skompilować prosty plik C.

 1
Author: Rob Fisher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-20 14:39:45

Mam ten sam problem na domyślnej instalacji Ubuntu 8.04. Musiałem ręcznie pobrać nagłówki/pliki dewelopera libc, aby działało.

 0
Author: leppie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 10:54:12

To dla mnie rozwiązane (cross kompilacji pjsip dla ARM):

export LDFLAGS='--sysroot=/home/me/<path-to-my-sysroot-parent>/sysroot'
 0
Author: FractalSpace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-17 21:37:51