【问题标题】:Solaris 10 and 11 headers incompatible! What to do?Solaris 10 和 11 标头不兼容!该怎么办?
【发布时间】:2013-12-05 12:04:13
【问题描述】:

我们有一个在 Solaris amd64(和 x86、SPARC)上发布的产品 - 我们有一个安装在 Solaris 10 和 11 上的 pkg。

我们从/usr/include/bsm/audit.h 调用一些函数,特别是getaudit_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_addr 的句柄,如果您在 Sol10 上编译并在 Sol11 上运行,这无疑会以一种可怕的方式退出(因为我们使用的是完全损坏的结构体)。这不好。

问题

  1. 如果我们链接到-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 上正确运行。这只是一个令人作呕的破坏 ABI他们所做的改变。 Grr.
  2. 如果 Solaris 确实具有有效的符号版本控制,我们可以动态执行吗?
  3. 我倾向于复制结构定义并在新旧结构之间进行运行时切换,而不是使用标题。还有其他备用解决方案吗?
  4. 标头是否依赖于体系结构?也就是说,audit.h 在 SPARC、amd64 和 x86 上是否相同?显然 typedef 的类型的大小可能会改变,但我是否需要寻找一台 Solaris 11 SPARC 机器来复制它的标题并检查它是否与 x86 匹配?

【问题讨论】:

  • 与 Sun/Oracle 违背接口稳定性分类非常不同......而且,这些天来,不太可能从他们那里得到解释为什么会发生这种情况。可以通过二进制兼容性保证程序oracle.com/technetwork/server-storage/solaris/overview/… 进行查询 - 通过appcert 运行您的测试程序是否在 Solaris 10 上通过?

标签: c shared-libraries solaris


【解决方案1】:

确实,如果 ABI 不兼容,您需要将其视为不兼容的处理器类型。即:构建两个版本。从您的安装程序安装或构建正确的版本。在运行时检查您运行的版本是否正确,如果不是,则退出。

或者,如果这实际上是唯一改变的结构,您可以使用 typedef'd auditinfo_addr_v10 vs auditinfo_addr_v11,并附带使用该结构的每个函数的两个版本,或者进行转换V10 上用于将所有内容转换为最新结构的函数。 IE。提供您自己的 getaudit_addr_wrapper,它采用 v11 结构,但将转换为 v10 上的正确调用。

【讨论】:

  • 这是我的选项 #3,我刚刚对其进行了编码,它确实有效。我希望有更好的方法来解决这个问题。您是否有任何有助于解决 #4 的 Solaris 知识,即 SPARC 是否具有与 amd64 不同的结构定义,或者我可以将 amd64 Sol11 标头用于所有拱门上的原型吗?
  • 结构改变的原因是支持ipv6地址,旧格式不支持。不同的平台将共享相同的结构定义 - 除非该头文件实际上位于平台/硬件特定位置,否则可以认为是平台中立的。
  • @Petesh,谢谢,知道这很有帮助。关于 IPv6 - Sol10 au_tid_addr 肯定支持这个吗?对于 IPv6 地址来说,它显然足够大。他们在 Sol11 上所做的唯一更改是使端口号为 64 位,而不是 32 位,所以大概他们在那里考虑了 IP 以外的其他东西。 AFAICT,最重要的变化是在掩码字段中,它已从 32 位扩展到 64 位,并以一种奇怪的方式重新打包在 ucred 中 - 我可以相信用完掩码位已经足够紧迫,可以按下它们来打破ABI。
  • @NicholasWilson 我不会引用非 Solaris 手册页作为参考。他们将其重新归类为私人,我实际上不知道原因,但他们有权这样做。引用Darren Moffat:这些 API 已被删除。
  • @Petesh 解释了发生了什么......但它与 Sun/Oracle 不同,它违背了接口分类承诺。 Solaris 10 01/13(最新)联机帮助页,顺便说一句,当然也声明“稳定”:docs.oracle.com/cd/E26505_01/html/816-5167/setaudit-2.html 虽然,为了迂腐,它没有详细声明 struct auditinfo_addr。跨度>
猜你喜欢
  • 1970-01-01
  • 2020-07-03
  • 2021-06-19
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多