2 votos

¿Puede "ld" agregar los rpaths automáticamente a un ejecutable si puede encontrar los dylibs necesarios en el momento del enlace?

La pregunta está en el título, pero de todos modos, me explico un poco más:

El más aceptado para la correcta definición de la instalación nombre para un dylib en MacOS es por lo que es relativa a la rpath. Por ejemplo:

otool -L ./LLVM/7.0.0/lib/libomp.dylib 
./LLVM/7.0.0/lib/libomp.dylib:   
   @rpath/libomp.dylib (compatibility version 5.0.0, current version 5.0.0)
   /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2)

Aquí, libomp.dylib ha @rpath/libomp.dylib como instalar nombre. Hasta ahora tan bueno.

El problema es cuando se crea un ejecutable enlazado a un dylib. Incluso si usted pasa la correcta -L/path/to/libomp.dylib indicador en tiempo de vínculo, de modo que ld puede con éxito vincular el ejecutable, a continuación, intente ejecutar, y, obviamente, se obtiene lo siguiente:

dyld: Library not loaded: @rpath/libomp.dylib
  Referenced from: mydumbexecutable
  Reason: image not found
Abort trap: 6

Por supuesto, esto puede ser corregido mediante el uso de install_name_tool sobre el dylib (cambiando su instale el nombre para que no dependen de la rpath, y el enlace con el archivo ejecutable de nuevo, pero esto no es considerado una buena práctica), o bien, la forma recomendada, para uso install_name_tool sobre el ejecutable, añadiendo a ella la correcta rpath de modo que el dylib se puede encontrar.

Pero... solo me pregunto... ¿no hay un indicador en ld que agrega automáticamente el rpath para usted? Quiero decir, si ld es capaz de enlazar el archivo ejecutable, ya que se hizo encontrar el dylibs, ¿por qué no puede almacenar automáticamente la correcta rpath en el ejecutable?

Entiendo que esto debe ser opcional comportamiento, como a veces se prefiere definir el rpaths de ti mismo, pero... una bandera para hacerlo automáticamente iba a hacer mi vida mucho más fácil.

1voto

Jose Chavez Puntos 645

La respuesta a tu pregunta es: no, no.

Su pregunta se parece mucho a un gráfico XY problema, así que lo primero que yo recomendaría ir y volver a examinar si realmente ese es su principal problema, o hay algún nivel mayor problema que en realidad es el problema, que está intentando resolver.

En primer lugar, quiero señalar que usted no tiene que utilizar install_name_tool para establecer estos valores después de los hechos. Puede establecer estos, mientras que la compilación de la biblioteca y el programa. Si usted está usando clang/gcc, puede utilizar el -install_name opción. Similar existe para otros compiladores.

La razón por la que ld no agrega automáticamente rpaths de acuerdo a donde se encontró el dylibs es que esto, en general, producir un binario que se ejecuta en su máquina, y su equipo. I. e. está diseñada para su instalación específica. Esto no es normalmente lo que usted desea. Desea producir un binario que otros pueden tomar y ejecutar en sus equipos.

Si usted está haciendo un "proyecto de norma" (es decir, como de un Xcode plantilla) con bibliotecas compartidas, usted no tiene que jugar con rpaths o instalar nombres. I. e. generalmente, usted tiene las bibliotecas compartidas colocados en ubicaciones estándar que buscar por el enlazador dinámico por la norma, de modo que usted no tendrá que definir nada en especial.

Sin embargo, parece que usted está queriendo crear algo muy personalizado para su uso. Si usted realmente desea especificar que el dylib es en un lugar específico (debido a que usted sólo desea que se ejecute en su propio equipo, o equipos como el tuyo) - usted puede hacerlo simplemente especificar una ruta de acceso absoluta para él.

Si desea crear algo que puede ser copiado fácilmente a otros equipos sin necesidad de separar la instalación de dylibs, que a menudo se quieren unir su dylib con la aplicación en sí. A continuación, puede utilizar una ruta relativa del archivo ejecutable utilizando @executable_path en lugar de @rpath.

En mi opinión @rpath es más útil cuando se tienen varias aplicaciones que están "conectados libremente" que te gustaría compartir una biblioteca que no desea lugar en un sistema estándar de toda la localidad.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X