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

Remove symbolic information from C language executable on z/OS

构建我的应用程序后,最初使用 debug,我现在开始准备生产。我已经从

更改了我的编译选项
-c -W"c,debug,LP64,sscomm,dll"

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

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

我从

更改了我的 link 选项
-W"l,LP64,DYNAM=DLL"

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

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

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

所以我的问题是"how do I remove all symbolic information?"

此外,一旦 link 使用 -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 linkage 选项,但是如果我添加它,它似乎否定了在link,因为大小回升到调试版本大小的 60%。

所以我的第二个问题是,"how do I copy the file to an MVS dataset and also remove symbolic information?"

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

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

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

由于您是在 USS 中编译和链接,因此您应该使用 xlc 实用程序和 -q 编译器选项语法,因为此语法避免使用在 [=24 中具有特殊含义的括号=].