讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

Seko
Seko

AI短剧一键生成成片

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

落杰酱_5194

落杰酱_5194

发布时间:2026-03-30 15:45:31

|

1017人浏览过

|

来源于php中文网

原创

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,不加修饰就会链接失败。

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

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

下载

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

  • 所有 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++

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

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
string转int
string转int

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

7519

2023.08.02

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

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

569

2023.09.22

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

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

1698

2024.03.01

cookie
cookie

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

12919

2023.06.30

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

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

1346

2023.11.23

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

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

884

2024.02.23

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

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

1986

2025.08.19

printf用法大全
printf用法大全

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

948

2023.06.20

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn