如何确定 link lib 我当前的 z/OS 汇编程序是从中加载的

how to determine the link lib my current z/OS assembler program is loaded from

有没有办法确定我的 运行 z/os 汇编程序从中加载的数据集?如果可能的话,整个 steplib 连接会很好,但不是必需的。

我猜你的意思是在运行时从你的软件内部 - 这在事后从系统转储中很容易做到。

最短路径通常是 BLDL...它搜索 steplib、lnklst 等并返回一个目录条目以及是否在 steplib 中找到该模块的指示。现在您的挑战只是将 BLDL 输出目录条目转换为数据集名称。

如果您的模块来自 STEPLIB,则 BLDL 输出的第一个字节包含一个串联编号...使用此信息,您会找到任务的 TIOT (PSATOLD->TCBTIO),然后是 TIOENTRY对于 STEPLIB,则按串联数对该数组进行索引。现在您位于包含您的模块的特定 STEPLIB 串联数据集的 TIOENTRY,您只需选择 JFCB 地址(或 SWA 令牌),瞧 - 这是您的数据集名称。

请注意,STEPLIB 实际上不必是 "STEPLIB"...您几乎可以使用任何您想要的 DDNAME。 TSO 执行此操作 - 动态分配加载库,这会为您提供 SYS* 的 DDNAMES。这有时称为 "tasklib",它也带来了一些挑战。

从 LNKLST、LPA、MLPA 等加载的模块的细节不同。但基本概念相同。

另请注意,此方法并非 100% 万无一失,因为它并不能真正告诉您模块来自何处...相反,它会告诉您现在,这可能并不总是相同的事情(例如,假设有人将您的程序的新副本链接到您的 STEPLIB 串联中位于您之前的数据集......您是从 "A" 加载的,但是这个方法可能会告诉你 "B").

如果您的可执行文件恰好是 UNIX 路径名,那么任务实际上会简单一些,因为 CSVQUERY 会告诉您您想要什么。实际上,您可能希望在 BLDL 前加上对 CSVQUERY 的调用以获取入口点名称等信息。

复杂的子系统(想到 CICS)在管理程序时可能会做一些奇怪的事情,因此一旦您脱离了批处理或 TSO 环境,这些技术可能无法像您预期的那样工作。最好的办法是让自己转储并使用 IPCS 遍历其中一些链,直到清楚如何做你想做的事......一旦你弄清楚什么指向什么,代码就不是那么多了。

祝你好运!