Link-编辑步骤到底是什么

What exactly is the Link-edit step

问题

我的 COBOL 编译器中的 link-edit 步骤到底做了什么?

编译代码后,会执行 link 编辑步骤。我不太确定这一步的作用。

背景信息

刚毕业(3 年前),我找到了一份大型机应用程序开发人员的工作。在学校对大型机一无所知,我的知识有很多空白。在我的商店周围,我们有一种 "black box" 的态度,我们不需要知道很多这些东西是如何工作的,它就是这样。我试图理解如果程序已经成功编译,为什么我们需要这个 link-edit 步骤。

linkedit/binderer 步骤根据编译器(或汇编程序)的输出生成可执行程序。

如果您从 COBOL 编译步骤查看 SYSLIN 上的输出数据集(如果它是临时数据集,您可以将其覆盖为 FB、LRECL 80 顺序数据集以便能够查看它)你会看到 "card images",其中包含(除其他外)编译器生成的机器代码。

这些卡片图像不可执行。代码甚至不连续,缺少很多必要的运行时模块。

程序 Binder/Binder (PGM=HEWL) 从 compiler/assembler 中获取目标代码(卡片图像)并执行所有必要的操作(根据安装时的选项,以及更多选项)您提供,以及许多包含目标代码或加载模块或程序对象的其他库)来创建可执行程序。

曾经有一个叫做链接编辑器的东西完成了这个任务。因此 link 编辑,link 编辑。不幸的是,在英语中,bind 与 edit 的共轭方式不同。没有什么好词,所以我使用 Binderer 和 Bindered,部分原因是为了反对决定将其称为 Program Binder 的机构(也不要与 Binding for DB2 混淆)。

所以,今天,link编辑人们的意思是 "use of the Program Binder"。这是一个将你的 compile/assemble 的输出变成一个可执行程序的过程,它可以是一个加载模块,或者一个程序对象(Enterprise COBOL V5+ 只能绑定到程序对象,不能绑定到加载模块),或者一个 DLL(不要与 .dll 混淆)。

值得一看的是 SYSLIN 的输出,活页夹步骤的 SYSPRINT 输出,并参考 Program Binder 的 manuals/presentations,这会让你了解里面有什么,什么通过将消息粘贴在浏览器搜索框中来发生(查找任何 IEW 消息,尤其是对于步骤的非零 RC 执行)。从纪录片 material 中,您也会开始了解该主题的广度。 Binder 能够做很多有用的事情。

这里有一个 link 有用的图表,一些更详细的解释,以及应用程序活页夹的主要参考文档的名称:z/OS MVS 程序管理:用户指南和参考

The program management binder

作为尾注,它们是 "card images" 的原因是因为......在过去,来自 compiler/assembler 的对象牌组会被打孔到实体卡片上。然后将用作 linkage 编辑器的输入卡。我很抱歉我错过了必须做的事情......

除了 Bill 的(出色)回答之外,我认为还值得一提以下相关主题...

静态与动态linking

如果一个(主)程序 'calls' 一个子程序,那么你可以让这样的调用发生 'dynamic' 或 'static':

  • 动态:在运行时(主程序执行时),加载并执行子程序当时的当前内容。
  • static: 在link-时间(邮件程序被(重新)link编辑时),子程序当时的当前内容包含(=解析)在主程序中.

Link-编辑控制卡

加载模块的实际创建(link-edit 步骤的输出)可以由 link-editor 的特殊指令控制,例如:

  • 要创建的入口点。
  • 要创建的加载模块的名称。
  • 包括(静态 linked 子程序)要执行。
  • 要创建的别名成员。

在 PDS 或 PDSE 中存储 link-编辑输出

实际输出(加载模块)可以存储在位于 PDS 或 PDSE 库中的成员中。这样做时,您需要提前考虑一下哪种格式(PDS 或 PDSE)最适合您的要求,尤其是在连接多个库时(例如用于测试目的的预生产环境)。