从 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
编译器选项,并且在某种程度上 COMPACT
。 COMPRESS
选项将抑制在控制块中发出函数名称,而 COMPACT
选项将影响编译器优化选择以支持较小的对象大小。
即使您在 USS 中编译和链接可执行文件,您也不需要在 USS 中生成可执行文件然后将其复制到数据集。您可以使用 -o "//'ME.USER.LOAD(PROG)'"
语法将可执行文件直接放入数据集中。只要确保您的输出数据集是 PDSE
.
由于您是在 USS 中编译和链接,因此您应该使用 xlc
实用程序和 -q
编译器选项语法,因为此语法避免使用在 [=24 中具有特殊含义的括号=].
构建我的应用程序后,最初使用 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
编译器选项,并且在某种程度上 COMPACT
。 COMPRESS
选项将抑制在控制块中发出函数名称,而 COMPACT
选项将影响编译器优化选择以支持较小的对象大小。
即使您在 USS 中编译和链接可执行文件,您也不需要在 USS 中生成可执行文件然后将其复制到数据集。您可以使用 -o "//'ME.USER.LOAD(PROG)'"
语法将可执行文件直接放入数据集中。只要确保您的输出数据集是 PDSE
.
由于您是在 USS 中编译和链接,因此您应该使用 xlc
实用程序和 -q
编译器选项语法,因为此语法避免使用在 [=24 中具有特殊含义的括号=].