防止枚举类型的数组的调试信息出现在EXE中

Dav*_*ois 7 delphi

我打开Delphi IDE并创建一个新项目。这是该应用程序的全部代码:

program EnumSymbolsInExeTest1;

type
  tMyEnum = ( A );

begin
end.
Run Code Online (Sandbox Code Playgroud)

我生成了应用程序,然后在EXE中搜索“ tMyEnum”。找到了。这并不奇怪,因为我在链接器选项中将“调试信息”设置为“开”。

我关闭调试信息。我重建。我再次搜索EXE,现在没有提及tMyEnum。到目前为止,一切都如预期。

然后,我更改代码。我添加一个变量。

program EnumSymbolsInExeTest1;

type
  tMyEnum = ( A );

var
  Z : tMyEnum;

begin
end.
Run Code Online (Sandbox Code Playgroud)

我重建。仍然没有惊喜。我得到一个未使用变量的提示,而EXE仍然没有提及TMyEnum

然后,我进行另一个小更改:

type
  tMyEnum = ( A );

var
  Z : array of tMyEnum;

begin
end.
Run Code Online (Sandbox Code Playgroud)

我将变量更改为数组。我重建。我搜索EXE,发现tMyEnumEXE文件中现在出现“ ”。

我的问题是:为什么?

我该如何阻止它?我不希望任何内部标识符出现在发送给客户的可执行文件中。

我正在使用Delphi 10.2

为了响应David Heffernan,我添加了这些编译器指令。

program EnumSymbolsInExeTest1;

{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}

type
  tMyEnum = ( A );

var
  Z : array of tMyEnum;

begin
end.
Run Code Online (Sandbox Code Playgroud)

我的EXE仍然包含“ tMyEnum”。

我有新线索!我将数组从动态更改为静态。

program EnumSymbolsInExeTest1;

type
  tMyEnum = ( A );

var
  Z : array [1..10] of tMyEnum;

begin
end.
Run Code Online (Sandbox Code Playgroud)

现在,标识符不再出现在EXE中。

因此,类型的声明不会触发它,添加该类型的变量不会触发它,添加静态数组不会触发它,但是使它成为动态数组会触发它。

Ian*_*oyd 1

我想说这是不可能的。


直接实验观察得出的结论

尝试关闭我们能找到的每个选项:

编译

  • 代码内联控制:关闭
  • 发出运行时类型信息: false
  • 优化:正确
  • 断言:错误
  • 调试信息:无调试信息
  • 本地符号: false
  • 符号参考信息:无
  • 使用调试 .dcus: false
  • 使用导入的数据引用:false
  • I/O 检查:
  • 溢出检查: false
  • 范围检查: false
  • 可赋值的类型常量: false
  • 完整的布尔评估: false
  • 扩展语法:false
  • 默认长字符串:false
  • 开放参数:false
  • 严格的变量字符串:false
  • 输入 @ 运算符: false

链接

  • 调试信息:错误
  • 包括远程调试符号: false
  • 地图文件:关闭
  • 输出资源字符串.drc 文件: false

并且该符号仍然出现在.text最终PE模块的部分中。

在此输入图像描述

  • @DavidDubois,为什么是因为动态数组使用关于元素类型的 RTTI。RTTI 包含类型名称,这就是类型名称出现在 EXE 中的原因 (6认同)