【发布时间】: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 上运行,这无疑会以一种可怕的方式退出(因为我们使用的是完全损坏的结构体)。这不好。
问题
-
如果我们链接到更新: 不,在 Solaris 10 上与-lbsm而不是使用dlopen,我们可以吗?如果是这样,怎么办,因为我在 Sol11 的 libbsm.so 中找不到任何版本的 Sol10 ABI 符号,使用nm(并且 Sol10 和 Sol11 的 libbsm 版本都具有以下版本符号:SUNW_0.7、SUNW_0.8、 SUNW_1.1, SUNW_1.2)。-lbsm链接不会使代码在 Solaris 11 上正确运行。这只是一个令人作呕的破坏 ABI他们所做的改变。 Grr. - 如果 Solaris 确实具有有效的符号版本控制,我们可以动态执行吗?
- 我倾向于复制结构定义并在新旧结构之间进行运行时切换,而不是使用标题。还有其他备用解决方案吗?
- 标头是否依赖于体系结构?也就是说,
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