我必须在zOS中创建一个动态链接库。要传递给编译器的选项有哪些。
另外,如何检查zOS中的库是否动态链接依赖于其他库。我们在linux中有ldd,它显示了这种联系。我们在zOS的土地上有'ldd‘的等价物吗?
发布于 2015-11-28 02:53:14
您没有直接说出来,但我假设您指的是C/C++ DLL。您也可以使用其他语言(甚至是汇编语言)创建共享库,但步骤会有所不同。
首先,您需要决定要导出的内容。许多IBM示例使用编译器EXPORTALL指令,但要注意这可能会导致非常慢的可执行文件,这取决于您的编码风格。如果你不做EXPORTALL,你将需要对你想要导出的任何东西(代码或数据)使用#杂注导出。不要忘记,您可以导出数据(变量)以及可执行文件functions...sometimes,您将需要它来与DLL函数共享数据。
然后,您需要在客户端(调用方)和DLL上设置编译选项以使用DLL linkage...this是-Wc,DLL编译选项,当启用时,它会在您的程序中生成额外的逻辑来加载和管理DLL。如果您认为需要在不完全替换DLL的情况下更新DLL,那么在导出函数中也包含#pragma csect是一个好主意。
当你链接你的动态链接库时,一定要指定-Wl,DLL选项(如果你批量链接,有很多ways...this部分是不同的-我假设你是在某种make文件中构建的)。该链接将生成实际的DLL,以及包含所有导出函数的"IMPORT“语句的”侧面板“。您将需要它们来链接您期望调用DLL的任何客户端程序。例如,如果您的导入是在一个名为AAA.x的文件中,c89 -Wc,DLL myapp.c AAA.x将编译调用代码,并意识到AAA.x中的函数在某种DLL中是关闭的。
关于DLL调用其他DLL的要点,不要忘记,一个DLL既可以“服务”也可以“消费”functions...by,包括其他DLL中函数的附加卡片组。您可以拥有一个提供某些函数的DLL,同时调用其他DLL来访问其他函数。
实际的DLL本身可以位于多个位置,具体取决于应用程序的性质。如果您对UNIX服务友好,那么它只是LIBPATH中的一个可执行文件。它也可以是STEPLIB、LNKLST、LPA等等。
如果需要,可以在运行时使用dlopen()、dlsym()等显式访问DLL。通常,这使您可以准确地控制正在使用的DLL (如果用户可以自己提供DLL,有时会很方便),并且它提供了相当于在DLL中解析的函数指针的内容。
在链接时还需要考虑其他一些基本事项,例如确保代码是可重入的。其中大多数都在IBM文档中进行了详细说明,如果使用"c89“(或类似的东西)进行构建,通常会自动设置正确的选项(实际上,为了更好地了解发生了什么,可以打开详细的输出并自己查看所有参数)。
如果您需要建立什么调用什么的交叉引用,UNIX Services "nm“命令可以为您提供该信息。如果您生成详细的链接编辑清单,那么在构建DLL时,所有数据也都在其中。
祝好运!
https://stackoverflow.com/questions/4398282
复制相似问题