Есть ли недостаток в использовании-Bsymbolic-функций?

недавно я обнаружил опцию компоновщика "- Bsymbolic-functions " в GNU ld:

-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 не будут унифицированы, я думаю).

спасибо!

3 ответов


отвечая на мой собственный вопрос, потому что я только что заработал значок перекати-поля... и я узнал впоследствии

но мне было интересно, есть ли, возможно, более тонкий контроль над этим, например, перезапись -Bsymbolic для отдельных определений функций библиотеки.

Да, есть вариант --dynamic-list который делает именно это

должен ли я знать о каких-либо ловушках использования -Bsymbolic-functions? Я планирую использовать только потому, что я думаю, что-Bsymbolic нарушит исключения (это сделает так, что ссылки на объекты typeinfo не будут унифицированы, я думаю).

Я посмотрел больше в него, и, похоже, нет никаких проблем. Библиотека libstdc++, по-видимому, делает это или, по крайней мере, рассматривала это, и им нужно было только добавить --dynamic-list-cpp-new до сих пор operator new unified (чтобы предотвратить проблемы с несколькими распределителями / освобождателями, смешивающимися в программе, но я бы сказал, что такие программы все равно сломаны). Ubuntu использует его или используется по умолчанию, и кажется, что это вызывает конфликты с некоторыми пакетами. Но в целом он должен работать хорошо, я ожидаю.


есть случаи с побочными эффектами. Документированная один: https://bugs.launchpad.net/ubuntu / + источник / xfe / + ошибка / 644645 Мне также хотелось бы выяснить больше об этом, потому что у меня есть такой случай сейчас.


построение 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 ?? ()