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

尼古拉斯·威尔逊

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

我们从中调用了某些函数/usr/include/bsm/audit.h,特别是getaudit_addr在Solaris 10和11之间,ABI发生了巨大变化,开始重新排序struct字段并更改了它们的长度:

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)。 更新:不,-lbsm在Solaris 10上链接并不能使代码在Solaris 11上正确运行。这只是他们所做的令人讨厌的ABI重大更改。
  2. 如果Solaris确实具有适用的符号版本控制,那么我们可以动态地进行吗?
  3. 我倾向于复制结构定义,并在新旧定义之间进行运行时切换,而不是使用标头。还有其他后备解决方案吗?
  4. 标头是否取决于体系结构?也就是说,audit.h在SPARC,amd64和x86上是否相同?显然,typedef类型的大小可能会发生变化,但是我是否需要寻找一台Solaris 11 SPARC计算机来复制其标头,并检查其是否与x86匹配?
Ben

确实,如果ABI不兼容,则需要像对待不兼容的处理器类型一样对待它。即:构建两个版本。从安装程序安装或构建正确的版本。在运行时检查运行的版本是否正确,如果没有运行,请退出。

另外,如果这实际上是唯一会改变的结构,则可以放弃使用typedef'd auditinfo_addr_v10vs auditinfo_addr_v11,并附带使用该结构的每个函数的两个版本,或者在V10上使用转换函数来转换所有内容到最新结构。即提供您自己的文件getaudit_addr_wrapper,该文件采用v11结构,但会转换为对v10的正确调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章