【问题标题】:What does the --audit flag to GNU ld do?GNU ld 的 --audit 标志有什么作用?
【发布时间】:2016-03-06 04:17:34
【问题描述】:

我有一个应用程序,我想使用 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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的确认。我也得出了类似的结论。我想知道这个遗漏是设计使然,还是只是因为它尚未实施。听起来是后者。
    猜你喜欢
    • 2017-07-24
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2011-09-01
    相关资源
    最近更新 更多