在编译的精灵中出现两个不变的副本

时间:2018-05-18 08:40:35

标签: gcc constants ada sparc gnat

我们基本上使用sparc架构,我们的语言是Ada,我们使用gnat编译器来编译代码。 我们观察到有趣的事情

我们代码中的一些常量有两个或更多副本。

file.adb:

With FileConsts; USE FileConsts
Procedure SomeProcedure is
A : LONG_FLOAT;
Begin
    A := cSomeConstant;
End SomeProcedure;

FileConsts.ads

cSomeConstant : CONSTANT LONG_FLOAT := 100.0;

在Map文件中我们基本上

.rodata 0x40010000 (0x8)file.o
.rodata 0x40010008 pfileconsts__csomeconstant

在程序集中它正在访问file.o区域,即0x40010000而不是0x40010008。在二进制文件中,0x40010000和0x40010008的值实际上是相同的,因此程序的行为符合预期。但是为什么编译器会这样做

如果任何其他包(file2.adb)也访问cSomeConstant,它将在

部分中制作另一个副本
.rodata 0x40010010 (0x8)file2.o

二进制文件中的值再次与cSomeConstant

相同

为什么编译器会以这种方式运行?如何抑制这种行为?

调试时真的很混乱。

1 个答案:

答案 0 :(得分:2)

你应该记住键入的"常数"在Ada中不是静止的。

如果您想要静态常量,请使用"命名数字":

Some_Constant : constant := 100.0;

(我不知道编译器在这种情况下会生成哪些代码。)