Pregunta

El sistema operativo es MacOS X, específicamente 10.5 (Leopard) en un PowerPC G4, pero tengo el mismo problema en un X86 que se ejecuta 10.6.

Estoy escribiendo una aplicación que carga dinámicamente una DLL. El dll (llamémoslo foo.dylib) es parte de otra aplicación, ubicada en otra parte del disco duro; mi aplicación encuentra foo.dylib Programáticamente (el emplazamiento exacto puede cambiar, posiblemente el usuario designa la ruta DLL a través de una GUI desde la aplicación en ejecución). Por ejemplo, suponga que mi aplicación se encuentra en el directorio /Application/MyApp.app/Contents/MacOS, y foo.dylib pasa a estar en /Application/OtherApp.app/Contents/MacOS. Usos de carga de DLL dlopen().

Ahora resulta que foo.dylib en sí mismo necesita un montón de otros DLL, que están en el mismo directorio, pero sobre el cual no sé nada de antemano. Cada uno de esos dll extra está registrado en foo.dylib con un camino como @executable_path/bar.dylib. La semántica de @executable_path son que debe ser reemplazado por el directorio en el que se encontró el ejecutable del proceso actual. Esto funciona muy bien para OtherApp, no para mí: cuando abro foo.dylib, trata de cargar bar.dylib, y lo busca en /Application/MyApp.app/Contents/MacOS/bar.dylib, que no es el directorio correcto.

Una solución es establecer el DYLD_FALLBACK_LIBRARY_PATH entorno variable a /Application/OtherApp.app/Contents/MacOS, pero esto debe hacerse antes de Lanzamiento de mi aplicación (esa variable de entorno solo se lee una vez por el enlazador dinámico; cambiando su valor programáticamente con setenv() o putenv() no tiene efecto). Esto no es compatible con el descubrimiento dinámico de la ubicación del foo.dylib expediente.

¿Existe una forma programática de anular el efecto de @executable_path ?

¿Fue útil?

Solución

De leer el fuente de dyld (Buscar @Executable_Path), diría que la respuesta es inequívocamente "no". @Executable_Path se reemplaza con la ruta ejecutable principal, que se almacena como una cadena global en el módulo DYLD.

Y sí, su sospecha es correcta, Dyld lee y guarda sus variables de entorno en el inicio, por lo que no puede cambiarlas en la marcha (puede buscar el mismo archivo fuente que vinculé para Dyld_Library_Path). Puede tener una aplicación Stub que establezca las variables de entorno y luego inicie su aplicación real. Dyld no le ofrece muchas soluciones aquí, no está realmente diseñado para permitirle vincular en bibliotecas privadas de terceros arbitrarias.

Otros consejos

Si mantiene OTROPAP, puede usar @Loader_Path en lugar de @Executable_Path para localizar dependencias: @loader_path siempre resuelve en la ruta del módulo (es decir, biblioteca o ejecutable) que requiere cargar la biblioteca, por lo que siempre se encuentran dependencias recursivas.

Esto está disponible en Mac OS 10.5 en adelante.
Consulte "Man Dyld" para obtener información detallada.

Otra opción sería dlopendependencias antes de la biblioteca principal.

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