C Solaris 10和11标头不兼容!怎么办?

C Solaris 10和11标头不兼容!怎么办?,c,shared-libraries,solaris,C,Shared Libraries,Solaris,我们在Solaris amd64(和x86,SPARC)上提供了一个产品—我们有一个安装在Solaris 10和11上的pkg 我们从/usr/include/bsm/audit.h调用一些函数,特别是getaudit\u addr,在Solaris 10和11之间,ABI发生了巨大的变化,开始对结构字段进行重新排序并更改其长度: struct auditinfo_addr { au_mask_t ai_mask; au_id_t ai_auid;

我们在Solaris amd64(和x86,SPARC)上提供了一个产品—我们有一个安装在Solaris 10和11上的pkg

我们从
/usr/include/bsm/audit.h
调用一些函数,特别是
getaudit\u addr
,在Solaris 10和11之间,ABI发生了巨大的变化,开始对结构字段进行重新排序并更改其长度:

struct auditinfo_addr {
    au_mask_t       ai_mask;
    au_id_t         ai_auid;
    au_asid_t       ai_asid;
    au_tid_addr_t   ai_termid;
}; /* Sol 11 version */

struct auditinfo_addr {
    au_id_t         ai_auid;
    au_mask_t       ai_mask;
    au_tid_addr_t   ai_termid;
    au_asid_t       ai_asid;
}; /* Sol 10 version */
因此,我们的代码使用
dlopen
/
dlsym
来获得
getaudit\u addr
的句柄,如果您在Sol10上编译并在Sol11上运行,它会以一种可怕的方式退出(因为我们使用的是一个完全损坏的结构)。这不好

问题:
  • 如果我们使用
    -lbsm
    链接,而不是使用
    dlopen
    ,我们是否可以?如果是这样的话,怎么做,因为我在Sol11的libbsm.so中找不到任何版本的Sol10 ABI符号,使用的是
    nm
    (Sol10和Sol11的libbsm版本都有以下版本符号:SUNW_0.7、SUNW_0.8、SUNW_1.1、SUNW_1.2)更新:否,在Solaris 10上链接
    -lbsm
    无法使代码在Solaris 11上正确运行。这只是他们做出的令人恶心的破坏性改变。Grr
  • 如果Solaris确实有有效的符号版本控制,我们可以动态地进行吗
  • 我倾向于复制结构定义,并在新旧定义之间进行运行时切换,而不是使用标题。还有其他的退路吗
  • 标题是否取决于体系结构?也就是说,SPARC、amd64和x86上的
    audit.h
    是否相同?显然,typedef'd类型的大小可能会改变,但我是否需要查找Solaris 11 SPARC机器来复制其标题并检查它是否与x86匹配

  • 实际上,如果ABI不兼容,您需要以与不兼容处理器类型相同的方式处理它。即:构建两个版本。从安装程序安装或生成正确的版本。在运行时检查您运行的版本是否正确,如果不正确,请退出


    或者,如果这实际上是唯一一个发生变化的结构,您可以使用typedef'd
    auditinfo\u addr\u v10
    vs
    auditinfo\u addr\u v11
    ,并附带使用该结构的每个函数的两个版本,或者有一个转换函数,用于V10将所有内容转换为最新的结构。也就是说,提供您自己的
    getaudit\u addr\u包装器
    ,该包装器采用v11结构,但将在v10上转换为正确的调用。

    这是我的选择#3,我刚刚对其进行了编码,它确实有效。我希望有更好的方法解决这个问题。您是否有任何有助于#4的Solaris知识,即SPARC是否会对amd64有不同的结构定义,或者我是否可以对所有拱门上的原型使用amd64 Sol11标头?结构更改的原因是支持ipv6地址,而旧格式不支持ipv6地址。不同的平台将共享相同的结构定义-除非该头文件实际位于平台/硬件特定的位置,否则可以将其视为平台无关。@Petesh,谢谢,知道这一点很有帮助。关于IPv6——Sol10 au_tid_addr肯定支持这一点吗?它显式地大到足以容纳IPv6地址。他们在Sol11上所做的唯一更改是将端口号改为64位,而不是32位,因此他们可能考虑的不是IP。最近,最重要的变化是掩码字段,它已从32位扩展到64位,并以一种奇怪的方式重新打包到ucred中-我可以相信,掩码位的用完已经很紧急,足以迫使它们破坏ABI。@NicholasWilson I会对引用非Solaris手册页作为参考持谨慎态度。他们把它重新分类为私人,我不知道原因,但他们有权这样做。引用:那些API已经被删除了。@Petesh这就解释了发生的事情。。。但它与Sun/Oracle完全不同,它违背了接口分类的承诺。顺便说一句,Solaris 10 01/13(最新)手册页当然也声明了“稳定”:虽然为了学究,它没有详细声明
    struct auditinfo\u addr
    。与Sun/Oracle不同的是,Sun/Oracle在界面稳定性分类上背信弃义。。。但是,这些天来,也不太可能从他们那里得到解释为什么会发生这种情况。可以通过二进制兼容性保证程序进行查询,-当通过
    appcert
    运行时,您的测试程序是否通过Solaris 10?