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

问题描述 投票:0回答:2

我有一个应用程序,我想使用 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
字段。这是故意设计的吗?

linux shared-libraries ld glibc elf
2个回答
5
投票

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

设置了

DT_AUDIT
动态入口,谁愿意关注就关注吧。

问题是(截至当前主干)GLIBC动态加载器没有注意它(寻找

process_dl_audit
例程)。它只关注
LD_AUDIT
环境变量,以及直接调用 loader:
--audit
时的
ld.so
标志。

除非有人贡献代码来关注

DT_AUDIT
,否则
--audit
ld
标志将保持无用。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.