从 z/OS 上的 C 语言可执行文件中删除符号信息

Posted

技术标签:

【中文标题】从 z/OS 上的 C 语言可执行文件中删除符号信息【英文标题】:Remove symbolic information from C language executable on z/OS 【发布时间】:2020-06-16 06:08:57 【问题描述】:

构建了我的应用程序,最初使用debug,我现在开始准备将其投入生产。我已经改变了我的编译选项

-c -W"c,debug,LP64,sscomm,dll"

-c -s -W"c,LP64,sscomm,dll"

将生成的可执行文件的大小减少到调试版本的 60%。

我更改了链接选项

-W"l,LP64,DYNAM=DLL"

-s -W"l,LP64,DYNAM=DLL"

这进一步将生成的可执行文件的大小减少到原始调试版本的 20%。

所以它似乎确实在做某事。但是当我查看可执行文件时,我仍然可以看到可执行文件中所有引人注目的函数名,当我强制异常结束时,生成的CEEDUMP 仍然显示该文件中的所有函数名。我希望-s 删除所有符号信息。

所以我的问题是“如何删除所有符号信息?”

此外,一旦与-s 链接,我就无法再将模块从生成它的 USS 文件复制到 MVS 数据集。我使用以下命令:-

cp -X prog "//'ME.USER.LOAD(PROG)'"

失败了:-

 IEW2523E 3702 MEMBER *NULL* IDENTIFIED BY DDNAME /0000002 IS NOT AN EDITABLE
          MODULE AND CANNOT BE INCLUDED.
 IEW2510W 3704 ENTRY OFFSET  0 IN MODULE *NULL* IDENTIFIED BY DDNAME /0000002
          DOES NOT EXIST IN A VALID SECTION.
cp: FSUMF140 IEWBIND function "INCLUDE" failed with return code 8 and reason code 83000505

此错误消息似乎说我需要EDIT 链接选项,但如果我添加它,它似乎否定了在链接上使用-s 的步骤,因为大小回到了 60%调试版本大小。

所以我的第二个问题是,“如何将文件复制到 MVS 数据集并删除符号信息?”

也许我可以采取后续步骤再次驱动活页夹,以便在复制后从 USS 文件和 MVS 数据集中删除符号信息?

【问题讨论】:

要删除符号条是你的朋友linux.die.net/man/1/strip 您可以将可执行文件直接放入数据集中,方法是将其指定为链接步骤的输出,例如-o "//'HLQ.DATA.SET.NAME(MEMBER)'" 嗨@Ôrel - 不确定在 z/OS 上是否如此 - 根据ibm.com/support/knowledgecenter/SSLTBW_2.2.0/… 【参考方案1】:

您可以使用COMPRESS 编译器选项,在某种程度上可以使用COMPACTCOMPRESS 选项将禁止在控制块中发出函数名称,而 COMPACT 选项将影响编译器优化选择以支持更小的对象大小。

即使您在 USS 中编译和链接可执行文件,也不需要在 USS 中生成可执行文件然后将其复制到数据集。您可以使用-o "//'ME.USER.LOAD(PROG)'" 语法将可执行文件直接放入数据集中。只需确保您的输出数据集是 PDSE

由于您在 USS 中进行编译和链接,因此您应该使用 xlc 实用程序和 -q 语法作为编译器选项,因为这种语法避免了使用在 shell 中具有特殊含义的括号。

【讨论】:

我没看到COMPACT - 你是说COMPAT吗? 选项是COMPACT不是COMPAT,可以在User's Guide找到 谢谢 - 我很抱歉。我正在阅读活页夹选项!还有一个名为COMPRESS 的活页夹选项。但你确实说“编译器选项”,所以我不好。

以上是关于从 z/OS 上的 C 语言可执行文件中删除符号信息的主要内容,如果未能解决你的问题,请参考以下文章

历史上的今天3 月 30 日:世界上最早的表情符号;IBM z/OS 问世;微软发布 HoloLens 开发版

如何从 z/OS 调用远程服务器上的 python 脚本?

如何使用 GCC 和 ld 删除未使用的 C/C++ 符号?

静态库中的符号有时会链接到可执行文件,有时不会

是否可以使用通配符删除 z/OS 上的数据集

C/C++语言编译生产可执行的二进制文件的过程??求大神详尽解释,