linker visibility elf dynamic-library

linker - ¿Hay algún inconveniente en el uso de las funciones simbólicas?



visibility elf (3)

Hay casos con efectos secundarios. Una documentada: https://bugs.launchpad.net/ubuntu/+source/xfe/+bug/644645 También me gustaría averiguar más sobre esto, porque tengo un caso así ahora mismo.

Recientemente descubrí la opción de vinculador "-Bsymbolic-functions" en 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.

Esto parece ser el inverso de la opción GCC -fvisibility=hidden , en el sentido de que, en lugar de impedir la exportación de la función a la que se hace referencia a otros objetos compartidos, evita que las referencias internas de la biblioteca a esa función se vinculen a una función exportada de un Objeto compartido diferente. Me informé a mí mismo que -Bsymbolic-functions evitarán la creación de entradas PLT para las funciones, lo que es un efecto secundario agradable.

  1. Pero me preguntaba si tal vez hay un control más -Bsymbolic sobre esto, como sobrescribir -Bsymbolic para definiciones de funciones individuales de una biblioteca.

  2. ¿Debo estar al tanto de cualquier inconveniente en el uso -Bsymbolic-functions ? Pienso usar solo eso, porque el -Bsymbolic romperá las excepciones, creo (hará que las referencias a los objetos de tipo de información no estén unificadas, creo).

¡Gracias!


Respondiendo a mi propia pregunta porque me gané una insignia de Tumbleweed por eso ... y descubrí posteriormente

Pero me preguntaba si tal vez hay un control más -Bsymbolic sobre esto, como sobrescribir -Bsymbolic para definiciones de funciones individuales de una biblioteca.

Sí, existe la opción --dynamic-list que hace exactamente eso.

¿Debo estar al tanto de cualquier inconveniente en el uso -Bsymbolic-functions ? Pienso usar solo eso, porque el símbolo simbólico romperá las excepciones, creo (hará que las referencias a los objetos de tipo de información no estén unificadas, creo).

Lo busqué más y parece que no hay problema. La biblioteca libstdc ++ aparentemente lo hace o al menos lo consideró y solo tuvieron que agregar --dynamic-list-cpp-new para que el operator new aún --dynamic-list-cpp-new operator new unificado (para evitar problemas con múltiples asignadores / desasignadores que se mezclan en un programa, pero lo haría argumentar que tales programas están rotos de todos modos). Ubuntu lo usa o lo usa por defecto, y parece que causa conflictos con algunos paquetes. Pero en general debería funcionar muy bien, espero.


no se recomienda construir glibc con funciones -bsbolbolicas. Aquí está el resultado que obtuve:

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 ?? ()