zOS中的动态链接

时间:2010-12-09 12:39:15

标签: dynamic-linking zos

我必须在zOS中创建动态链接库。有哪些选项可以传递给编译器。

另外,如何检查zOS中的库是否与其他库动态链接[相关]。 我们在linux中有ldd,它显示了这种联系。我们在zOS土地上有'ldd'等价物吗?

1 个答案:

答案 0 :(得分:2)

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

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

然后,你需要在 客户端(调用者)和DLL上设置编译选项以使用DLL链接...这是-Wc,DLL编译选项,当启用时,它会生成程序中用于加载和管理DLL的额外逻辑。如果您认为在没有完全替换DLL的情况下需要更新DLL,那么将#pragma csect包含在导出的函数中也是一个好主意。

当您链接您的DLL时,请务必指定-Wl​​,DLL选项(有很多方法......如果您批量链接,这部分会有所不同 - 我假设您正在建设在某种make文件中)。该链接将生成实际的DLL,以及" side deck"含有" IMPORT"所有导出函数的语句。您需要这些链接任何您希望调用DLL的客户端程序。例如,如果您的导入位于名为AAA.x,c89 -Wc的文件中,则DLL myapp.c AAA.x将编译调用代码,并意识到在某些DLL中,AAA.x中的函数处于关闭状态。

关于调用其他DLL的DLL的问题,请不要忘记DLL可以同时服务"并且"消费"函数...通过在其他DLL中包含函数的侧面板,您可以拥有一个DLL,它在调用其他DLL访问其他DLL时提供一些函数。

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

如果需要,可以使用dlopen(),dlsym()等在运行时显式访问DLL。通常,这可以让您精确控制您正在使用的DLL(如果用户可以自己提供,则有时会很方便),并且它可以为您提供在DLL中解析的函数指针的数量。

链接时还需要考虑其他一些基本事项,例如确保代码是可重入的。其中大部分内容都在IBM文档中详细说明,如果您使用" c89" (或等效的),通常会自动为您设置正确的选项(事实上,为了更好地了解正在进行的操作,打开详细输出并自行查看所有参数)。

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

祝你好运!