2011-08-27 11 views
17

Recientemente he descubierto la opción del vinculador "-Bsymbolic-funciones" en GNU ld:¿Hay alguna desventaja en el uso de las funciones -Bsymbolic-?

-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. 

Ésta parece ser la inversa de la opción GCC -fvisibility=hidden, en la que en lugar de prevenir la exportación de la función hace referencia a otra 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é que -Bsymbolic-functions impedirá la creación de entradas PLT para las funciones, lo cual es un buen efecto secundario.

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

  2. ¿Debo ser consciente de las trampas de usar -Bsymbolic-functions? Planeo solo usar eso, porque el -Bsymbolic romperá las excepciones, creo (lo hará para que las referencias a los objetos typeinfo no estén unificadas, creo).

Gracias!

+1

Usted fue la gloriosa y feliz resolución de horas de linker infierno para mí. Te amo un poco –

Respuesta

19

responder a mi propia pregunta, ya que acabo de ganar una insignia Tumbleweed por ello ... y descubrí posteriormente

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

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

Debería ser consciente de los peligros de usar -Bsymbolic-functions? Planeo usar solo eso, porque -Bsymbolic romperá excepciones, creo (hará que las referencias a los objetos typeinfo no estén unificadas, creo).

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

+0

Una de las dificultades es que el uso de '--dynamic-list' y' -Bsymbolic * 'al mismo tiempo se rompe en las versiones actuales de oro (está bien en bfd ld), consulte https://sourceware.org/bugzilla/ show_bug.cgi?id = 13577 – thakis

+0

Disculpa por una sugerencia estúpida (no soy competente en esto): viste [esto] (https://software.intel.com/en-us/articles/performance-tools-for-software-developers -bs-symbol-can-cause-dangerous-side-effects)? (Parecen describir más efectos secundarios, aunque tal vez relacionados con datos simbólicos, no con '-Bsymbolic-functions'.) – Sasha

0

No se recomienda construir glibc con -Bsymbolic-functions tampoco. 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 ??() 
Cuestiones relacionadas