2012-06-26 29 views
6
$ printf 'int main(){}' | gcc -static -x c - -o hello 
$ scp hello vi-server.org:./ 
hello        100% 565KB 565.2KB/s 00:00 
$ ssh -t vi-server.org "./hello; uname -r" 
FATAL: kernel too old 
sh: line 1: 15378 Segmentation fault  ./hello 
2.6.18-274.... # can't easily upgrade the kernel 
Connection to vi-server.org closed. 

Làm thế nào để xây dựng nhị phân tĩnh sẽ hoạt động trên các hệ thống cũ? Tôi mong đợi các tệp nhị phân tĩnh hoạt động ngay cả trên 2.4.Làm thế nào để xây dựng một nhị phân tĩnh cho cài đặt GNU/Linux với hạt nhân cũ?

Trả lời

8

Bạn cần định cấu hình glibc để nhắm mục tiêu phiên bản hạt nhân cũ hơn. Mỗi http://www.gnu.org/software/libc/manual/html_node/Configuring-and-compiling.html glibc chấp nhận tùy chọn cấu hình --enable-kernel=version trong đó version có dạng 2.4.20 để nhắm mục tiêu phiên bản hạt nhân cũ hơn.

Sau đó, bạn có thể liên kết chương trình của mình tĩnh với gcc -static -nodefaultlibs [...] /path/to/my/libc.a.

0

Cảm ơn bạn đến ecatmur tấm áp phích trên - nó thực sự làm việc để cấu hình lại/xây dựng lại glibc với các tùy chọn cấu hình enable-kernel = phiên bản

tôi sẽ thêm sau - bạn có thể sử dụng gcc -static -L/path/to/local/lib (tùy chọn L lớn cho thư mục) và nó có vẻ hoạt động cũng như liên kết đến tập tin thư viện. Khi tôi liên kết trong thời trang sau (tới /path/to/local/lib/libc.a), nó tạo ra một tệp thực thi không cần thiết lớn.

+2

Lưu ý: thường có tùy chọn tạo nhị phân "nửa tĩnh". Nó sẽ liên kết đến libc động, nhưng với các thư viện khác tĩnh (bạn có thể chọn các thư viện nào để đưa vào nhị phân và liên kết nào đến). Nó có thể được thực hiện bằng cách chỉnh sửa bằng tay lệnh liên kết. –

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