4

如何判断模块是动态调用还是静态调用?

4

5 回答 5

1

如果您在 z/OS 上运行,则可以完成此操作,但这并非易事。

首先,您必须跟踪保存区域链并使用 CSVQUERY 找出哪个程序拥有每个保存区域。每个其他程序都将是 Cobol 运行时模块,例如 IGZCPAC。在 IMS、CICS、TSO 等下,这些模块可能会有所不同。那是容易的部分。

一旦您知道谁拥有所有相关的保存区域,您就可以使用 OS LOADER / BINDER / LINKER 实用程序来发现相同模块中的工件。这是不容易的部分。

于 2011-01-27T14:11:47.923 回答
0

调用包含程序名称的工作存储变量不会进行 DYNAMIC 调用。

是的,它确实。调用变量名始终是动态的。根据 DYNAM/NODYNAM 编译器选项,调用 'literal' 是动态的还是静态的。

警告:这适用于 IBM 大型机 COBOL,我相信它也是标准的一部分。它可能不适用于其他非标准版本的 COBOL。

于 2009-09-28T13:07:16.230 回答
0

唯一的方法是查看链接编辑器 (IEWL) 的输出或加载模块本身。如果模块被动态调用,那么它不会存在于主模块中,如果它被静态调用,那么它将在加载模块中看到。调用包含程序名称的工作存储变量不会进行 DYNAMIC 调用。这种类型的调用称为隐式调用,因为模块的名称隐含在工作存储变量的内容中。调用程序名称文字。

于 2009-08-17T19:17:18.037 回答
0

调用语句。如果被调用的程序是用文字描述的,那么它就是一个静态调用。如果调用的程序是在运行时确定的,则称为动态调用:

      *     Static call
            call "THEPROGRAM"

      *     Dynamic call
            call wsProgramName
于 2011-07-01T11:19:34.113 回答
0

对于 Micro Focus,COBOL 静态链接通过调用上的调用约定(位 3)或编译器指令LITLINK 进行控制

当静态链接 program-id/entry-point 的大小写和调用本身时很重要,因此您可能希望确保它是准确的并使用CASE指令。

LITLINK 指令的反面是 NOLITLINK 指令或未设置第 3 位的调用约定!

在 Windows 上,您可以使用“dumpbin /exports”实用程序在 .dll 中查看导出的符号,在 Unix 上通过“nm”实用程序查看。

通过“cbllink”创建的 .dll 的导入 .lib 可以通过使用 cbllink 上的“-K”命令行选项创建。

于 2011-02-01T21:46:53.320 回答