por la descripción de la documentación, que parecen hacer lo mismo excepto que "no todos los sistemas" de apoyo compartido y "sólo algunos sistemas de" apoyo simbólico (no está claro si estos son el mismo conjunto de sistemas):¿Cuál es la diferencia entre las banderas GCC -simbólicas y-compartidas?
-shared Produce un objeto compartido que luego se puede vincular con otros objetos al forma un ejecutable. No todos los sistemas admiten esta opción. Para resultados predecibles de , también debe especificar el mismo conjunto de opciones que se usaron para generar código (-fpic, -fPIC o modelo subopciones) cuando especifica esta opción . [1]
-symbolic Enlaza referencias a símbolos globales al compilar un objeto compartido. Advierta sobre cualquier referencia no resuelta (a menos que sea anulada por el editor de enlaces opción -Xlinker -z -Xlinker defs). Solo unos pocos sistemas admiten esta opción .
Sospecho que la diferencia está en el "Producir un objeto compartido que a su vez puede estar vinculado con otros objetos para formar un ejecutable" parte, pero eso suena como algo que es cierto de cualquier biblioteca. ¿Significa que el objeto compartido resultante también se puede vincular estáticamente?
¿No funcionan las herramientas como valgrind (y quizás gprof?) Por interposición? ¿No funcionarán si hago una compilación simbólica? –
Valgrind debe seguir funcionando ya que -simbolic solo evita la interposición del objeto intracompartido y no afecta la interposición de objetos intercompartidos. Dicho eso, lo que realmente importa es si los símbolos que se han vinculado simbólicamente son los símbolos sobre los que Valgrind quiere interponerse. –
En caso de que alguien se tropiece con esto de nuevo: una consecuencia importante de esto es que las variables externas ya no funcionan a través de los límites compartidos de la biblioteca. –