Không có tập tin hoặc thư mục nào như vậy khi thực hiện chương trình được biên dịch chéo trên Raspberry Pi


8

Gần đây tôi đã mua một Raspberry Pi. Tôi đã cấu hình nó và tôi cài đặt một trình biên dịch chéo cho arm trên máy tính để bàn của mình (amd64). Tôi đã biên dịch một chương trình "hello world" đơn giản và sau đó tôi sao chép nó từ máy tính để bàn sang Pi của mình scp ./hello david@192.168.1.33:~/hello. Sau khi đăng nhập vào Pi của tôi, tôi chạy ls -l hellovà nhận được phản hồi bình thường:

-rwxr-xr-x 1 david david 6774 Nov 16 18:08 hello

Nhưng khi tôi cố gắng thực hiện nó, tôi nhận được như sau:

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

Hãy thử file helloldd hellogửi đầu ra.
goldilocks


Bạn đã chọn trình biên dịch chéo sai. Được coi là chỉ làm việc trên Pi?
Thorbjørn Ravn Andersen

Câu trả lời:


5

Nếu lddnói rằng nó không phải là một thực thi động, thì nó đã được biên dịch cho mục tiêu sai.

Rõ ràng là bạn đã biên dịch chéo nó, như đã filenói là một tệp thực thi ARM 32 bit. Tuy nhiên, có nhiều hơn một kiến ​​trúc "ARM", vì vậy có thể chuỗi công cụ của bạn được định cấu hình không chính xác.

Nếu bạn đang sử dụng crosstool-NG, hãy xem .configgiá trị của CT_ARCH_ARCH. Đối với pi mâm xôi, nó phải là "armv6j" 1 - hoặc ít nhất, đó là những gì làm việc cho tôi. Có những chi tiết cụ thể khác, nhưng tôi nghĩ thế là đủ. Thật không may, nếu nó sai, bây giờ bạn phải xây dựng lại.

IMO làm cho một công cụ biên dịch chéo hoạt động có thể rất tẻ nhạt và bực bội, nhưng, giả sử máy chủ không phải là một yếu tố quan trọng (không nên), trong trường hợp này có thể được thực hiện. Crosstool-ng sử dụng bộ cấu hình TLI, vì vậy nếu cuối cùng bạn phải thử nhiều bản dựng, hãy viết ra các lựa chọn của bạn mỗi lần để bạn biết cái gì hiệu quả.

1 Tôi tin rằng armv7 là một vòm phổ biến hơn nhiều (rất nhiều điện thoại và như vậy), vì vậy nếu bạn chỉ sử dụng thứ gì đó mà bạn tin là một trình biên dịch chéo ARM chung, thì đó có lẽ là vấn đề. Những con số này gây nhầm lẫn, ví dụ, bộ xử lý của pi là ARM11 , nhưng (theo trang đó), bộ xử lý ARM11 sử dụng kiến ​​trúc ARMv6 - tức là ARM11 là một triển khai của ARMv6.


1

đầu tiên biên dịch chương trình của bạn với --statictùy chọn, sau đó kiểm tra nó. Nếu nó hoạt động như tĩnh thì trên mâm xôi pi

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

sau đó kiểm tra tất cả các lib nếu chúng ở đó

Tôi đã giải quyết như thế này. Tôi có /lib/ld-linux-armhf-so.3nhưng /lib/ld-linux.so.3 sau đó làm cho một ln -sgiữa sau đó làm việc cho tôi


1

Làm thế nào để xác định vấn đề?

file cross_compiled_executable

Chứa một cái gì đó như:

interpreter /lib/ld-uClibc.so.0

và vấn đề là tập tin đó không tồn tại trên mục tiêu.

Làm thế nào để giải quyết vấn đề?

Sử dụng một trình biên dịch thích hợp, hoặc:

  • người tạo ra hình ảnh đĩa phải cung cấp cho bạn trình biên dịch chéo hoặc cho bạn biết chính xác cách xây dựng nó, ví dụ như với crosstool-ng . Làm thế nào để có được nó cho RPI đã được hỏi ở đây .
  • biên dịch hình ảnh của riêng bạn và trình biên dịch chéo, ví dụ như với Buildroot . Dưới đây là một ví dụ QEMU chung . Buildroot có hỗ trợ RPI .
  • sử dụng một trình biên dịch riêng trên mục tiêu. Nhưng nhìn chung các mục tiêu chậm hơn nhiều so với máy chủ của bạn và không gian bị hạn chế, vì vậy bạn có thể không muốn làm điều này.

    Bạn cũng có thể sử dụng trình giả lập chức năng như QEMU để xây dựng và sau đó chỉ chạy các chương trình trên nền tảng chậm hơn, ví dụ gem5 hoặc bảng chậm.

Chỉ cần hack interpreterlà không đủ, đáng chú ý là bạn phải đảm bảo khả năng tương thích nhị phân giữa chương trình và libc đích, hoặc giao diện chương trình và kernel (tòa nhà /proc, v.v.) nếu bạn cố gắng sử dụng -static(kernel đích có thể quá cũ và không chứa các giao diện cần thiết). Giải pháp mạnh mẽ duy nhất là sử dụng chuỗi công cụ chính xác.


0

Các thư viện trên hệ thống đích khác với các thư viện của hệ thống máy chủ mà tệp thực thi của bạn được biên dịch bật / tắt.

Bạn nên bao gồm tùy chọn --static trong CFLAGS và LDGLAGS nếu bạn đang sử dụng make. Nếu bạn đang sử dụng gcc thẳng, hãy sử dụng tùy chọn --static theo cách này có thể thực thi được.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.