2010-05-07 14 views
5

Tengo un programa en C++ que enlaza en tiempo de ejecución con, digamos, mylib.so. luego, el mismo programa usa dlopen()/dlsym() para cargar una función de myplugin.so, biblioteca dinámica que a su vez tiene dependencias a mylib.so.son tiempos de ejecución que enlazan las bibliotecas globales compartidas entre los complementos cargados con dlopen?

Mi pregunta es: ¿el programa Y la función en el complemento accederá a los mismos globales definidos en mydlib.so en la misma área de memoria reservada para el programa, o se asignarán copias diferentes no relacionadas en su propio espacio de memoria? ? si este último es el comportamiento predeterminado, ¿es posible cambiar eso?

Gracias de antemano =)!

Respuesta

1

Globals en el programa principal que hace el dlopen debe ser visible para el código que se carga dinámicamente. Sin embargo, el mejor consejo que he visto hasta la fecha (especialmente si alguna vez quieres tener un código vagamente portátil) es hacer que las llamadas a funciones pasen a través de la división del enlazador, y no exportar ninguna variable en ninguna dirección. También es mejor si hay una API para que el código cargado registre las partes interesantes de su API con el cargador (por ejemplo, "Aquí es cómo proporciono este SPI para dibujar foobars en un baz") ya que es una forma mucho más sana de hacerlo devoluciones de llamadas en lugar de solo mezclar todo junto.

[EDIT]: La otra razón para hacer esto es que si estás simulando vinculación débil en una plataforma que no lo soporta. Es muy parecido al otro que incluyo, excepto que es el programa principal el que crea el SPI fuera de la API exportada por la biblioteca dinámica en lugar del .so y lo exporta explícitamente al inicio. En realidad, es el segundo mejor, pero uno se conforma con lo que tiene en lugar de desearlo (bueno, a menos que esté preparado para hacer el trabajo escribiendo algún tipo de biblioteca de conexión).

+0

+1 para usar API/SPI limpio – neuro

Cuestiones relacionadas