GNU ld的--audit标志有什么作用?

时间:2015-12-02 02:46:41

标签: linux shared-libraries ld glibc elf

我有一个应用程序,我想使用Linux提供的rtld-audit接口挂钩共享库加载过程。如果我使用LD_AUDIT环境变量来告诉动态链接器在运行程序时使用我的审计库audit.so,这非常有用。

但是,我想让它更加自动化,不需要特殊的环境设置。 GNU ld提供--audit标志,描述如下:

--audit AUDITLIB
     

将AUDITLIB添加到动态部分的“DT_AUDIT”条目中。不检查AUDITLIB是否存在,也不会使用库中指定的DT_SONAME。如果多次指定,“DT_AUDIT”将包含要使用的冒号分隔的审计接口列表。如果链接器在搜索共享库时找到带有审计条目的对象,它将在输出文件中添加相应的“DT_DEPAUDIT”条目。此选项仅在支持rtld-audit接口的ELF平台上有意义。

这告诉我,如果我使用--audit audit.so链接我的程序,那么它应该将我的审计库与程序相关联。我希望在程序运行时加载审计库。

果然,使用readelf,我可以验证使用此标志会导致audit.so在ELF标头中注册为审计库。但是,如果我在没有设置LD_AUDIT的情况下运行我的程序,则永远不会调用审计库。似乎我必须设置LD_AUDIT=audit.so才能获得我想要的行为。

这引出了一个问题:--audit标志实际上做了什么?上面手册页引用之外的任何文档似乎都很稀缺。我不清楚Linux动态加载器甚至使用ELF头中的DT_AUDIT字段。这是设计吗?

1 个答案:

答案 0 :(得分:2)

  

这引出了一个问题: - audit标志实际上做了什么?

为那些愿意关注它的人设置DT_AUDIT动态条目。

问题是(从current trunk开始)GLIBC动态加载器注意它(寻找process_dl_audit例程)。它只关注LD_AUDIT环境变量,并且当加载器--audit被直接调用时,ld.so标记。

在有人提供代码以引起注意DT_AUDIT之前,--audit的{​​{1}}标记仍然无效。