“Tidak ada file atau direktori seperti itu” ketika menjalankan program yang dikompilasi silang pada Raspberry Pi


8

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 david@192.168.1.33:~/hello. Setelah masuk di Pi saya, saya menjalankan ls -l hellodan 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

Coba file hellodan ldd helloposting hasilnya.
goldilocks


Anda telah memilih kompiler lintas yang salah. Dianggap hanya mengerjakan Pi sendiri?
Thorbjørn Ravn Andersen

Jawaban:


5

Jika lddmengatakan itu bukan eksekusi dinamis, maka itu dikompilasi untuk target yang salah.

Jelas Anda melakukan kompilasi silang, seperti yang filedikatakan adalah eksekusi 32-bit ARM. Namun, ada lebih dari satu arsitektur "ARM", jadi mungkin toolchain Anda salah dikonfigurasi.

Jika Anda menggunakan crosstool-NG, lihat .configuntuk nilai CT_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.


1

pertama kompilasi program Anda dengan --staticopsi, lalu mengujinya. jika itu berfungsi sebagai statis maka pada raspberry pi

cat "programname" | grep "lib*"
/lib/ld-linux.so.3
libc6.so 

kemudian periksa semua lib jika ada

Saya telah memecahkan seperti ini. Saya telah /lib/ld-linux-armhf-so.3tetapi tidak /lib/ld-linux.so.3 membuat ln -santara kemudian bekerja untuk saya


1

Bagaimana cara mengidentifikasi masalah?

file cross_compiled_executable

Berisi sesuatu seperti:

interpreter /lib/ld-uClibc.so.0

dan masalahnya adalah file itu tidak ada pada target.

Bagaimana cara mengatasi masalah tersebut?

Gunakan kompiler yang tepat, baik:

  • orang yang membuat image disk harus memberi Anda cross compiler atau memberi tahu Anda dengan tepat bagaimana membuatnya, misalnya dengan crosstool-ng . Bagaimana cara mendapatkannya untuk RPI ditanya di sini .
  • kompilasi gambar Anda sendiri dan kompiler silang, mis. dengan Buildroot . Ini adalah contoh umum QEMU . Buildroot memiliki dukungan RPI .
  • 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 interpreterberpotensi 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.


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.