2012-08-13 24 views
5

Tôi hiện đang làm việc để cập nhật hệ thống xây dựng cho một đống mã lớn, bao gồm dự án Linux C++. Sẽ tốt hơn nếu tất cả các nhà phát triển ở đây có thể chạy xây dựng khi hack xung quanh với ý tưởng của riêng họ, vì vậy tôi đã kiểm tra xem liệu có thể xây dựng hệ thống này trên các hệ thống Linux hiện đại mơ hồ hay không mặc dù hệ thống đích là 2.6.18.GCC/G ++: xây dựng mà không có ký hiệu đối tượng GNU duy nhất cho hạt nhân Linux cũ hơn

Bởi 'mơ hồ hiện đại' Tôi ước tính một cái gì đó giống như GCC 4.5+, một cái gì đó mà một phân phối trong năm qua hoặc hai có thể đi kèm với. Hiện tại, tôi giải quyết vấn đề libstdC++ bằng cách biên dịch tĩnh và bất kỳ vấn đề glibc nào được xử lý gọn gàng bằng cách remapping lên các phiên bản cũ của các ký hiệu memcpy (và vân vân) với một đoạn mã bao bọc nhanh. Càng xa càng tốt. Một vấn đề tôi dường như không thể hiểu được là một số biểu tượng được xây dựng trong tệp thực thi từ các tệp .o thuộc loại 'u', là một đối tượng duy nhất của GNU, một phần mở rộng của tiêu chuẩn ELF mà 2.6.18 dường như không nhận ra. Điều này có nghĩa là tệp thực thi sẽ không chạy vì nó không thể tìm thấy các ký hiệu, mặc dù chúng có trong thực tế (chỉ có kiểu '?' Trên mục tiêu, từ 'nm').

Người ta có thể vô hiệu hóa việc sử dụng các đối tượng độc đáo của GNU khi biên soạn G ++ nhưng nó không chính xác là giải pháp tiện lợi nhất. Tôi không thể thấy bất kỳ cách nào để vô hiệu hóa nó khi biên dịch mã (distro gcc/g ++ lúc nào cũng có tùy chọn này), và tôi tưởng tượng cách duy nhất để hệ thống đích nhận ra nó là cập nhật ld-linux và kernel . Điều đó gần như chắc chắn sẽ không xảy ra.

Có tùy chọn nào mà tôi không tìm thấy để vô hiệu hóa các loại biểu tượng này không? Hoặc có lẽ là có một số cách gọn gàng xung quanh này, hoặc một cái gì đó mà tôi đang mất tích? Tôi bắt đầu nghi ngờ nó sẽ chỉ được biên dịch trên G ++ 4.1.x, điều này có nghĩa là cài đặt hoặc xây dựng Linux cũ từ nguồn.

+0

nếu đây là loại ký hiệu liên kết động, thì sẽ có vấn đề với trình liên kết động chứ không phải hạt nhân. Làm thế nào điều này liên quan đến hạt nhân? – Hibou57

+0

Trong khi tôi chưa thử nó, tôi nghĩ rằng việc thay đổi libld mà không thay đổi hạt nhân sẽ khá khó khăn - nếu nó có thể xảy ra. Vì vậy, nó không liên quan trực tiếp đến hạt nhân, nhưng nhiều hơn thực tế tôi phải biên dịch lại hạt nhân đó hoặc chỉ cần nâng cấp toàn bộ hệ điều hành để có được trình liên kết nhận ra các biểu tượng khác, như tôi đã hiểu. – rhickman

Trả lời

4

Tôi đã cố gắng giải quyết cùng một vấn đề (dẫn tôi tìm câu hỏi này) và sau một loạt các nghiên cứu đã đưa ra kết luận dứt khoát rằng không, bạn không thiếu gì cả, không có cách nào khác ngoài việc biên dịch g ++ của riêng bạn. Xem câu hỏi gần đây này trên mailing list gcc-giúp đỡ:

http://gcc.gnu.org/ml/gcc-help/2013-01/msg00008.html

tôi so nguồn gcc và thấy rằng bạn có thể tăng cao như chứng khoán 4.4, như là biểu tượng độc đáo đã được thêm vào 4.5. Tuy nhiên trên RHEL/CentOS 6, chúng mặc định là 4.4 nhưng đã vá hỗ trợ biểu tượng duy nhất vào nó, vì vậy người ta thường phải cẩn thận với các phiên bản gcc phân phối cụ thể. Đối với tôi đây là một bummer lớn vì nó có nghĩa là những thứ được biên dịch trên RHEL 6 không thể chạy trên RHEL 5, ngay cả với một bản sao của libstdC++ chỉ dành cho gcc 4.4 + RHEL 5.

Đây là thông điệp có biểu tượng độc đáo hỗ trợ được công bố, bằng cách này:

http://www.redhat.com/archives/posix-c++-wg/2009-August/msg00002.html

Nếu bạn tìm kiếm xung quanh, bạn sẽ thấy rằng mọi người đã phàn nàn về nó trên các danh sách khác vì nhiều lý do, nhưng tôi đoán nó là ở đây để ở.

+0

Cảm ơn bạn đã phản hồi. Tôi sẽ chỉ phải phàn nàn về việc nâng cấp hạt nhân Linux :) – rhickman

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