Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

审计接口限制

rtld-audit 实现中存在一些限制。设计审计库时应谨慎了解这些限制。

使用应用程序代码

将目标文件添加到进程时审计库会接收到信息。审计库接收到这种信息时,所监视目标文件可能无法执行。例如,对于装入的目标文件,审计程序可能会接收到 la_objopen() 调用。但是,在该目标文件中的任何代码可以使用之前,该目标文件必须装入其自身的依赖项并进行重定位。审计库可能需要通过使用 dlopen(3C) 获取句柄来检查装入的目标文件。然后,通过使用 dlsym(3C),可将该句柄用于搜索接口。但是,除非已知目标文件的初始化已完成,否则不应调用采用这种方式获取的接口。

la_pltexit() 的用法

使用 la_pltexit() 系列存在一些限制。这些限制是由于需要在调用者和被调用者之间插入额外栈帧,以提供 la_pltexit() 返回值。此要求在仅调用 la_pltenter() 例程时不会产生问题。在这种情况下,可以在将控制权转交给目标函数之前清除任何干预栈。

由于存在这些限制,因此应该将 la_pltexit() 视为实验接口。在不确定的情况下,请避免使用 la_pltexit() 例程。

直接检查栈的函数

有少量函数可以直接检查栈或对其状态做出假设。这些函数的一些示例包括 setjmp(3C) 系列、vfork(2) 以及返回结构而不是指向结构的指针的任何函数。为支持 la_pltexit() 而创建的额外栈会破坏这些函数。

由于运行时链接程序无法检测此类型的函数,因此,审计库创建者会负责针对此类例程禁用 la_pltexit()