我们基本上使用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
为什么编译器会以这种方式运行?如何抑制这种行为?
调试时真的很混乱。
答案 0 :(得分:2)
你应该记住键入的"常数"在Ada中不是静止的。
如果您想要静态常量,请使用"命名数字":
Some_Constant : constant := 100.0;
(我不知道编译器在这种情况下会生成哪些代码。)