我们有一个在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上运行(因为我们使用的是完全损坏的结构),那么这无疑会以可怕的方式出炉。这个不好。
-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重大更改。。audit.h
在SPARC,amd64和x86上是否相同?显然,typedef类型的大小可能会发生变化,但是我是否需要寻找一台Solaris 11 SPARC计算机来复制其标头,并检查其是否与x86匹配?确实,如果ABI不兼容,则需要像对待不兼容的处理器类型一样对待它。即:构建两个版本。从安装程序安装或构建正确的版本。在运行时检查运行的版本是否正确,如果没有运行,请退出。
另外,如果这实际上是唯一会改变的结构,则可以放弃使用typedef'd auditinfo_addr_v10
vs auditinfo_addr_v11
,并附带使用该结构的每个函数的两个版本,或者在V10上使用转换函数来转换所有内容到最新结构。即提供您自己的文件getaudit_addr_wrapper
,该文件采用v11结构,但会转换为对v10的正确调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句