Мы в основном используем архитектуру 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;
В файле карты мы в основном
.rodata 0x40010000 (0x8)file.o
.rodata 0x40010008 pfileconsts__csomeconstant
В сборкеон обращается к области file.o, то есть 0x40010000 вместо 0x40010008.В двоичном файле значения 0x40010000 и 0x40010008 фактически одинаковы, поэтому программа работает так, как ожидается.Но зачем компилятору это делать
Если какой-либо другой пакет (file2.adb
) также обращается к cSomeConstant, он делает еще одну копию в разделе
.rodata 0x40010010 (0x8)file2.o
Снова значение в двоичном файлесовпадает с cSomeConstant
Почему компилятор ведет себя так?Как подавить это поведение?
Это действительно сбивает с толку при отладке.