我正在使用 GNAT 构建我的 Ada/SPARK 项目,并且使用链接器脚本。以下是摘录:
SECTIONS
{
.code :
{
. = ALIGN(0x4);
*(.text.section1)
_end_of_section1 = .;
*(.text.section2)
...
}
}
Run Code Online (Sandbox Code Playgroud)
符号 _end_of_section1 是两个节之间的地址。我希望能够在我的 Ada 代码中访问它。我知道在 C 中使用extern char _end_of_section1[];. 在 Ada 中可以做这样的事情吗?如果没有,是否有其他方法可以在代码中获取该地址?
我有一个带有多个构建配置的 Gnat/Gprbuild 项目。我有一个主源文件和一个辅助广告文件,其中主源文件包括:
with Secondary_File; use Secondary_File;
Run Code Online (Sandbox Code Playgroud)
问题是在每个配置中,辅助文件都有不同的名称。例如,一个配置的名称可能为Secondary_File_1.ads,另一配置的名称可能为Secondary_File_2.ads。这使得上面的with语句无法使用。
在C中,我会做这样的事情:
#ifdef BUILD_CFG_1
#include "secondary_file_1.h"
#else
#include "secondary_file_2.h"
#endif
Run Code Online (Sandbox Code Playgroud)
是否有一种聪明的方法可以使用 Gprbuild 系统在 ADA 中执行此类操作?
我的项目中有一个来自外部团队的源文件,我无法修改它。它包含定义寄存器内容的记录:
type R_Field is (R_FALSE, R_TRUE) with Size => 1;
for R_Field use (R_FALSE => 16#0#, R_TRUE => 16#1#);
type W_Field is (W_FALSE, W_TRUE) with Size => 1;
for W_Field use (W_FALSE => 16#0#, W_TRUE => 16#1#);
type U_Field is (U_FALSE, U_TRUE) with Size => 1;
for U_Field use (U_FALSE => 16#0#, U_TRUE => 16#1#);
type My_Register is record
R : R_Field;
W : W_Field;
U : U_Field;
end record with Size => 32, Object_Size => 32;
for My_Register use …Run Code Online (Sandbox Code Playgroud)