2009-10-19 10 views
9

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?

Respuesta

6

Resumen: -symbolic impide la función interposición objeto intra-compartida

La vinculación con objetos compartidos permite una característica llamada símbolo de interposición. La idea es que pueda 'interponer' una nueva definición de un símbolo global para que se llame en lugar de la definición 'regular'.

Un ejemplo clásico es malloc(). En el caso más común, malloc() se define dentro de libc. Pero puede interponer su propia versión de malloc cargando una biblioteca que define ese símbolo antes de cargar libc (la mayoría de los enlazadores en tiempo de ejecución le permiten usar LD_PRELOAD para cargar bibliotecas específicas antes del ejecutable).

De forma predeterminada, cualquier función dentro de un objeto compartido que no sea estática es un símbolo global. Por eso, cualquier función dentro del objeto compartido puede ser interpuesta. Considere un escenario donde un objeto compartido tiene la función high_level() y low_level() y high_level() llama a low_level() como parte de su implementación y ni high_level() ni low_level() son funciones estáticas.

Es posible interponer low_level() tal que high_level() está llamando a un low_level() desde un objeto compartido diferente.

Aquí es donde entra -simbólico. Al crear su objeto compartido, el enlazador verá que low_level() se define en el mismo objeto compartido como high_level() y enlaza la llamada de manera que no se puede interponer en . De esta forma, usted sabe que nunca se interpondrá ninguna llamada de una función en su objeto compartido a otra en el mismo objeto compartido.

+0

¿No funcionan las herramientas como valgrind (y quizás gprof?) Por interposición? ¿No funcionarán si hago una compilación simbólica? –

+0

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

+1

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

Cuestiones relacionadas