c++ 动态链接器audit c++如何使用ld_audit监控so加载过程

落杰酱_5194

落杰酱_5194

2026-03-30

1017人浏览

原创

LD_AUDIT 是动态链接器提供的插桩接口,能监控 SO 加载/卸载/符号解析等底层动作,但仅对动态链接生效,不涉及 C++ 语义;需用 extern "C" 导出函数,禁用异常与 RTTI,并以绝对路径设置 LD_AUDIT。

c++ 动态链接器audit c++如何使用ld_audit监控so加载过程

什么是 LD_AUDIT,它真能监控 C++ 程序的 SO 加载?

能,但只对动态链接过程生效,且不关心 C++ 语义(比如类构造、模板实例化),只管 dlopen、DT_NEEDED、符号解析这些底层动作。它不是调试器,也不是 profiler,而是一个由动态链接器 ld-linux.so 提供的“插桩接口”——你写一个 audit 库,链接时用 LD_AUDIT 指向它,后续所有被审计进程的共享库加载/卸载/符号查找都会回调你的函数。

注意:它对静态链接的代码、RTLD_LOCAL 下未导出符号的 dlopen、以及被 LD_PRELOAD 覆盖掉的符号解析行为,监控效果会打折扣。

la_objopen 和 la_objclose 怎么抓到真正加载的 SO?

这两个是 audit 接口里最常用的入口点:la_objopen 在每个对象(主程序、依赖 SO、dlopen 打开的 SO)被映射进内存后立即调用;la_objclose 在其卸载前触发。但它们不保证“首次加载”——同一个 SO 多次 dlopen 可能只触发一次 la_objopen(因为已驻留),而 la_objclose 也只在引用计数归零时才来。

  • 用 cookie 参数区分不同加载实例(它由链接器分配,同一 SO 多次 dlopen 会得不同 cookie)
  • name 字符串可能为空(如主可执行文件)或为绝对路径(如 /lib/x86_64-linux-gnu/libc.so.6),别直接 strcmp 判空,先检查指针是否非 NULL
  • 不要在 la_objopen 里调用 printf 或 malloc —— 此时 libc 可能尚未完全初始化,应使用 write(2) + 栈缓冲区

C++ 编译 audit 库要注意哪些 ABI 和符号问题?

audit 库必须是共享库(.so),且必须用 C 风格符号导出(extern "C"),否则链接器找不到 la_version、la_objopen 等入口。C++ 编译器默认 name mangling,不加修饰就会链接失败。

常见错误现象:ld-linux.so: audit function la_objopen not found 或程序直接 abort。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 所有 audit 函数声明必须包在 extern "C" 块里
  • 编译时禁用 C++ 异常和 RTTI:-fno-exceptions -fno-rtti,避免引入不可控的 libcxxabi 依赖
  • 链接时不能带 -lstdc++,audit 库运行在 libc 初始化之前,std::string / iostream 会崩溃
  • 示例最小骨架:
    extern "C" {
    unsigned int la_version(unsigned int v) { return LAV_VERSION; }
    uint32_t la_objopen(uintptr_t *cookie, const char *file, uintptr_t *loadaddr, uint32_t *type) {
        write(2, "loaded: ", 8);
        if (file) write(2, file, strlen(file));
        write(2, "\n", 1);
        return LA_FLG_BINDTO | LA_FLG_BINDFROM;
    }
    }

    为什么设置了 LD_AUDIT 却没看到输出?

    最常见原因是权限或路径问题:audit 库必须有可执行权限,且不能依赖其他未预加载的 SO;另外,LD_AUDIT 不继承给子进程,system() 或 fork+exec 启动的程序不会自动带上它。

    • 确保 audit 库是 chmod +x 的,并用绝对路径指定:LD_AUDIT=/abs/path/to/audit.so ./a.out
    • 目标程序不能是 setuid/setgid,否则 LD_AUDIT 被内核忽略(安全限制)
    • 用 readelf -d ./a.out | grep NEEDED 确认它确实依赖动态链接器(即不是静态链接的 musl 或 staticx 打包产物)
    • 若用 GDB 调试,LD_AUDIT 会被绕过——GDB 自己接管了加载流程,得用 set exec-wrapper /path/to/ld-linux.so --audit /path/to/audit.so

    audit 的时机非常早,早于 main,也早于大多数日志框架初始化。想确认它是否跑起来,最靠谱的方式是用 strace -e trace=openat,open,write 看有没有你的 write 系统调用出现。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7519

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

569

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1698

6

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

2023.06.30

12919

10

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.23

1346

5

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

884

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1986

14

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

2023.06.20

948

5

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.28

1029

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习