在zOS中的动态链接

问题描述:

我必须在zOS中创建一个动态链接的库。什么是传递给编译器的选项。在zOS中的动态链接

此外,如何检查zOS中的库是否在其他库上动态链接[依赖]。我们在linux下有ldd,它显示了这个链接。我们在zOS土地上是否有'ldd'等价物?

+0

你有没有签出[建立和使用动态链接库](http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01 /dllsim.htm)? – NealB 2010-12-10 16:15:43

你不直接说,但我假设你的意思是一个C/C++ DLL。您也可以使用其他语言(甚至是汇编程序)来执行共享库,但步骤会有所不同。

首先,您需要决定要导出的内容。许多IBM示例使用编译器EXPORTALL指令,但请注意,这可能会导致非常慢的可执行文件,具体取决于您的编码风格。如果你不做EXPORTALL,你需要#pragma export来导出你想要导出的任何东西(代码或数据)。不要忘记,您可以导出数据(变量)以及可执行函数......有时您需要使用它来与DLL函数共享数据。

然后,你需要设置两个客户端(主叫)和DLL的编译选项使用DLL联动......这是-Wc,DLL编译选项启用时,它会产生额外的逻辑程序来加载和管理DLL。如果您认为您需要更新DLL而无需完全替换它,那么在您的导出函数中也包含#pragma csect是个好主意。

当你链接你的DLL时,一定要指定-Wl​​,DLL选项(有很多方法......如果你批量链接,这部分是不同的 - 我假设你正在构建一个make某种文件)。该链接将生成实际的DLL,以及包含所有导出函数的“IMPORT”语句的“side deck”。您将需要这些链接来链接您期望调用该DLL的任何客户端程序。例如,如果您的导入位于名为AAA.x,c89 -Wc的文件中,则DLL myapp.c AAA.x将编译调用代码,并知道AAA.x中的函数在某种类型的DLL中关闭。

关于调用其他DLL的DLL,不要忘记一个DLL既可以“服务”也可以“消耗”函数......通过在其他DLL中包含函数的侧边栏,可以有一个DLL在调用其他DLL访问其他DLL时提供了一些功能。

实际的DLL本身可以在几个地方,这取决于您的应用程序的性质。如果你对UNIX服务友好,它只是LIBPATH中的一个可执行文件。它也可以是STEPLIB,LNKLST,LPA等等。

如果需要,您可以在运行时使用dlopen(),dlsym()等显式访问您的DLL。一般来说,这可以让你精确地控制你正在使用的DLL(如果用户可以自己提供的话,有时候会很方便),并且它给你提供了在DLL中解析的函数指针的数量。

链接时还有一些基本的事情需要考虑,比如确保代码是可重入的。其中大部分内容在IBM文档中有详细说明,如果您使用“c89”(或同等产品)进行构建,则通常会为您自动设置正确的选项(实际上,为了弄清楚发生了什么,在详细输出上,并查看您自己的所有参数)。

如果您需要建立什么叫什么的交叉引用,UNIX服务“nm”命令可以为您提供该信息。如果您生成详细的链接编辑列表,那么当您构建DLL时,所有数据也都在其中。

祝你好运!