5

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

此外,如何检查 zOS 中的库是否与其他库动态链接[依赖]。我们在 linux 中有 ldd,它显示了这种联系。我们在 zOS 领域是否有“ldd”等价物?

4

1 回答 1

2

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

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

然后,您需要在客户端(调用方)和 DLL 上设置编译选项使用 DLL 链接...这是 -Wc,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 时所有数据也都在其中。

祝你好运!

于 2015-11-27T18:53:13.823 回答