2012-02-17 26 views
32

Tôi muốn xây dựng một thế giới chào hỏi tĩnh từ C bằng cách sử dụng arm-linux-gnueabi-gcc như trái ngược với việc sử dụng chuỗi công cụ độc lập NDK hoặc Codesourcery cho vấn đề đó .Cross compiling static C hello world cho Android bằng cách sử dụng arm-linux-gnueabi-gcc

Trong Ubuntu ...

Tôi đã làm như sau:

sudo apt-get install gcc-arm-linux-gnueabi 

Tôi tạo ra một hi.c như thế này:

#include <stdio.h> 

int main(int argc, char** argv) { 
    printf("hello world\n"); 
    return 0; 
} 

tôi đã biên soạn nó như thế này:

arm-linux-gnueabi-gcc -static hi.c -o hi 

Tôi r một nó trên một giả lập như thế này:

adb push hi /data/hi 
adb shell /data/hi 

Nhưng, tôi có được điều này:

[1] Illegal instruction  /data/hi 

bước Những gì tôi đã quên? Dựa trên kinh nghiệm quá khứ này "nên" đã làm việc, nhưng tôi rõ ràng là sai lầm này lên.

+0

Btw .. Làm điều này trên Ubuntu Oneiric Ocelot. Ngoài ra, arm-linux-gnueabi-gcc là một liên kết đến phiên bản 4.6 của gnueabi-gcc. – corbin

+0

Phiên bản Ubuntu của bạn là gì? Phiên bản SDK hoặc chi tiết trình mô phỏng khác là gì? –

Trả lời

3

Nếu tôi làm điều này trên máy Debian (VM trong trường hợp của tôi), tất cả đều có vẻ tốt. Tôi không chắc chắn những gì khi sai khi làm tương tự trên ubuntu. Có thể như Leo đã gợi ý, nhưng tôi không thể xác nhận. Điều này sẽ làm việc cho bạn mặc dù.

http://www.cnx-software.com/2012/01/16/installing-emdebian-arm-cross-toolchain-in-debian/

Có người thêm vào liên kết này, nhưng nó không được sử dụng toolchain tôi đã đề cập trong mô tả. Để nó trong trường hợp ai đó quan tâm.

http://tariqzubairy.wordpress.com/2012/03/09/arm-binaries-static-library-for-android/

1

Theo như tôi biết, bạn không thể chạy các ứng dụng của người dùng trong Android mà không được biên dịch với một số dạng gcc-arm-linux-androideabi.

+0

Điều này đã được thực hiện với cùng một chuỗi công cụ, mã nguồn và những thứ khác. Chỉ cần tìm bước mất tích. – corbin

+1

Sai. Làm việc với armv5tel-redhat-linux-gnueabi-gcc, chẳng hạn. Miễn là bạn biên dịch các tệp nhị phân tĩnh và kiến ​​trúc là đúng, nó hoạt động. – thejh

14

Thử chỉ định kiến ​​trúc/CPU. Có vẻ như trình biên dịch đang tạo mã với phiên bản kiến ​​trúc cao hơn so với trình mô phỏng có thể xử lý.

này có thể làm việc:

arm-linux-gnueabi-gcc -static -march=armv5 hi.c -o hi 
+0

Cảm ơn bạn đã phản hồi. Kết quả ngay lập tức (sẽ khai thác nhiều hơn), nhận được cảnh báo: CPU đích không hỗ trợ các lệnh THUMB [được bật theo mặc định]. Nhưng nó vẫn tạo ra một kết quả. Sau đó, nếu tôi đẩy nó cho thiết bị, tôi sẽ nhận được cùng một hướng dẫn bất hợp pháp. – corbin

+1

Nếu tôi sử dụng -march = armv5te tôi không nhận được cảnh báo, nhưng vẫn nhận được lỗi hướng dẫn bất hợp pháp. Tương tự nếu tôi sử dụng -march = armv5te -mthumb. – corbin

+2

Nó có thể là các thư viện chuẩn cho arm-linux-gnueabi-gcc sử dụng kiến ​​trúc cao hơn so với trình mô phỏng (điều này nghe có vẻ lạ). Chúng tôi đã gặp lỗi tương tự khi biên dịch với CodeSourcery cho một thiết bị có CPU ARMv4. Kiểm duyệt các CodeSourcery libs là tất cả ARMv5. – Leo

-2

Bạn đã kiểm tra các điều khoản của thư mục dữ liệu? Hãy thử sử dụng địa phương để thay thế! Bạn chỉ có thể sử dụng adb shell và sau đó cd vào thư mục nơi thực thi được đẩy và thử. Tôi đoán đây chỉ là vấn đề quyền hạn

+2

Không nên khiếu nại về sự cho phép bị từ chối chứ không phải là hướng dẫn bất hợp pháp? Tôi không nghĩ rằng tôi đã bao giờ nhận được "hướng dẫn bất hợp pháp" trừ khi nó đã thực sự là một số loại vấn đề với nhị phân. – Leo

+0

(Có, câu trả lời này rõ ràng là sai.) –

9

Nó làm việc cho tôi với trình biên dịch CodeBench trên desktop ubuntu. https://sourcery.mentor.com/sgpp/lite/arm/portal/release2029

Chỉ cần tạo một nhị phân tĩnh bằng lệnh này:

cánh tay-none-linux-gnueabi-gcc -o chào hello.c -static

sau đó, đẩy adb hello/dữ liệu

truy cập, adb shell $ ./data/hello Điều này sẽ in Hello World trên thiết bị đầu cuối. Tương tự cũng có thể được thực hiện từ điện thoại.Sử dụng trình mô phỏng đầu cuối hoặc trình bao bash SL4A để thực thi.

+1

Đây phải là câu trả lời được chấp nhận, mặc dù vui lòng giải thích lệnh và thông số của lệnh. –

0

Mã của bạn thực sự hoạt động đối với tôi.

tôi biên soạn nó trên Ubuntu và đẩy nó vào/data/local/tmp

Và sau đó chmod 777 hi

Cuối cùng nó hoạt động tốt.

+0

Tôi đã tìm ra (không chắc chắn nếu điều này vẫn đúng) rằng trình biên dịch chéo mà ubuntu đã được lấy theo mặc định chỉ hỗ trợ phao cứng và thiết bị của tôi là một cũ hơn mà không làm việc với điều đó. – corbin