2011-08-27 123 views
17

我最近發現在GNU LD鏈接器選項「-Bsymbolic-功能」:使用-Bsymbolic函數有缺點嗎?

-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. 

這似乎是GCC選項-fvisibility=hidden的倒數,在代替防止引用函數的出口到其他共享對象時,它會阻止對該函數的庫內部引用綁定到不同共享對象的導出函數。我告訴自己-Bsymbolic-functions會阻止爲函數創建PLT條目,這是一個不錯的副作用。

  1. 但我不知道是否有可能在這一個更細粒度的控制,如覆蓋-Bsymbolic爲圖書館的各個功能的定義。

  2. 我應該知道使用-Bsymbolic-functions的任何陷阱?我打算只使用它,因爲-Bsymbolic會打破異常,我認爲(這會使得對typeinfo對象的引用不統一,我認爲)。

謝謝!

+1

你是光榮的,快樂的解決方案,連續幾個小時的連接地獄對我來說。我有點愛你。 –

回答

19

回答我的問題,因爲我只是贏得了Tumbleweed的徽章它...我發現後來

但我不知道是否有可能在這一個更細粒度的控制,如覆蓋-Bsymbolic用於庫的個別函數定義。

是的,有這正是這麼做的

我應該知道使用-Bsymbolic-functions的任何缺陷的選項--dynamic-list?我打算只使用它,因爲-Bsymbolic會打破異常,我認爲(它會使得對typeinfo對象的引用不統一,我認爲)。

我仔細看了看,看起來沒有問題。的的libstdC++庫顯然是做它,或者至少沒有考慮它,他們只需要添加--dynamic-list-cpp-new仍然有operator new統一(以防止多個分配器/ deallocators在一個程序中混合了問題,但我認爲這樣的節目呢打破)。 Ubuntu使用它或默認使用它,它似乎會導致與一些軟件包的衝突。但總體而言,它應該很好地工作,我期望。

+0

一個缺陷是,在當前發佈的黃金版本中(同時在bfd ld中很好),同時使用' - dynamic-list'和'-Bsymbolic *'會出現問題,請參閱https://sourceware.org/bugzilla/ show_bug.cgi?id = 13577 – thakis

+0

對不起,愚蠢的建議(我不能勝任):你看過[this](https://software.intel.com/en-us/articles/performance-tools-for-software-developers -Bsymbolic可任意導致危險副作用的)? (他們似乎描述了更多的副作用,儘管可能與符號數據有關,而不是「-Bsymbolic-functions」。) – Sasha

0

建設的glibc與-Bsymbolic,功能都不是。這是我得到的結果:

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 ??() 
相關問題