2009-08-06 17 views
8

Tôi đang gặp sự cố khi liên kết thư viện được chia sẻ bằng gcc 3.2.3 với binutils 2.18. Khi tôi cố gắng để liên kết các thư viện tôi nhận được lỗi sau:Trợ giúp với trình liên kết không thành công: .gnu.linkonce.t

.gnu.linkonce.t _... tham chiếu trong phần .rodata: quy định tại loại bỏ phần .gnu.linkonce.t ...

tôi đã thực hiện một số tiền hợp lý của googling về điều này và hầu hết các nơi dường như chỉ ra nó là một hồi quy giới thiệu trong binutils 2.17 và sau đó cố định trong 2.18.50, nhưng tôi đã tò mò nếu ai biết nếu có bất kỳ cách giải quyết cụ thể cho vấn đề mà không có để chạm vào binutils và gcc.

Cảm ơn.

Trả lời

6

Điều này hóa ra là một kết quả lạ khi hệ thống không khớp gcc với các binutils khác nhau./usr/bin/gcc đang được sử dụng (3.2.3) và/usr/local/bin/ld đang được sử dụng với nó do/usr/local/bin đang ở trước/usr/bin trong đường dẫn. Khi chúng ta chuyển đổi sao cho/usr/bin ở phía trước đường dẫn, thì/usr/bin/ld thích hợp được gọi (binutils 2.14) và điều này dường như đã giải quyết được vấn đề.

0

Lỗi này đã được tìm thấy và được báo cáo ở đây GCC bugzilla, một testcase nhỏ tập trung vào lỗi được cung cấp trong các nhận xét mà tôi thấy nó thực sự hữu ích không lãng phí thời gian. Lỗi này đã được sửa bắt đầu từ GCC 3.4.6.

Tôi gặp sự cố này khi sử dụng GCC 3.3.1 với binutils 2.15.92binutils 2.17.50 và cả hai đều không hoạt động. Vì vậy, đối với tôi nó rõ ràng không phải là sự pha trộn giữa các phiên bản GCCbinutils gây ra sự cố.

Nếu bạn phải sử dụng phiên bản GCC cũ hơn, bạn có thể sử dụng bản vá này được cung cấp bởi H.J. và thực hiện thủ công rồi xây dựng lại GCC cũ của bạn một lần nữa.

Fix without COMDAT group

Fix with COMDAT group

Kiểm tra tệp đính kèm trong các liên kết được cung cấp cho thấy diff chính xác cho việc sửa chữa.

Tôi đã tự làm và thử nghiệm nó và nó đã hoạt động thành công, vá GCC 3.3.1 với bản sửa lỗi đầu tiên "không có nhóm COMDAT", xây dựng lại và sử dụng nó với binutils 2.15.92binutils 2.17.50.