Pregunta

A partir de la descripción de la documentación, que parecen hacer lo mismo excepto que "no todos los sistemas" de apoyo compartido y "solamente algunos sistemas de" apoyo simbólico (no está claro si estos son el mismo conjunto de sistemas):

  

-shared       Producir un objeto compartido que puede ser vinculada con otros objetos a   formar un ejecutable. No todos los sistemas   apoyar esta opción. para predecible   resultados, también debe especificar el   mismo conjunto de opciones que se utiliza para   generar código (-fPIC, -fPIC, o modelo   subopciones) cuando se especifica este   Opción 1]

     

-symbolic       referencias se unen a los símbolos globales en la construcción de un objeto compartido. Advertir   acerca de las referencias no resueltas   (A no ser anulado por el editor de enlace   -Xlinker opción -z -Xlinker defs).   Sólo unos pocos sistemas son compatibles con 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 que suena como algo que es cierto de cualquier biblioteca. ¿Quiere decir que el objeto compartido resultante puede estar vinculado estáticamente también?

¿Fue útil?

Solución

Resumen: evita -symbolic función de objeto intra-Shared interposición

La vinculación con objetos compartidos permite una característica llamada símbolo de interposición. La idea es que se puede 'Interpose' una nueva definición de un símbolo global para que se le llama 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 se puede interponer su propia versión de malloc mediante la carga de una biblioteca que define ese símbolo antes de cargar libc (la mayoría de los enlazadores de tiempo de ejecución le permiten utilizar LD_PRELOAD a bibliotecas específicas para la carga antes de que el ejecutable).

Por defecto, cualquier función dentro de un objeto compartido que no es estático, es un símbolo global. Debido a eso, cualquier función dentro del objeto compartido se pueden interponer sucesivamente. Considere un escenario en el que 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 tampoco High_level () ni low_level () son funciones estáticas.

Es posible low_level Interpose () de tal manera que High_level () se llama a un low_level () de un objeto compartido diferente.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top