it-swarm-id.com

file crti.o hilang

Saya sedang membangun sebuah proyek menggunakan rantai alat GNU dan semuanya berfungsi dengan baik sampai saya dapat menautkannya, di mana penghubung mengeluh bahwa itu hilang/tidak dapat menemukan crti.o. Ini bukan salah satu file objek saya, sepertinya terkait dengan libc tapi saya tidak mengerti mengapa ini membutuhkan crti.o ini, bukankah itu menggunakan file perpustakaan, mis. libc.a?

Saya mengkompilasi silang untuk platform lengan. Saya memiliki file di toolchain, tetapi bagaimana cara mendapatkan linker untuk memasukkannya?

crti.o ada di salah satu jalur pencarian 'libraries', tetapi haruskah ia mencari file .o di path library?

Apakah jalur pencarian sama untuk gcc dan ld?

23
Richard

crti.o adalah pustaka bootstrap, umumnya cukup kecil. Biasanya terhubung secara statis ke biner Anda. Itu harus ditemukan di /usr/lib.

Jika Anda menjalankan distribusi biner, mereka cenderung memasukkan semua hal pengembang ke dalam paket -dev (mis. Libc6-dev) karena tidak diperlukan untuk menjalankan program yang dikompilasi, hanya untuk membuatnya.

Anda tidak melakukan kompilasi silang, bukan?

Jika Anda melakukan kompilasi silang, biasanya ini masalah dengan jalur pencarian gcc yang tidak cocok dengan tempat crti.o Anda. Seharusnya dibangun ketika toolchain itu. Hal pertama yang harus diperiksa adalah gcc -print-search-dirs dan lihat apakah crti.o ada di jalur tersebut.

Tautan sebenarnya dilakukan oleh ld tetapi jalurnya diturunkan oleh gcc. Mungkin cara tercepat untuk mengetahui apa yang terjadi adalah mengkompilasi program helloworld.c dan mengencangkannya untuk melihat apa yang diteruskan ke ld dan melihat apa yang terjadi.

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

Buka file log dan cari crti.o, seperti yang Anda lihat kompiler non-silang saya:

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

Jika Anda melihat banyak upaya ke open(...crti.o) = -1 ENOENT, ld semakin bingung dan Anda ingin melihat dari mana jalan pembukaan itu berasal ...

23
stsquad

Saya memiliki masalah yang sama saat kompilasi silang. crti.o berada di <sysroot>/usr/lib64 tetapi linker tidak menemukannya.

Ternyata membuat direktori kosong <sysroot>/usr/lib memperbaiki masalah. Tampaknya penghubung akan mencari path <sysroot>/usr/lib pertama, dan hanya jika ada, ia akan mempertimbangkan <sysroot>/usr/lib64 .

Apakah ini bug di tautan? Atau perilaku ini didokumentasikan di suatu tempat?

3
chris

Dalam kasus saya Linux Mint 18.0/Ubuntu 16.04, saya tidak punya crti.o sama sekali:

$ find /usr/ -name crti*

Saya tidak menemukan apa pun jadi saya menginstal paket pengembang:

Sudo apt-get install libc6-dev

Jika Anda menemukan beberapa libs baca di sini

3
Eugen Konkov

Saya punya masalah yang sama dengan cross-compiler yang kurang baik diatur. Saya menyiasatinya seperti ini:

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

Ini mengasumsikan/lib,/usr/include dan seterusnya ada di lokasi yang ditunjuk oleh opsi sysroot. Ini mungkin bukan bagaimana hal-hal yang seharusnya dilakukan, tetapi itu membuat saya keluar dari masalah ketika saya perlu mengkompilasi file C sederhana.

1
Rob Fisher

OK saya harus menginstal ulang rantai alat, sehingga file yang hilang kemudian dimasukkan. Tampaknya aneh karena seharusnya menemukannya di jalur gcc. Masalah utama yang saya kira adalah bahwa saya memiliki 15 file crti.o yang berbeda di komputer saya dan tidak mengarah ke yang benar. Masih belum berhasil karena tetapi berfungsi sekarang :-) Terima kasih atas bantuan Anda :-)

1
Richard

Saya mendapatkan masalah yang sama pada instalasi default Ubuntu 8.04. Saya harus mendapatkan header/file libc developer secara manual agar bisa berfungsi.

0
leppie

Ini dipecahkan untuk saya (lintas kompilasi pjsip untuk ARM):

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