2011-11-07 49 views
8

Tôi có một dự án sản xuất một thư viện được chia sẻ được liên kết với một thư viện khác, cũng được chia sẻ, thư viện.Các thay đổi được giới thiệu trong gcc 4.5 liên quan đến việc liên kết?

Khi tôi biên dịch và liên kết nó với gcc 4.4, mọi thứ hoạt động:

  1. không cần báo trước thời gian biên dịch hoặc sai sót,
  2. không có thời gian liên kết cảnh báo hoặc lỗi và
  3. ldd libmyproject.so báo cáo một cách chính xác phụ thuộc với thư viện được chia sẻ khác.

Khi tôi biên dịch và liên kết nó với gcc 4.5, mặt khác (với những lá cờ chính xác giống nhau), tôi có các triệu chứng sau đây:

  1. không cần báo trước thời gian biên dịch hoặc sai sót,
  2. không có cảnh báo hoặc lỗi thời gian liên kết nhưng
  3. thư viện không được liên kết chính xác với lib được chia sẻ khác: bản kê này tự chạy khi bạn chạy ldd và không thấy kết nối. nó hoạt động với gcc 4.4, sự cố es tại thời gian chạy với gcc 4.5 với lỗi "không tìm thấy biểu tượng" (tất nhiên là từ lib khác).

Tôi nhìn vào số release notes và trực giác của tôi là nó có liên quan đến tối ưu hóa thời gian liên kết mới, nhưng tôi không thể hiểu chúng đầy đủ chi tiết.

Có ai gặp phải tình huống tương tự và/hoặc có lời khuyên nào để cung cấp không?

(Lưu ý rằng kết quả với 4,6 có ngoại hình giống với 4.5).

+0

Cờ liên kết của bạn là gì? Bạn có thể tái tạo các vấn đề với một chương trình tối thiểu (main.c, lib1.c, lib2.c, một chức năng một dòng trong mỗi)? –

+0

Thật không may cho tôi, tôi không thể tái tạo nó với một chương trình tối thiểu. Không có cờ liên kết ngoại trừ các -L và -l mong đợi cần thiết để tìm thư viện khác. Tôi cũng nên lưu ý rằng tôi đã không viết thư viện khác và không biết làm thế nào nó được biên dịch (nhưng tôi có thể thấy tất cả các ký hiệu như mong đợi bằng cách sử dụng 'nm'). – Philippe

+0

Âm thanh như một lỗi gcc với tôi ... – lvella

Trả lời

2

Bạn có thể gỡ lỗi ứng dụng được liên kết động của bạn với biến môi trường LD_DEBUG. Đây là tùy chọn ld-linux.so.2; ldd là một kịch bản để thiết lập tùy chọn như vậy quá. Tất cả các tùy chọn được mô tả tại trang http://linux.die.net/man/8/ld-linux người đàn ông.

Làm thế nào để sử dụng LD_DEBUG (trong bash; cách dễ nhất):

$ LD_DEBUG=all ./your_program 

này sẽ bật gỡ lỗi của ld-linux.so.2 - thời gian chạy mối liên kết động. Nó sẽ in rất nhiều gỡ lỗi để stdout hoặc stderr và bạn sẽ có thể

  • 1) so sánh đầu ra của "LD_DEBUG=all ./your_program_4.4" và "LD_DEBUG=all ./your_program_4.5"
  • 2) nhìn thấy những biểu tượng cuối cùng cố gắng để được giải quyết và xác định vị trí biểu tượng lỗi.

Ngoài ra, bạn nên cung cấp cho chúng tôi biết thêm thông tin:

  • 0) OS của bạn và loại cpu là gì? (cho chúng tôi thấy kết quả của uname -a) Phiên bản libc là gì? (chạy trong bash for a in /lib*/libc.so.*;do echo $a; $a; done)
  • 1) Đang biên soạn cờ của chính thư viện của bạn là gì?
  • 2) Lỗi chính xác khi bạn cố gắng chạy ứng dụng là gì?
  • 3) dòng cuối từ đầu ra của LD_DEBUG thể chứa thông tin có giá trị

UPDATE: câu trả lời tốt và chính xác là ở đây: GCC 4.5 vs 4.4 linking with dependencies (bởi Mat)

1

Đảm bảo bạn chỉ định thư viện được chia sẻ sau tệp đối tượng (hoặc nguồn) của bạn trên dòng lệnh liên kết.

Đây là cách bạn phải làm điều đó với các thư viện tĩnh trở lại trong những ngày cũ. Nó dường như có lợi một lần nữa với các phiên bản gần đây của GCC. Theo như tôi có thể biết, nếu nó quét một thư viện chia sẻ không cung cấp bất kỳ ký hiệu hữu ích nào, nó bỏ qua toàn bộ thư viện, tối ưu hóa số lượng thư viện được chia sẻ trong thời gian chạy, nhưng yêu cầu các tùy chọn -libname xuất hiện sau các tệp đối tượng.

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