2011-06-09 16 views
8

Tengo un ejecutable y una biblioteca dinámica (.so). La biblioteca exporta algunos símbolos y ejecuta llamadas con éxito. Pero quiero hacer posible las funciones ejecutables de la biblioteca. Yo he tratado de hacer en el siguiente ejecutable:cómo llamar a la función en ejecutable desde mi biblioteca?

//test 
extern "C" void print(const char * str) { 
    std::cout << str << std::endl; 
} 

y esto en la biblioteca:

extern "C" void print(const char *); 

pero cuando llamo dlopen en ejecutable (para cargar la biblioteca) que devuelve el error undefined symbol: print. ¿Cómo puedo arreglarlo?

Respuesta

9

En Linux/ELF puede pasar la opción -export-dynamic al vinculador (-rdynamic en el controlador del compilador gcc) para que los símbolos del ejecutable se exporten a los objetos compartidos.

Tendría una implementación ficticia print en su biblioteca, que se vería ensombrecida por la implementación en su ejecutable, ya que el ejecutable generalmente se busca antes que los objetos compartidos para la resolución del símbolo.

Esto tiene la desventaja de que no es muy fino, podrías terminar anulando algún símbolo que no pretendías. La opción de grano fino sería la creación de una lista de símbolos a ser exportados como:

{ 
    print; 
    <other symbols> 
}; 

y pasar esa lista al enlazador, por ejemplo, desde gcc: -Wl,--dynamic-list=<file with list of symbols>

+0

@milo: He agregado una forma más detallada de exportar símbolos desde el ejecutable. – ninjalj

+0

muchas gracias! Creo que será mejor que lean "dso howto" para obtener conocimientos más comprensivos en objetos compartidos. – milo

+0

Algunas palabras para las otras plataformas principales serían agradables. – ManuelSchneid3r

4

Una manera más fácil de lograr esto es hacer que el ejecutable registre una función para su uso posterior por la biblioteca, la biblioteca almacena un puntero a la función y puede llamarla más tarde.

Cuestiones relacionadas