2012-04-30 54 views
9

Tôi đã biên dịch chéo một số công cụ Linux (và một số mã C của riêng tôi) cho Android và một trong những thách thức mà tôi phải đối mặt là libc của Android có một số thành phần bị thiếu/bị tước Tôi kết thúc vá mã của tôi để làm cho nó hoạt động với libc của Android (ví dụ như một vấn đề như thế này http://credentiality2.blogspot.com/2010/08/compile-ncurses-for-android.html)Liên kết tĩnh tĩnh và liên kết động với glibc

Q1: Làm thế nào để tôi liên kết tĩnh với glibc (và các phụ thuộc khác) trong khi biên dịch chéo với chuỗi công cụ cánh tay (hoặc ndk-build)?

Q2: Bạn có nên liên kết tĩnh với glibc cho các tệp nhị phân cho Android không? Tôi có nên mong đợi bất cứ điều gì để phá vỡ nếu tôi bắt đầu liên kết tĩnh? Có bất kỳ vấn đề hiệu năng/bộ nhớ nào không?

Tôi hiểu hầu hết những ưu và nhược điểm của tĩnh vs liên kết động từ ở đây - C++ application - should I use static or dynamic linking for the libraries?Static linking vs dynamic linking

Vì vậy, tôi muốn biết nếu tôi nên liên kết tĩnh glibc cho Android khi cross-biên dịch mã nhị phân.

Trả lời

5

Đầu tiên là một ghi chú nhỏ trên libc. Các libc Android là libc Bionic (https://github.com/android/platform_bionic/) chứ không phải là libc GNU (glibc). Vì vậy, các libc chứa trong NDK là Bionic, như là libc có sẵn trên các thiết bị Android.

Theo như glibc, bạn có thể xây dựng nó bằng NDK. Tuy nhiên, tên của nó sẽ xung đột với hệ thống libc khi được cài đặt trên thiết bị Android. Lưu ý rằng đây chỉ là khi bạn xây dựng thư viện động. Nếu bạn xây dựng thư viện GNU libc như một thư viện tĩnh, thì toàn bộ vấn đề ở trên được sidestepped, vì bạn không bao giờ cần phải cài đặt một thư viện tĩnh.

Bây giờ để trả lời câu hỏi của bạn:

  1. Q1: Nếu bạn đang xây dựng các glibc sử dụng NDK thì Android.mk sử dụng BUILD_STATIC_LIBRARY biến để xây dựng thư viện tĩnh. Tuy nhiên, nếu bạn không sử dụng NDK, thì có thể bạn sẽ cần phải nhận được rất nhiều đau đầu (không biết bao nhiêu). Tôi không thể cho bạn biết thêm về điều này vì tôi đã không cố gắng xây dựng glibc, hoặc là tĩnh hoặc động. Ngoài ra, có vẻ như liên kết tĩnh với glibc là rất khuyến khích, ít nhất là đối với các nền tảng không di động.

  2. Từ quan điểm vỡ, không có sự khác biệt giữa liên kết tĩnh và động. Từ quan điểm khởi động, một tệp thực thi tĩnh khởi động nhanh hơn vì không cần bước tải thư viện động. Không có bộ nhớ hoặc tốc độ thực thi hình phạt trong các tệp thi hành tĩnh hoặc động được liên kết. Yêu cầu lưu trữ đĩa lớn hơn cho các tệp thi hành tĩnh.

Về vấn đề thiếu chức năng thiếu hụt bionic, bạn có thể sử dụng phương pháp được sử dụng bởi phần mềm GNU, cung cấp chức năng của chính bạn trong trường hợp thư viện hệ thống bị thiếu. Tôi đã biên soạn file-5.11, GNU tạo ra 3.82, diffutils-2.8 cho Android truyền các công cụ NDK/includes/libs tới các autotools (./configure ...). Dường như các chương trình này chứa các cài đặt của hầu hết các chức năng thư viện không phải lõi, trong trường hợp các thư viện chuẩn không cung cấp cho chúng (trong trường hợp này là Bionic).

Lưu ý: Tôi sẽ thử và xây dựng một glibc tĩnh và cập nhật câu trả lời và khi tôi thành công/thất bại.

+1

Nó không chỉ sử dụng trên đĩa - cũng sử dụng trong bộ nhớ được tăng lên. Khi bạn liên kết và các thư viện jni của ứng dụng Android chống lại Bionic libc, bạn thừa hưởng quyền truy cập chỉ đọc được chia sẻ vào một bản sao đã có trong bộ nhớ. –

+0

Bạn có thể chỉ cho tôi nguồn thông tin về điều này không? Tôi muốn biết nhiều hơn, nhưng không thể tìm thấy bất cứ điều gì về điều này. Tôi biết rằng nếu các thư viện chứa bất kỳ dữ liệu nào, dữ liệu có vẻ không được chia sẻ giữa các tiến trình, tuy nhiên đó có thể chỉ là một trường hợp sao chép trên bản ghi của các trang bộ nhớ nếu mã thư viện thay đổi các biến dữ liệu nội bộ của nó. – Samveen

+0

Tôi tin rằng ChrisStratton đề cập đến - trường hợp cho libc được liên kết tĩnh. Mỗi quá trình sẽ kết thúc với toàn bộ bản sao của TẤT CẢ các phần của cùng một thư viện. Với liên kết động, bạn chính xác @Samveen – Tuxdude

2

Nếu bạn định sử dụng glibc thay cho bionic, có thể đáng xem xét sử dụng chuỗi công cụ của bản phân phối arm-linux (tương thích thế hệ hạt nhân) thay vì ndk.Điều này đặc biệt đúng nếu bạn đang tạo một dòng lệnh thực thi. (Mọi người đã thử nghiệm môi trường debian chroot trên các thiết bị Android trên tất cả các con đường trở về G1)

Đối với một phụ jni (vẫn là phương tiện chính thức được xác nhận cho mã ứng dụng gốc), nó có thể có một chút "thú vị" với một trong hai toolchain, vì bạn sẽ chạy trong một tiến trình đã được ánh xạ và đang sử dụng liên tục libc bionic để hỗ trợ VM Dalvik. Có lẽ nếu bạn liên kết tĩnh các phụ thuộc của thư viện, bạn sẽ không gặp phải xung đột tên, nhưng tôi mong đợi bất cứ con đường nào bạn chọn sẽ là trải nghiệm học tập về các hoạt động bên trong - không phải đó là điều xấu.

Bạn có cần phải ncurses không? Tôi đã xây dựng thành công lời nguyền cho android với ndk một lần. Bạn cũng nên cân nhắc xem chương trình có tận dụng triệt để điều đó (nghĩa là bạn đang thực sự định dạng văn bản quan trọng không?), Hoặc chỉ sử dụng nó cho một số điều nhỏ vì nó được giả định là có sẵn trên các hệ thống đích?

+0

Bạn có thể muốn đến và trả lời câu hỏi này: http://stackoverflow.com/questions/10798357/want-to-compile-native-android-binary-i-can- chạy trong thiết bị đầu cuối-trên-điện thoại –

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