如何调用在ADA的ROM(或地址)中实现的“C”函数?

时间:2016-01-21 01:11:10

标签: ada

我有一个关于调用ROM中“C”函数的方法的问题,寻找一种方法来实现这一点,而不涉及链接时间的变化。

例如,我们知道“C”函数:

int my_func(int a); 

位于地址0xFFFF_AAAA;

所以我们尝试:

type ROM_my_func is access function (a : Interfaces.C.int) return Interfaces.C.int;

pragma Convention (C, ROM_my_func);

ADA_my_func : ROM_my_func := 16#FFFF_AAAA#;

我无法解决的错误是ADA_my_func的分配,不确定是否存在类型转换,并且尝试使用 System.Address_To_Access_Conversions 也未证明成功。

非常感谢任何示例和/或帮助的指针。

1 个答案:

答案 0 :(得分:4)

如果您使用的是现代GNAT和Ada​​2012,您可以说

function My_Func (A : Interfaces.C.Int) return Interfaces.C.Int
with
  Import,
  Convention => C,
  Address => System'To_Address (16#ffff_aaaa#);

请注意System’To_Address是特定于GNAT的;你可以使用System.Storage_Elements.To_Address

我在GDB下运行了一个程序并获得了

(gdb) run
Starting program: /Users/simon/tmp/so/asker 

Program received signal SIGSEGV, Segmentation fault.
0x00000000ffffaaaa in ?? ()

所以它显然是正确的事情。

不使用Ada2012方面,您可以写

function My_Func (A : Interfaces.C.Int) return Interfaces.C.Int;
pragma Import (C, My_Func);
for My_Func'Address use System'To_Address (16#ffff_aaaa#);