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

What does the --audit flag to GNU ld do?

我有一个应用程序,我想在其中使用 Linux 提供的 rtld-audit 接口来挂钩 shared-library 加载过程。如果我使用 LD_AUDIT 环境变量告诉动态 linker 在我 运行 我的程序时使用我的审计库 audit.so,这会很好用。

不过,我想让它更自动化一些,不需要特殊的环境设置。 GNUld提供了一个--audit标志,说明如下:

--audit AUDITLIB

Adds AUDITLIB to the "DT_AUDIT" entry of the dynamic section. AUDITLIB is not checked for existence, nor will it use the DT_SONAME specified in the library. If specified multiple times "DT_AUDIT" will contain a colon separated list of audit interfaces to use. If the linker finds an object with an audit entry while searching for shared libraries, it will add a corresponding "DT_DEPAUDIT" entry in the output file. This option is only meaningful on ELF platforms supporting the rtld-audit interface.

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

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

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

This begs the question: what does the --audit flag actually do?

设置了DT_AUDIT动态入口,有心人关注

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

除非有人贡献代码也关注 DT_AUDIT,否则 ld--audit 标志将保持无用。