2011-11-18 5 views
10

En Mac OS X, los ejecutables binarios en el formato DYLD contienen "comandos de cargador" que le indican al sistema de carga de la biblioteca cómo manejar los contenidos del archivo. En particular, el comando del cargador instruye al sistema donde se deben buscar las bibliotecas dependientes, etc.¿Cómo puedo instalar un comando de cargador DYLD que no es explícitamente compatible con ld?

Puede ver la lista completa de los comandos del cargador para cualquier binario en su sistema ejecutando "otool -l/path/to/your/aplicación ".

En general, estos comandos del cargador se establecen con la herramienta "ld" durante la fase de enlace de la compilación de un proyecto.

Mi pregunta es, ¿qué debo hacer para agregar comandos de cargador para tipos publicitados que no son compatibles (aparentemente) con ld?

En particular, me gustaría aprovechar el comando de cargador LC_DYLD_ENVIRONMENT, que se puede usar para especificar una cadena en la tabla de comandos del cargador de un binario que debe cargarse y evaluarse como configuraciones de variables de entorno en el contexto de ejecutable.

No veo ningún argumento para ld que facilite esto. Algo así como "-seccrear", pero específicamente para agregar contenido al contenido de los comandos del cargador, es lo que busco.

Sé que esto es posible porque al menos una aplicación estándar en Mac OS X lo usa: Safari. Pero no sé si logran esto mediante algún tipo de masaje post-link del binario, si están usando una versión personalizada de ld que sabe cómo construir y encadenar el comando del cargador personalizado, o si están explotando una característica de purpopse general del comando ld que no he podido descifrar.

Respuesta

14

Parece que puede usar -dyld_env, como ese: "-dyld_env DYLD_FRAMEWORK_PATH = /". Esto no está documentado en la página man, pero se puede encontrar en Opciones.cpp de ld64 y se menciona en el archivo Changelog. Si intentas hacerlo desde Xcode, probablemente tendrás que hacerlo así: "-Xlinker -dyld_env -Xlinker DYLD_FRAMEWORK_PATH = /".

Una cosa a tener en cuenta: si nos fijamos en dyld's dyld.cpp, verá que solo permite variables de entorno que comienzan con DYLD_ y finalizan con _PATH.

+0

¡Genial! Gracias. También recibí comentarios a través de Twitter que se ocuparon de señalar que LC_DYLD_ENVIRONMENT no permite definir variables de entorno arbitrarias, solo aquellas que afectan la carga de DYLD. Entonces, en esa medida, la recomendación de LSEnvironment de Ned a continuación es más adecuada para mis necesidades inmediatas, pero su respuesta es la referencia más adecuada para la esencia de la pregunta. – danielpunkass

8

Si el ejecutable está estructurado como parte de un paquete de aplicaciones de OS X estándar (es decir, un .app que puede ser lanzado por un usuario), de la manera convencional para especificar las variables de entorno específicas de aplicación es a través de su archivo plist con la tecla de LSEnvironment . Ver here para más información.

+0

Gracias, Ned! Esta no es una respuesta canónica para la pregunta planteada, pero de hecho llega al corazón de mi interés actual en la función de comando del cargador DYLD. ¡Utilizaré LSEnvironment para los fines descritos! – danielpunkass

Cuestiones relacionadas