Solo para darle un poco de contexto, esto es lo que estoy tratando de lograr: Estoy incrustando un const char * en un archivo de objeto compartido para tener una cadena de versión en el archivo .so. Estoy haciendo análisis de datos y esta cadena me permite dejar que los datos sepan qué versión del software lo produjo. Todo esto funciona bienDesplazamiento en el valor del símbolo nm?
El problema que estoy teniendo es cuando trato de leer la cadena de la biblioteca .so directamente. He intentado utilizar
nm libSMPselection.so | grep _version_info
y obtener
000000000003d968 D __SMPselection_version_info
todo esto está bien y como se esperaba (char * se llama _SMPselection_version_info). Sin embargo, ahora esperaba poder abrir el archivo, buscar 0x3d968 y comenzar a leer mi cadena, pero todo lo que obtengo es basura.
Cuando abro el archivo .so y simplemente busco el contenido de la cadena (sé cómo comienza), puedo encontrarlo en la dirección 0x2e0b4. En esta dirección está allí, terminada en cero y como se esperaba. (Estoy usando este método por ahora.)
No soy científico informático. ¿Podría alguien explicarme por qué el valor del símbolo mostrado por nm no es correcto, o de manera diferente, cuál es el valor del símbolo si no es la dirección del símbolo?
(Por cierto que estoy trabajando en un Mac con OS X 10.7)
Esta es una gran idea. Lo estoy intentando en este momento. Solo hay un problema: las bibliotecas que estoy probando tienen una larga cadena de dependencias en otras bibliotecas. Si trato de cargar con dlopen, obtengo errores Symbol-not-found. La cadena de versión que me interesa, por supuesto, no tiene dependencias. ¿Cómo hago que dl ignore las dependencias? – Simon
Lo he comprobado. Esto funciona muy bien si tengo todas las dependencias cargadas, que es uno de mis dos casos de uso. Gracias por la idea – Simon