Saya baru saja membeli Raspberry Pi. Saya sudah mengkonfigurasinya, dan saya menginstal cross compiler untuk arm pada desktop saya (amd64). Saya mengkompilasi program "hello world" sederhana dan kemudian saya salin dari desktop saya ke Pi saya dengan scp ./hello [email protected]:~/hello
. Setelah masuk di Pi saya, saya menjalankan ls -l hello
dan saya mendapatkan respons normal:
-rwxr-xr-x 1 david david 6774 Nov 16 18:08 hello
Tetapi ketika saya mencoba menjalankannya, saya mendapatkan yang berikut:
david@raspberry-pi:~$ ./hello
-bash: ./hello: No such file or directory
david@raspberry-pi:~$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x6a926b4968b3e1a2118eeb6e656db3d21c73cf10, not stripped
david@raspberry-pi:~$ ldd hello
not a dynamic executable
compiling
executable
raspberry-pi
arm
David Martínez
sumber
sumber
file hello
danldd hello
posting hasilnya.Jawaban:
Jika
ldd
mengatakan itu bukan eksekusi dinamis, maka itu dikompilasi untuk target yang salah.Jelas Anda melakukan kompilasi silang, seperti yang
file
dikatakan adalah eksekusi 32-bit ARM. Namun, ada lebih dari satu arsitektur "ARM", jadi mungkin toolchain Anda salah dikonfigurasi.Jika Anda menggunakan crosstool-NG, lihat
.config
untuk nilaiCT_ARCH_ARCH
. Untuk pi raspberry, itu harus "armv6j" 1 - atau setidaknya, itulah yang bekerja untuk saya. Ada spesifik lainnya, tapi saya pikir itu sudah cukup. Sayangnya, jika itu salah, Anda sekarang harus membangun kembali.IMO mendapatkan toolchain lintas-kompiler untuk bekerja bisa membosankan dan membuat frustrasi, tetapi, menganggap host bukan merupakan faktor yang signifikan (seharusnya tidak boleh), dalam hal ini dapat dilakukan. Crosstool-ng menggunakan konfigurator TLI, jadi jika Anda akhirnya harus mencoba beberapa build, catat pilihan Anda setiap kali sehingga Anda tahu apa yang berhasil.
1 Saya percaya armv7 adalah lengkungan yang jauh lebih umum (banyak telepon dan semacamnya), jadi jika Anda hanya menggunakan sesuatu yang Anda yakini adalah kompiler silang ARM generik, mungkin itulah masalahnya. Angka-angka ini membingungkan karena, misalnya, prosesor pi adalah ARM11 , tetapi (sesuai halaman itu), keluarga prosesor ARM11 menggunakan arsitektur ARMv6 - yaitu ARM11 adalah implementasi ARMv6.
sumber
pertama kompilasi program Anda dengan
--static
opsi, lalu mengujinya. jika itu berfungsi sebagai statis maka pada raspberry pikemudian periksa semua lib jika ada
Saya telah memecahkan seperti ini. Saya telah
/lib/ld-linux-armhf-so.3
tetapi tidak/lib/ld-linux.so.3
membuatln -s
antara kemudian bekerja untuk sayasumber
Bagaimana cara mengidentifikasi masalah?
Berisi sesuatu seperti:
dan masalahnya adalah file itu tidak ada pada target.
Bagaimana cara mengatasi masalah tersebut?
Gunakan kompiler yang tepat, baik:
gunakan kompiler asli pada target. Tetapi umumnya target jauh lebih lambat daripada tuan rumah Anda, dan ruang terbatas, jadi Anda mungkin tidak ingin melakukan ini.
Anda mungkin juga dapat menggunakan emulator fungsional seperti QEMU untuk membangun, dan kemudian hanya menjalankan program pada platform yang lebih lambat, misalnya gem5 atau papan lambat.
Hanya meretasnya
interpreter
berpotensi tidak cukup, terutama Anda harus memastikan kompatibilitas biner antara program dan libc target, atau antarmuka program dan kernel (syscalls/proc
,, dll.) Jika Anda mencoba menggunakan-static
(kernel target mungkin terlalu tua dan tidak mengandung antarmuka yang diperlukan). Satu-satunya solusi yang kuat adalah dengan menggunakan toolchain yang benar.sumber
Pustaka pada sistem target berbeda dari pustaka sistem host yang dapat dieksekusi atau dieksekusi kompilasi Anda.
Anda harus menyertakan opsi --static di CFLAGS dan LDGLAGS Anda jika Anda menggunakan make. Jika Anda menggunakan gcc lurus, gunakan opsi --static dengan cara ini executable portable.
sumber