2011-08-27 15 views
17

thời gian gần đây tôi phát hiện ra các tùy chọn liên kết "-Bsymbolic chức năng" trong GNU ld:Có nhược điểm nào khi sử dụng các chức năng -Bymymbolic?

-Bsymbolic 
    When creating a shared library, bind references to global symbols to the 
    definition within the shared library, if any. Normally, it is possible 
    for a program linked against a shared library to override the definition 
    within the shared library. 

    This option is only meaningful on ELF platforms which support shared libraries. 

-Bsymbolic-functions 
    When creating a shared library, bind references to global function symbols 
    to the definition within the shared library, if any. 

    This option is only meaningful on ELF platforms which support shared libraries. 

này có vẻ là nghịch đảo của các tùy chọn GCC -fvisibility=hidden, trong đó thay vì ngăn chặn việc xuất khẩu của hàm tham chiếu đến khác các đối tượng được chia sẻ, nó ngăn cản các tham chiếu nội bộ thư viện đến hàm đó khỏi bị ràng buộc với một hàm được xuất khẩu của một đối tượng được chia sẻ khác. Tôi đã thông báo rằng -Bsymbolic-functions sẽ ngăn việc tạo các mục nhập PLT cho các chức năng, đó là một hiệu ứng phụ tốt đẹp.

  1. Nhưng tôi đã tự hỏi liệu có lẽ là một điều khiển các tinh chỉnh trên này, như ghi đè -Bsymbolic cho các định nghĩa chức năng riêng biệt của thư viện.

  2. Tôi có nên biết bất kỳ cạm bẫy nào khi sử dụng -Bsymbolic-functions không? Tôi dự định chỉ sử dụng điều đó, bởi vì -Bsymbolic sẽ phá vỡ các ngoại lệ, tôi nghĩ (nó sẽ làm cho nó để tham chiếu đến các đối tượng typeinfo không thống nhất, tôi nghĩ).

Cảm ơn!

+1

Bạn là độ phân giải tuyệt vời, hạnh phúc đến giờ liên kết địa ngục cho tôi. Tôi yêu bạn. –

Trả lời

19

Trả lời câu hỏi của riêng tôi vì tôi chỉ kiếm được một huy hiệu Tumbleweed cho nó ... và tôi phát hiện ra sau đó

Nhưng tôi đã tự hỏi liệu có lẽ là một điều khiển các tinh chỉnh trên này, như ghi đè -Bsymbolic cho các định nghĩa chức năng riêng lẻ của một thư viện.

Vâng, có phải là lựa chọn --dynamic-list mà làm chính xác điều đó

Tôi có nên được nhận thức của bất kỳ cạm bẫy của việc sử dụng -Bsymbolic-functions? Tôi dự định chỉ sử dụng điều đó, bởi vì -Bymymbolic sẽ phá vỡ các ngoại lệ, tôi nghĩ (nó sẽ làm cho nó để tham chiếu đến các đối tượng typeinfo không thống nhất, tôi nghĩ).

Tôi đã xem xét kỹ hơn và dường như không có vấn đề gì. Thư viện libstdC++ dường như đã làm hoặc ít nhất đã xem xét nó và họ chỉ phải thêm --dynamic-list-cpp-new để vẫn có operator new thống nhất (để ngăn chặn các vấn đề với nhiều trình phân bổ/deallocators trộn trong một chương trình nhưng tôi cho rằng các chương trình đó bị hỏng). Ubuntu sử dụng nó hoặc sử dụng nó theo mặc định, và có vẻ như nó gây ra xung đột với một số gói. Nhưng tổng thể nó sẽ làm việc độc đáo tôi mong đợi.

+0

Một điều đáng tiếc là sử dụng '--dynamic-list' và' -Bsymbolic * 'cùng một lúc bị hỏng trong các phiên bản vàng hiện đang được phát hành (nó tốt trong bfd ld), xem https://sourceware.org/bugzilla/ show_bug.cgi?id = 13577 – thakis

+0

Xin lỗi vì gợi ý ngu ngốc (Tôi không có năng lực trong lĩnh vực này): bạn đã thấy [this] (https://software.intel.com/en-us/articles/performance-tools-for-software-developers tác dụng phụ-có thể-gây-nguy hiểm)? (Chúng dường như mô tả nhiều tác dụng phụ hơn, mặc dù có thể liên quan đến dữ liệu tượng trưng, ​​không liên quan đến '-Bymymbolic-functions'.) – Sasha

0

glibc xây dựng có chức năng -Bymymbolic không được khuyến khích. Đây là kết quả tôi nhận được:

Core was generated by `/home/lano1106/dev/packages/glibc/repos/core-i686/src/glibc-build/elf/ld-linux                .'. 
Program terminated with signal 11, Segmentation fault. 
#0 0x400a3e90 in _int_free() 
    from /home/lano1106/dev/packages/glibc/repos/core-i686/src/glibc-build/libc.so.6 
(gdb) where 
#0 0x400a3e90 in _int_free() 
    from /home/lano1106/dev/packages/glibc/repos/core-i686/src/glibc-build/libc.so.6 
#1 0x4016b94b in __libc_dlsym() 
    from /home/lano1106/dev/packages/glibc/repos/core-i686/src/glibc-build/libc.so.6 
#2 0x4004c2c7 in __gconv_find_shlib() 
    from /home/lano1106/dev/packages/glibc/repos/core-i686/src/glibc-build/libc.so.6 
#3 0x40042320 in find_derivation() 
    from /home/lano1106/dev/packages/glibc/repos/core-i686/src/glibc-build/libc.so.6 
#4 0x40042889 in __gconv_find_transform() 
    from /home/lano1106/dev/packages/glibc/repos/core-i686/src/glibc-build/libc.so.6 
#5 0x400d6f00 in __wcsmbs_load_conv() 
    from /home/lano1106/dev/packages/glibc/repos/core-i686/src/glibc-build/libc.so.6 
#6 0x400c86f6 in mbrtowc() 
    from /home/lano1106/dev/packages/glibc/repos/core-i686/src/glibc-build/libc.so.6 
#7 0x08048914 in ??() 
#8 0x00000000 in ??()