2010-12-09 24 views
5

tengo que crear una biblioteca enlazada dinámicamente en zOS. ¿Cuáles son las opciones para pasar al compilador?Vinculación dinámica en zOS

Además, cómo comprobar si una biblioteca en zOS está vinculada dinámicamente [dependiente] a otras bibliotecas. tenemos ldd en linux, que muestra este enlace. ¿Tenemos un equivalente 'ldd' en zOS land?

+0

Ha comprobado [Creación y uso de bibliotecas de vínculos dinámicos] (http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01 /dllsim.htm)? – NealB

+0

Sí. Modifiqué los scripts de compilación para crear dinámicamente enlaces a las bibliotecas ... buscando una herramienta para validar los cambios. – user170008

Respuesta

2

No lo dices directamente, pero supongo que te refieres a una DLL C/C++. También puede hacer bibliotecas compartidas en otros idiomas (incluso ensamblador), pero los pasos serían diferentes.

En primer lugar, debe decidir qué desea exportar. Muchos de los ejemplos de IBM usan la directiva EXPORTALL del compilador, pero tenga en cuenta que esto puede conducir a ejecutables muy lentos, dependiendo de su estilo de codificación. Si no hace EXPORTALL, necesitará exportar #pragma para cualquier cosa (código o datos) que desee exportar. No olvide que puede exportar datos (variables) y funciones ejecutables ... a veces lo necesitará para compartir datos con funciones DLL.

A continuación, debe configurar las opciones de compilación en tanto cliente (persona que llama) y DLL para utilizar el enlace DLL ... Esta es la opción de compilación DLL -wc y cuando está activado, genera la lógica extra en su programa para cargar y administrar la DLL. Es una buena idea incluir también #pragma csect para las funciones exportadas si cree que alguna vez tendrá la necesidad de actualizar el archivo DLL sin reemplazarlo por completo.

Cuando vincula su DLL, asegúrese de especificar la opción -WL, DLL (hay muchas formas ... esta parte es diferente si enlaza en lote - Supongo que está creando una marca archivo de algún tipo). El enlace generará la DLL real, así como una "cubierta lateral" que contiene las declaraciones "IMPORTAR" para todas las funciones exportadas. Necesitará estos para vincular cualquiera de los programas del lado del cliente que espera llamar a la DLL. Por ejemplo, si sus importaciones están en un archivo llamado AAA.x, c89 -Wc, DLL myapp.c AAA.x compilará el código de llamada, con conocimiento de que las funciones en AAA.x están desactivadas en algún tipo de DLL.

A su punto acerca de las DLL que llaman a otras DLL, no olvide que una DLL puede tanto "servir" como "consumir" funciones ... al incluir la cubierta lateral para funciones en otras DLL, puede tener una DLL que proporciona algunas funciones al llamar a otras DLL para acceder a otras.

La DLL real en sí misma puede estar en varios lugares dependiendo de la naturaleza de su aplicación. Si es amigable con los Servicios de UNIX, es solo un ejecutable en LIBPATH. También puede ser STEPLIB, LNKLST, LPA, etc.

Si lo necesita, puede acceder a sus DLL explícitamente en tiempo de ejecución utilizando dlopen(), dlsym() y así sucesivamente. En general, esto le permite controlar exactamente qué DLL está utilizando (a veces útil si el usuario puede proporcionar uno), y le da lo que equivale a punteros de función que se resuelven dentro de la DLL.

Hay otras cosas básicas que se deben tener en cuenta al vincular, como garantizar que se reentrase el código. La mayoría de estos están detallados en la documentación de IBM, y si compila con cosas como "c89" (o equivalente), las opciones correctas suelen configurarse automáticamente (de hecho, para tener una buena idea de lo que está sucediendo, activar en la salida detallada y vea todos los parámetros para usted).

Si necesita crear una referencia cruzada de lo que llama a qué, el comando "nm" de Servicios de UNIX puede darle esa información. Si produces listados detallados de edición de enlaces, también estarán allí todos los datos cuando estés construyendo tus archivos DLL.

¡Buena suerte!

Cuestiones relacionadas