Есть ли недостаток в использовании-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 для функций, которые являются приятный побочный эффект.
но мне было интересно, есть ли, возможно, более тонкий контроль над этим, например, перезапись
-Bsymbolic
для отдельных определений функций библиотеки.должен ли я знать о каких-либо ловушках использования
-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 ?? ()