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

退出打印视图

更新时间: 2014 年 7 月
 
 

审计接口控制流量

以下各节介绍了审计库可使用每个接口执行的审计接口例程和操作。重点介绍了进程初始化。这些例程将按照其在常规全局审计程序(在进程启动时提供)中的调用顺序显示。

审计接口分为两个类别:信息性和控制性。

信息性接口提供有关执行进程的审计库信息,例如目标文件搜索、目标文件装入和符号绑定。此外,这些接口还允许审计程序修改装入的目标文件,以及请求接收未来符号绑定事件的通知。

通过调用控制性接口,审计库可以跟踪进程执行过程中活动的起始阶段或结束阶段。通过这些接口,可以允许审计程序安全地检查一致性目标文件集合,甚至可以允许装入新的目标文件。

第一次装入一个审计库后,将即时调用此库的 la_version() 接口。此握手会验证此审计库是否受支持,且允许此库通过运行时链接程序定义此库需要的接口版本。

在进程启动时,可通过使用 LD_AUDIT 或通过启动进程的可执行目标文件中的局部审计定义建立审计库。请参见调用审计接口。在此方案中,将向审计库提供针对可执行目标文件和运行时链接程序的 la_objopen() 调用。

此时,进程仍处于构建的早期阶段。审计程序应避免执行任何可能干扰此构建的操作,例如将其他目标文件添加到进程或对进程进行全面符号搜索。这些操作会导致提前装入和重定位目标文件,以试图满足符号查找。

进程初始化时即时装入的所有依赖项都要报告给审计库的 la_objopen() 接口。对于使用延迟装入的进程,进程初始化时仅装入几个依赖项。请参见延迟装入动态依赖项。每个装入的目标文件都将进行重定位,从而导致将在符号引用与符号定义之间建立符号绑定。这些绑定都将报告给审计库的 la_symbind() 接口。

一旦装入并重定位了所有即时依赖项,将立即调用审计库的 la_preinit() 接口。此时,进程仍在构建中。线程初始化和初始化例程收集仍处于暂挂状态。但是,此接口提供了一个便利的控制点,用于将其他目标文件添加到初始进程。

一旦线程初始化完成,将立即调用审计库的 la_callinit() 接口。此时,所有装入的目标文件可随时执行,同时已收集并对所有初始化例程进行排序,以待执行。请参见初始化和终止例程la_callinit() 控制点用于标记到执行应用程序代码的转换。

执行应用程序代码会导致在符号引用与符号定义之间建立函数调用绑定。这些绑定都将报告给审计库的 la_symbind() 和/或 la_pltenter() 接口。使用延迟装入,可装入其他目标文件以满足符号引用,这些引用都将报告给审计库的 la_objopen()

一旦执行了所有初始化代码,将立即调用审计库的 la_callentry() 接口。la_callentry() 控制点用于标记进程初始化的结束,以及到应用程序入口点(通常为 start()main())的转换。

继续执行进程时,会出现更多的符号绑定,从而会调用 la_symbind() 和/或 la_pltenter()。可装入其他依赖项,从而会调用 la_objopen()。还可卸载新的依赖项,从而会调用 la_objclose()。目标文件的任何装入或卸载均由一对 la_activity() 调用进行绑定。在执行有针对性的行为(添加或删除目标文件)时,会提示第一个 la_activity()。第二个 la_activity() 表示进程中的依赖关系结构不一致。审计程序应限制其对进程进行的检查,以遵循一致的通知。