it-swarm-tr.com

crti.o dosyası eksik

Bir GNU alet zinciri kullanarak bir proje yapıyorum ve linker eksik/şikayet edemediği için crti.o adresini bulabildiğimde her şey yolunda gidiyor Bu benim nesne dosyalarımdan biri değil, libc ile ilgili gibi görünüyor ama neden bu crti.o dosyasına ihtiyaç duyduğunu anlayamıyorum, örn. libc.a?

Kol platformu için çapraz derleme yapıyorum. Dosyayı araç zincirinde bulunduruyorum, ancak linkeri dahil etmek için nasıl edinebilirim? 

crti.o 'kütüphaneler' arama yolundan birinde, ancak kitaplık yolundaki .o dosyasını aramalı mı? 

Arama yolu gcc ve ld için aynı mı?

23
Richard

crti.o, genellikle oldukça küçük olan bootstrap kütüphanesidir. Bu genellikle ikili sisteminize statik olarak bağlanır. /usr/lib içinde bulunmalıdır.

İkili bir dağıtım çalıştırıyorsanız, tüm geliştirici öğelerini -dev paketlerine (örneğin, libc6-dev) koyma eğilimindedirler, çünkü bunları derlemek için derleme programları çalıştırmak gerekmez.

Çapraz derleme yapmıyorsun değil mi? 

Çapraz derleme yapıyorsanız, bu genellikle, crti.o'nuzun eşleşmeyen gcc'nin arama yolunda bir sorundur. Alet zinciri iken yapılmalıydı. Kontrol edilecek ilk şey gcc -print-search-dirs olup, crti.o dosyasının bu yollardan herhangi birinde olup olmadığını kontrol edin.

Bağlantı aslında ld tarafından yapılır, ancak yolları gcc tarafından aşağıya aktarılır. Muhtemelen olup bitenleri bulmanın en hızlı yolu, bir helloworld.c programını derlemektir ve ld'ye neyin geçtiğini ve ne olup bittiğini görmek için onu zorlaştırır.

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

Günlük dosyasını açın ve çapraz olmayan derleyicimi görebileceğiniz gibi crti.o dosyasını arayın:

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

open(...crti.o) = -1 ENOENT için bir sürü girişim görürseniz, ld'ın kafası karışıyor ve açıldığı yolun nereden geldiğini görmek istiyorsunuz ...

23
stsquad

Aynı şeyi çapraz derleme yaparken de yaptım. crti.o <sysroot>/usr/lib64 konumundaydı, ancak linker bulamıyordu.

Boş bir dizin oluşturmanın <sysroot>/usr/lib sorunu çözdüğü ortaya çıktı. Bağlayıcının ilk önce <sysroot>/usr/lib yolunu arayacağı ve yalnızca varsa bile <sysroot>/usr/lib64 'u göz önüne alacağı görülüyor.

Bu, bağlayıcıdaki bir hata mı? Yoksa bu davranış bir yerde mi belgeleniyor?

3
chris

Benim durumum Linux Mint 18.0/Ubuntu 16.04, hiç crti.o 'a sahip değilim:

$ find /usr/ -name crti*

Hiçbir şey bulamadığım için geliştirici paketini yükleyeceğim:

Sudo apt-get install libc6-dev

Bazı lib'ler bulursanız burada okuyun

3
Eugen Konkov

Kötü ayarlanmış bir çapraz derleyicide de benzer bir sorunla karşılaştım. Etrafta böyle dolaştım:

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

Bu,/lib,/usr/include ve benzerlerinin sysroot seçeneğinin gösterdiği konumda bulunduğunu varsayar. Muhtemelen işlerin yapılması gerektiği gibi değildir, fakat basit bir C dosyasını derlememe ihtiyaç duyduğumda beni belaya soktu.

1
Rob Fisher

Tamam, eksik zincirleri içerecek şekilde alet zincirini yeniden yüklemem gerekti. Garip görünüyor çünkü onu gcc yolunda bulmalıydı. Sanırım ana sorun bilgisayarımda 15 ya da çok farklı crti.o dosyası vardı ve doğru olanı işaret etmemişti. Hala o zamandan beri yapmıyor ama şimdi çalışıyor :-) Yardımlarınız için teşekkürler :-)

1
Richard

Varsayılan bir Ubuntu 8.04 kurulumunda da aynı tür sorunları alıyorum. Bunun için libc geliştirici başlıklarını/dosyalarını manuel olarak almak zorunda kaldım.

0
leppie

Bu benim için çözüldü (ARM için çapraz derleme pjsip):

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