Есть ли недостаток в использовании -Bsymbolic-функций? - PullRequest
22 голосов
/ 27 августа 2011

Я недавно обнаружил параметр компоновщика "-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 не будут объединены, я думаю).

Спасибо!

Ответы [ 4 ]

22 голосов
/ 04 сентября 2011

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

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

Да, есть опция --dynamic-list, которая делает именно это

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

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

0 голосов
/ 09 января 2019

Ну, вы могли бы сказать, что это «усиленная» опция, поскольку она гарантирует, что ваши вызовы в библиотечных функциях обязательно окажутся там. Но я обнаружил одну проблему - наборы тестов для проектов.

Например, тестовый пакет libvirt хотел бы вызвать только что созданный libvirt0.so, а также посмеяться над некоторыми вызовами, которые будут сделаны оттуда.

Из-за того, что -Bsymbolic-functions используется в сборке, которая нарушает тест как исходный, а не вызывается проверенная функция.

Пример следов Хороший случай:

#0  virHostCPUGetThreadsPerSubcore (arch=VIR_ARCH_PPC64) at ../../../tests/virhostcpumock.c:30
#1  0x00007ffff7c1e4c4 in virHostCPUGetInfoPopulateLinux (cpuinfo=<optimized out>, arch=VIR_ARCH_PPC64, cpus=0x7fffffffdf38, mhz=<optimized out>, nodes=0x7fffffffdf40, sockets=0x7fffffffdf44, cores=0x7fffffffdf48, threads=0x7fffffffdf4c)
    at ../../../src/util/virhostcpu.c:661                                           
#2  0x0000555555557e6f in linuxTestCompareFiles (outputfile=0x55555558f150 "/build/libvirt-OUKR8i/libvirt-4.10.0/tests/virhostcpudata/linux-ppc64-subcores2.expected", arch=VIR_ARCH_PPC64,·
    cpuinfofile=0x5555555a3f10 "/build/libvirt-OUKR8i/libvirt-4.10.0/tests/virhostcpudata/linux-ppc64-subcores2.cpuinfo") at ../../../tests/virhostcputest.c:44
#3  linuxTestHostCPU (opaque=<optimized out>) at ../../../tests/virhostcputest.c:189
#4  0x000055555555914d in virTestRun (title=0x55555555c0a1 "subcores2", body=0x555555557cc0 <linuxTestHostCPU>, data=0x7fffffffe0c0) at ../../../tests/testutils.c:176
#5  0x000055555555781a in mymain () at ../../../tests/virhostcputest.c:263          
#6  0x0000555555559df4 in virTestMain (argc=1, argv=0x7fffffffe2c8, func=0x5555555577b0 <mymain>) at ../../../tests/testutils.c:1114
#7  0x00007ffff79bb09b in __libc_start_main (main=0x5555555576a0 <main>, argc=1, argv=0x7fffffffe2c8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe2b8) at ../csu/libc-start.c:308
#8  0x00005555555576ea in _start () at ../../../tests/virhostcputest.c:278 

Плохой случай:

#0  virHostCPUGetThreadsPerSubcore (arch=arch@entry=VIR_ARCH_PPC64) at ../../../src/util/virhostcpu.c:1119
#1  0x00007ffff7c27e04 in virHostCPUGetInfoPopulateLinux (cpuinfo=<optimized out>, arch=VIR_ARCH_PPC64, cpus=0x7fffffffdea8, mhz=<optimized out>, nodes=0x7fffffffdeb0, sockets=0x7fffffffdeb4, cores=0x7fffffffdeb8, threads=0x7fffffffdebc)
    at ../../../src/util/virhostcpu.c:661                                           
#2  0x0000555555557e6f in linuxTestCompareFiles (outputfile=0x5555555a5c30 "/build/libvirt-4biJ7f/libvirt-4.10.0/tests/virhostcpudata/linux-ppc64-subcores2.expected", arch=VIR_ARCH_PPC64,·
    cpuinfofile=0x55555558fd20 "/build/libvirt-4biJ7f/libvirt-4.10.0/tests/virhostcpudata/linux-ppc64-subcores2.cpuinfo") at ../../../tests/virhostcputest.c:44
#3  linuxTestHostCPU (opaque=<optimized out>) at ../../../tests/virhostcputest.c:189
#4  0x000055555555914d in virTestRun (title=0x55555555c0a1 "subcores2", body=0x555555557cc0 <linuxTestHostCPU>, data=0x7fffffffe030) at ../../../tests/testutils.c:176
#5  0x000055555555781a in mymain () at ../../../tests/virhostcputest.c:263          
#6  0x0000555555559df4 in virTestMain (argc=1, argv=0x7fffffffe238, func=0x5555555577b0 <mymain>) at ../../../tests/testutils.c:1114
#7  0x00007ffff79b009b in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
#8  0x00005555555576ea in _start () at ../../../tests/virhostcputest.c:278 

Сравните источник для virHostCPUGetThreadsPerSubcore в этих двух, и вы увидите разницу.

Другой случай, который я видел:

Поскольку первоначальный вопрос касался потенциальных недостатков, я подумал, что стоит упомянуть и эту довольно распространенную категорию связанных вопросов.

0 голосов
/ 08 января 2014

сборка 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 ?? ()
0 голосов
/ 22 декабря 2013

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

...