2011-08-27 4 views
17

나는 최근에 GNU ld에서 링커 옵션 "-Bsymbolic-functions"을 발견했다 :-Bymbolic-functions을 사용할 때 단점이 있습니까?

-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

난 그냥 그것을 위해 다니지 배지를 받았습니다 ... 그리고 이후

을 발견하기 때문에 내 자신의 질문에 대답하지만 -Bsymbolic을 덮어처럼,이를 통해 세분화 된 제어 아마도이 있는지 궁금 해서요 라이브러리의 개별 함수 정의

예,

내가 -Bsymbolic-functions를 사용하여 어떤 함정을 알고 있어야 정확히 수행하는 옵션 --dynamic-list 있습니까? -Bsymbolic은 예외를 벗어날 것이기 때문에 단지 그것을 사용하려고합니다. (생각하면 typeinfo 객체에 대한 참조가 통일되지 않을 것입니다.)

더 자세히 살펴보면 아무 문제가없는 것 같습니다. libstdC++ 라이브러리는 분명히 그것을 수행하거나 최소한 고려했을 뿐이며 operator new을 통합하기 위해 --dynamic-list-cpp-new을 추가해야했습니다 (프로그램에서 여러 할당 자/할당 취소자가 문제를 일으키지 않도록 방지하지만 어쨌든 이러한 프로그램이 손상되었다고 주장합니다). 우분투는 그것을 사용하거나 기본적으로 그것을 사용하고, 그것은 일부 패키지와 충돌을 일으키는 것 같습니다. 그러나 전반적으로 그것은 잘 작동해야합니다.

+0

하나의 함정은 동시에 --dynamic-list와 -Bsymbolic *을 사용하는 것이 현재 출시 된 골드 버전에서 깨진 것입니다 (bfd ld에서 잘됩니다). https://sourceware.org/bugzilla/를보십시오. show_bug.cgi?id = 13577 – thakis

+0

어리석은 제안을 드려 죄송합니다. (유능한 내용이 아닙니다.) [이]를 보았습니까? (https://software.intel.com/en-us/articles/performance-tools-for-software-developers) -bsymbolic-can-cause-dangerous-side-effects)? (심볼릭 데이터와 관련이있을지라도 더 많은 부작용이있는 것으로 보입니다. '-Bsymbolic-functions'이 아닙니다.) – Sasha

0

glibc와 -Bsymbolic-functions을 함께 사용하는 것은 권장하지 않습니다. 여기에 내가 얻은 결과가 있습니다 :

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 ??() 
관련 문제