2011-12-22 29 views
9

tôi đã chuẩn bị một mẫu mã C dưới đây để làm cho nó chạy trên hệ điều hành Android bằng cách làm theo các thủ tục này,Làm cách nào để bạn biên dịch các tệp thi hành ELF cho Android?

/*test.c file*/ 
#include <stdio.h> 

int 
main(int argc, char **argv) 
{ 
    printf("Android Test Application.\n"); 
    return 0; 
} 

$ cánh tay-none-linux-gnueabi-gcc -o test test.c Wall

Tôi đã sao chép tệp nhị phân --test-- vào thư mục "/ system/bin" của thiết bị đích.

Khi tôi cố gắng để làm cho chạy nhị phân cross-biên soạn trên hệ thống đích, tôi nhận được lỗi này

$ pwd

/system/bin

$ ./test

bash: ./test: Không có tệp hoặc thư mục nào như vậy

$ ls -al | kiểm tra grep

-rwxr-xr-x 1 0 0 8384 2011-12-22 15:26 kiểm tra

mặc dù các tập tin nhị phân --test-- đã là trong "/ system/bin" thư mục .

cross-trình biên dịch của tôi là

$ cánh tay-none-linux-gnueabi-gcc --version

cánh tay-none-linux-gnueabi-gcc (Sourcery G ++ Lite 2009q1-203) 4.3 .3 Bản quyền (C) 2008 Free Software Foundation, Inc. Đây là phần mềm miễn phí ; xem nguồn để sao chép các điều kiện. Có NO bảo hành; thậm chí không cho SỞ HỮU HOẶC PHÙ HỢP CHO MỘT MỤC ĐÍCH THỤ ĐỘNG MỤC ĐÍCH.

Tại sao tôi gặp phải lỗi này?

bash: ./test: Không có tập tin hoặc thư mục

+1

_could_ là một thiếu/trình tải động được liên kết bị lỗi hoặc một cái gì đó tương tự. Tìm hiểu trình tải là gì với 'readelf'. Hãy thử 'ldd./Test' trên thiết bị. Ngoài ra hãy thử liên kết tĩnh exe để xem nếu ít nhất là hoạt động. – Mat

+0

Đang chạy 'ls -al | grep date' trên điện thoại của tôi mang lại 'lrwxrwxrwx' làm quyền. Có lẽ đó là một vấn đề quyền? –

+1

Tôi làm cách nào để phát hiện trình tải động hiện tại của mình? Tôi có thể sử dụng tiện ích readelf để tìm hiểu điều này không? – albin

Trả lời

16

Vấn đề này đã liên quan đến việc nạp năng động. Khi tôi kiểm tra đầu ra của tệp nhị phân với chính mình, tôi đã thông báo rằng trình biên dịch chéo mà tôi sử dụng có một loại trình nạp động mặc định khác - "/lib/ld-linux.so.3", nhưng Android sử dụng "/ system/bin/mối liên kết"

$ readelf --program-headers test 

Elf file type is EXEC (Executable file) 
Entry point 0x8380 
There are 8 program headers, starting at offset 52 
    Program Headers: 
Type   Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align 
EXIDX   0x0004fc 0x000084fc 0x000084fc 0x00050 0x00050 R 0x4 
PHDR   0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4 
INTERP   0x000134 0x00008134 0x00008134 0x00013 0x00013 R 0x1 
     [Requesting program interpreter: /lib/ld-linux.so.3] 
LOAD   0x000000 0x00008000 0x00008000 0x00550 0x00550 R E 0x8000 
LOAD   0x000550 0x00010550 0x00010550 0x00124 0x00128 RW 0x8000 
DYNAMIC  0x00055c 0x0001055c 0x0001055c 0x000f0 0x000f0 RW 0x4 
NOTE   0x000148 0x00008148 0x00008148 0x00020 0x00020 R 0x4 
GNU_STACK  0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 

để thay đổi bộ nạp động (mối liên kết động), "--dynamic-linker =/path/to/loader" nên được sử dụng cho các mối liên kết.

$ cánh tay-none-linux-gnueabi-gcc -o test.c kiểm tra Wall -Wl, - năng động-linker =/system/bin/linker

+2

Điều này rất hữu ích để biên dịch các tệp nhị phân cho hệ thống tệp khôi phục trong Android nơi không có/system/bin/linker có sẵn và đường dẫn phải được định nghĩa lại. Cảm ơn. –

Các vấn đề liên quan