2014-05-21 16 views
5

Chúng tôi muốn tạo một thư viện được chia sẻ (.so) để nhắm mục tiêu tất cả các bản phân phối, bao gồm cả các bản phân phối cũ. Mã được viết bằng C++ và sử dụng các tính năng C++ 11, vì vậy trình biên dịch phải có ít nhất gcc 4.7. Chúng tôi nhận thấy rằng nếu chúng tôi biên dịch mã của chúng tôi trên máy Linux có cài đặt gcc 4.7.2 (ví dụ: Ubuntu 12.10) thì phiên bản được tạo ra có "phiên bản 1 (GNU/Linux)" trong khi trên hệ điều hành cũ hơn (ví dụ: CentOS 5.6) phiên bản là "phiên bản 1 (SYSV)" - và các thư viện có phiên bản mới hơn của GNU/Linux không thể được sử dụng trên hệ điều hành cũ hơn. Vì vậy, chúng tôi đã thử cách tiếp cận của việc cài đặt gcc 4.7 trên máy CentOS 5.6, biên dịch mã của chúng tôi với trình biên dịch này và liên kết tĩnh với libstdC++ (-static-libstdC++) - điều này tạo ra .so có thể sử dụng được trên mọi linux chúng tôi tìm thấy .Biên soạn một thư viện được chia sẻ trên Linux để nhắm mục tiêu tất cả các bản phân phối

Và điều này làm việc tốt cho 32-bit. Tuy nhiên, khi chúng tôi theo cùng một cách tiếp cận trên một hệ điều hành 64-bit (CentOS) điều này không thành công với lỗi mà libstdC++ hiện có mà chúng tôi đã thử liên kết đến được biên dịch mà không có -fPIC. .

Vì vậy, chúng tôi đã cố gắng để biên dịch gcc 4.7.2 nguồn với tùy chọn “-với-pic”, nhưng chúng tôi không thể liên kết đến các libstdC++ mới a - lỗi là:

/opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: /usr/local/lib/libFoo.so: version node not found for symbol [email protected]_3.4 /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: failed to set dynamic section sizes: Bad value collect2: error: ld returned 1 exit status

Chúng tôi googled lên rằng biên dịch libstdC++ với –fPIC có thể có vấn đề, nhưng tại sao nó làm việc cho 32-bit và không cho hệ điều hành 64-bit? Có cách nào khác được đề xuất để tạo một .so cho tất cả các bản phân phối Linux không?

+0

Làm thế nào sẽ này thậm chí làm việc? – mjs

+0

+1 Câu hỏi được nghiên cứu kỹ lưỡng! Lỗi này có thể không phải do lỗi của bạn: Tôi googled "không thể đặt kích thước phần động: Giá trị không hợp lệ" và tôi chỉ thấy các báo cáo lỗi sắp xuất hiện. Nhân tiện '_ZNSs7_M_copyEPcPKcm' trong thông báo lỗi là' std :: basic_string , std :: allocator > :: _ M_copy (char *, char const *, unsigned long) '. – Ali

Trả lời

-1

Liên kết tĩnh với libc/libstdC++ không nên được thực hiện, ngay cả khi nó hoạt động! Nó là khá nguy hiểm, bởi vì rất nhiều khía cạnh bảo mật yêu cầu cập nhật cho libc. Nếu liên kết tĩnh không cập nhật có thể lấp đầy lỗ.

Tôi không thể tin rằng một libc 'chung' tồn tại hoạt động trên tất cả các nền tảng Linux. Libc là giao diện cho hệ thống được cài đặt, đó là một sự khác biệt lớn. Làm thế nào một lib phải phù hợp với tất cả?

Trong khi liên kết bạn có thể thử

-static-libstdc++ -static-libgcc 

như các tùy chọn để ld. Có lẽ điều này sẽ giúp. Nhưng tôi sẽ không bao giờ làm thế!

+0

-1 Anh ta không cố gắng liên kết libc tĩnh. Vui lòng đọc lại câu hỏi. – Ali

+0

Xin cảm ơn! Ông đã cố gắng xây dựng một thư viện chạy trên nhiều nền tảng. Do đó tôi tin rằng libstdC++ yêu cầu libgcc. Xin lỗi cho một gợi ý cho rằng :-) – Klaus

+0

Thậm chí nếu bạn liên kết libstdC++ tĩnh, tôi không nghĩ rằng nó là cần thiết để liên kết libc tĩnh. Câu trả lời của bạn không trả lời các câu hỏi của mình: "tại sao nó hoạt động cho 32-bit và không phải cho hệ điều hành 64-bit? Có cách nào khác được đề xuất để tạo một .so cho tất cả các bản phân phối Linux không?" Vì vậy tôi không thể rút lại lời xin lỗi của tôi, xin lỗi. – Ali

2

Tôi trả lời này tại https://gcc.gnu.org/ml/libstdc++/2014-05/msg00107.html

This looks like https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54482 so might be fixed in GCC 4.7.3 (but I'm not sure)

...

PIC is implemented differently for x86 and x86_64, because 64-bit mode has built-in support for it.

+1

Tôi đã gặp vấn đề tương tự và tôi có thể xác nhận rằng việc nâng cấp lên 4.7.3 (từ 4.6.3) đã khắc phục được sự cố cho tôi. Câu hỏi liên quan: http://stackoverflow.com/questions/28593592/how-to-link-with-libstdc-pic-a-with-gcc/28625188#28625188 – Edward

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