从 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
编译器选项,在某种程度上可以使用COMPACT
。 COMPRESS
选项将禁止在控制块中发出函数名称,而 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 开发版