Pregunta

i tiene que crear una biblioteca enlazada dinámicamente en zOS. ¿Cuáles son las opciones que se pasarán al compilador.

Además, la forma de comprobar si una biblioteca en zOS está vinculado dinámicamente [dependiente] en otras bibliotecas. hemos ldd en Linux, lo que muestra esta relación. ¿Tenemos un 'ldd' equivalente en zOS tierra?

¿Fue útil?

Solución

no dicen directamente, pero supongo que quiere decir un C / C ++ DLL. Usted puede hacer bibliotecas compartidas en otros idiomas también (incluso ensamblador), pero los pasos serían diferentes.

En primer lugar, tiene que decidir lo que quiere exportar. Muchos de los ejemplos de IBM utilizan la directiva del compilador ExportAll, pero tenga en cuenta que esto puede conducir a ejecutables muy lento, dependiendo de su estilo de codificación. Si usted no hace ExportAll, tendrá #pragma exportación para nada (código o datos) que desea exportar. No olvide que puede exportar datos (variables), así como funciones ejecutables ... a veces que necesita esta a compartir datos con funciones DLL.

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

Al vincular el archivo DLL, asegúrese de especificar la opción -Wl, DLL (hay un montón de maneras ... esta parte es diferente si se vincula en el lote - Te estoy asumiendo que estamos construyendo en un fichero make de algún tipo). El enlace va a generar el archivo DLL real, así como una "cubierta lateral" que contiene declaraciones de "importación" para todas sus funciones exportadas. Usted necesitará de estos vincular cualquiera de los programas de cliente que usted espera para llamar a la DLL. Por ejemplo, si sus importaciones están en un archivo llamado AAA.x, c89 -wc, DLL myapp.c AAA.x sería compilar el código de llamada, con la conciencia de que las funciones en AAA.x están fuera en algún tipo de DLL.

Para su punto sobre el DLL que llaman otros archivos DLL, no hay que olvidar que una DLL puede tanto "servir" y "consumir" ... funciones mediante la inclusión de la cubierta lateral para funciones en otros archivos DLL, que puede tener un archivo DLL que ofrece algunas funciones mientras que llama otros archivos DLL para acceder a otros.

La propia DLL real puede estar en varios lugares dependiendo de la naturaleza de su aplicación. Si usted es amigable Servicios UNIX, es sólo un ejecutable en LIBPATH. También puede ser STEPLIB, LNKLST, LPA y así sucesivamente.

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

Hay algunas otras cosas básicas a tener en cuenta cuando se vincula, como asegurar que su código es reentrante. La mayoría de estos se detallan en la documentación de IBM, y si se construye con cosas como "C89" (o equivalente), las opciones correctas son por lo general de configuración de forma automática (de hecho, para obtener una buena idea de lo que está pasando, a su vez, en la salida detallada y ver todos los parámetros para usted).

Si usted necesita para construir una referencia cruzada de lo que se llama lo que, el comando UNIX Servicios "nm" le puede dar esa información. Si usted produce listados detallados de edición de enlaces, todos los datos están allí también cuando está la construcción de las bibliotecas DLL.

Buena suerte!

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