use*_*008 5 dynamic-linking zos
我必须在zOS中创建一个动态链接的库.有哪些选项可以传递给编译器.
另外,如何检查zOS中的库是否与其他库动态链接[相关].我们在linux中有ldd,它显示了这种联系.我们在zOS土地上有'ldd'等价物吗?
你没有直接说出来,但我假设你指的是 C/C++ DLL。您也可以使用其他语言(甚至汇编语言)创建共享库,但步骤会有所不同。
首先,您需要决定要导出的内容。许多 IBM 示例使用编译器 EXPORTALL 指令,但请注意,这可能会导致可执行文件非常慢,具体取决于您的编码风格。如果您不执行 EXPORTALL,则需要 #pragma export 来导出您想要导出的任何内容(代码或数据)。不要忘记您可以导出数据(变量)以及可执行函数...有时您需要它与 DLL 函数共享数据。
然后,您需要在客户端(调用者)和 DLL 上设置编译选项以使用 DLL 链接...这是 -Wc,DLL 编译选项,启用后,它会在程序中生成额外的逻辑来加载和管理DLL。如果您认为需要更新 DLL 而不完全替换它,那么最好在导出函数中包含#pragma csect。
当您链接 DLL 时,请务必指定 -Wl,DLL 选项(有很多方法...如果您批量链接,这部分会有所不同 - 我假设您正在构建某种 make 文件)。该链接将生成实际的 DLL,以及包含所有导出函数的“IMPORT”语句的“侧面板”。您将需要这些来链接您希望调用 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,有时会很方便),并且它为您提供了在 DLL 中解析的函数指针。
链接时还需要考虑其他一些基本事项,例如确保代码可重入。其中大部分都在 IBM 文档中详细说明,如果您使用“c89”(或同等内容)之类的内容进行构建,通常会自动为您设置正确的选项(事实上,为了更好地了解正在发生的情况,请打开在详细输出上并亲自查看所有参数)。
如果您需要建立什么调用什么的交叉引用,UNIX 服务“nm”命令可以为您提供该信息。如果您生成详细的链接编辑列表,那么当您构建 DLL 时,所有数据也都在其中。
祝你好运!
| 归档时间: |
|
| 查看次数: |
742 次 |
| 最近记录: |