[最初使用debug
构建了我的应用程序,现在我准备将其投入生产。我从[
-c -W"c,debug,LP64,sscomm,dll"
to
-c -s -W"c,LP64,sscomm,dll"
将生成的可执行文件的大小减小到调试版本的60%。
我从以下更改了链接选项
-W"l,LP64,DYNAM=DLL"
to
-s -W"l,LP64,DYNAM=DLL"
这进一步将生成的可执行文件的大小减小到原始调试版本的20%。
所以它似乎确实在做something。但是,当我查看可执行文件时,仍然可以在可执行文件中看到所有函数名,并且当我强制放弃时,生成的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数据集中删除符号信息?
COMPRESS
编译器选项,并在某种程度上可以使用COMPACT
。 COMPRESS
选项将禁止在控制块中发出函数名,而COMPACT
选项将影响编译器的优化选择,以支持较小的对象大小。即使在USS中编译和链接可执行文件,也不需要在USS中生成可执行文件,然后将其复制到数据集。您可以使用-o "//'ME.USER.LOAD(PROG)'"
语法将可执行文件直接放入数据集中。只要确保您的输出数据集是PDSE
。
由于在USS中进行编译和链接,因此应将xlc
实用程序与-q
语法一起用于编译器选项,因为该语法避免了在外壳程序中具有特殊含义的括号的使用。