具有C函数的Ada导入段错误

时间:2018-08-07 13:54:01

标签: c segmentation-fault ada

我有一个正在Ada上工作的程序,该程序最近已从32位升级到64位。我没有编写此代码,我只是负责使其在64位版本的RedHat上运行。

我仍在解决由此迁移引起的错误。该代码是段错误,不是以前的。

这是Ada函数

function Read_Fields
  (table         : DB_API_Types.DB_Table_Type;
   key           : System.Address;
   return_fields : System.Address;
   function      : Process_DB_Access_Type;
   client        : System.Address)
return C_Types.Int;
pragma Interface(C, Read_Fields);
pragma Import_Function
  (Internal => Read_Fields,
   External => "GetFields",
   Result_Type => C_Types.Int);

这是C函数

int GetFields ( DB::table_code table_type, char *key,
        char **return_fields, DB::GetFieldCB function,
        void *client) {
  return ( DB::System::Ptr()->get_fields(table_type, key, return_fields, func, client)); 
}

以下是Ada中此函数的示例调用

DB_Status :=
   Read_Fields
     (table         => table,
      key           => c_types.null_terminated.to_address_or_null_pointer(field),
      return_fields => table_Fields'address,
      function      => Process_Data'access,
      client        => read_Data_Return'address);

这让我有些困惑,我怀疑,但是我不确定内存地址如何跨语言界面工作。我以为它们会像机器语言一样处在一个过程中,所以这根本不重要,但是我可能会遗漏一些东西。

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:1)

您可以使用GCC / G ++的-fdump-ada-spec标志来重新生成与C ++函数的绑定。这样,您将获得绑定,编译器开发人员认为该绑定可以在该版本的GCC上正常工作。 (官方要求您使用相同版本的GCC来编译Ada和C ++,但实际上,您可能会获得与更广泛的编译器版本兼容的功能。)

答案 1 :(得分:0)

  1. 清理一切;删除周围放置的物体。
  2. 两者都重建;确保C和Ada都使用相同的架构(32位和64位)构建。
  3. 如果这不起作用,请尝试在Ada中使用C_Plus_Plus约定。