2013-01-16 35 views
5

Tôi đã biên dịch tĩnh và liên kết một chương trình trong một máy Linux cập nhật và chạy nó trong một Linux khác 9 tuổi. Nó đã cho tôi một lỗi "FATAL: kernel quá cũ" và bỏ thuốc lá. Cụ thể, cái mới là Fedora 18 (gcc 4.7.2, glibc 2.16, kernel 3.7.2) và cái cũ là RHEL4.8 (glibc 2.3.4, kernel 2.6.9). Kể từ khi nó liên kết tĩnh, phiên bản glibc không quan trọng. Tôi đoán vấn đề ở đây là chương trình gọi các cuộc gọi hệ thống không có trong kernel cũ.Chương trình biên dịch cho hạt nhân cũ

Nếu phát triển trên hệ thống cũ không phải là một lựa chọn, làm thế nào tôi có thể xây dựng chương trình trong hệ thống mới và chạy trong cũ hơn (hoặc thậm chí tốt hơn, cả hai)? Tôi đã tìm kiếm một cách để chạy gcc trong một chế độ tương thích, mà chỉ gọi các cuộc gọi hệ thống cũ. Chưa có may mắn.

+2

Nhận phiên bản cũ của glibc và liên kết với nó. Glibc mới sẽ không chạy trên hạt nhân cũ. –

Trả lời

5

Tùy chọn dễ nhất là luôn xây dựng trên hệ thống cũ hơn.

Cách khác, sao chép các tiêu đề glibc và thư viện tĩnh từ hệ thống cũ sang hệ thống mới và liên kết với các tiêu đề đó.

Nếu điều đó không hiệu quả, bạn sẽ phải xây dựng lại glibc với --enable-kernel=2.6.9 hoặc một cái gì đó tương tự.

+0

Cảm ơn. Nếu tôi xây dựng lại glibc với hạt nhân cho phép, tôi có phải xây dựng lại tất cả các thư viện khác, chẳng hạn như libjpeg, với glibc đó không? Nói cách khác, có thể tùy chỉnh glibc của tôi liên kết với libjpeg kho? –

+0

Tôi không tin như vậy. Tôi nghĩ rằng cờ chỉ điều chỉnh việc sử dụng phụ trợ của các cuộc gọi hệ thống, nhưng bạn vẫn đang sử dụng cùng một thư viện C. Bạn có thể thấy rằng thư viện C mới nhất chỉ hỗ trợ hạt nhân sau một số ngày mặc dù, vì vậy bạn có thể cần phải hạ cấp xuống phiên bản cũ hơn để quay trở lại. Tôi sẽ không khuyên bạn nên cài đặt thư viện cũ hơn như bạn thư viện hệ thống. Chỉ cần đặt nó, nơi bạn có thể liên kết với nó để xây dựng của bạn (bạn sẽ cần một số cờ biên dịch tùy chỉnh). – ams

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