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

Jas*_*n R 4 linux glibc shared-libraries elf ld

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

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

--audit AUDITLIB
Run Code Online (Sandbox Code Playgroud)

将 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 动态加载器甚至使用DT_AUDITELF 标头中的字段。这是故意的吗?

Emp*_*ian 5

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

它设置了DT_AUDIT动态条目,谁愿意关注它。

问题是(截至当前主干)GLIBC 动态加载器没有注意它(寻找process_dl_audit例程)。它只关注LD_AUDIT环境变量,并--audit在 loader:ld.so被直接调用时进行标记。

直到有人贡献代码也注意DT_AUDIT--audit标志ld将保持无用。