glibc 已弃用的 __malloc_hook 功能的替代方案

2024-04-26

我正在为 C 编写一个内存分析器,并为此拦截对malloc, realloc and free通过 malloc_hooks 函数。不幸的是,这些已被弃用,因为它们在多线程环境中表现不佳。我找不到描述实现相同目标的替代最佳实践解决方案的文档,有人可以启发我吗?

我读过一个简单的#define malloc(s) malloc_hook(s)可以解决这个问题,但这不适用于我想要的系统设置,因为它对原始代码库的侵入太大,不适合在分析/跟踪工具中使用。对于任何像样的分析器来说,必须手动更改原始应用程序代码都是一个杀手。最佳情况下,我正在寻找的解决方案应该通过链接到可选的共享库来启用或禁用。例如,我当前的设置使用一个声明为的函数__attribute__ ((constructor))安装拦截malloc hooks.

Thanks


在尝试了一些事情之后,我终于弄清楚了如何做到这一点。

首先,在glibc, malloc被定义为弱符号,这意味着它可以被应用程序或共享库覆盖。因此,LD_PRELOAD不一定需要。相反,我在共享库中实现了以下函数:

void*
malloc (size_t size)
{
  [ ... ]
}

由应用程序调用而不是glibcs malloc.

现在,相当于__malloc_hook的功能,仍然缺少一些东西。

1.) 调用者地址

除了原来的参数malloc, glibcs __malloc_hooks还提供了调用函数的地址,实际上就是where的返回地址malloc会回到。为了达到同样的目的,我们可以使用__builtin_return_addressgcc 中可用的函数。我没有研究过其他编译器,因为无论如何我都仅限于 gcc,但是如果您碰巧知道如何可移植地执行此类操作,请给我留言:)

Our malloc函数现在看起来像这样:

void*
malloc (size_t size)
{
  void *caller = __builtin_return_address(0);
  [ ... ]
}

2.) 访问glibcs malloc 从你的钩子中

由于我的应用程序仅限于 glibc,因此我选择使用__libc_malloc访问原始的 malloc 实现。或者,dlsym(RTLD_NEXT, "malloc")可以使用,但该函数使用可能存在陷阱calloc第一次调用时,可能会导致无限循环,从而导致段错误。

完整的 malloc 钩子

我的完整挂钩函数现在如下所示:

extern void *__libc_malloc(size_t size);

int malloc_hook_active = 0;

void*
malloc (size_t size)
{
  void *caller = __builtin_return_address(0);
  if (malloc_hook_active)
    return my_malloc_hook(size, caller);
  return __libc_malloc(size);
}

where my_malloc_hook看起来像这样:

void*
my_malloc_hook (size_t size, void *caller)
{
  void *result;

  // deactivate hooks for logging
  malloc_hook_active = 0;

  result = malloc(size);

  // do logging
  [ ... ]

  // reactivate hooks
  malloc_hook_active = 1;

  return result;
}

当然,钩子calloc, realloc and free工作方式类似。

动态和静态链接

有了这些函数,动态链接就可以开箱即用。链接包含 malloc 挂钩实现的 .so 文件将导致所有调用malloc来自应用程序以及所有要通过我的钩子路由的库调用。但静态链接是有问题的。我还没有完全理解它,但在静态链接中 malloc 不是一个弱符号,导致链接时出现多重定义错误。

如果您出于某种原因需要静态链接,例如通过调试符号将第 3 方库中的函数地址转换为代码行,那么您可以静态链接这些第 3 方库,同时仍然动态链接 malloc 挂钩,从而避免多重定义问题。我还没有找到更好的解决方法,如果你知道,请随时给我留言。

这是一个简短的例子:

gcc -o test test.c -lmalloc_hook_library -Wl,-Bstatic -l3rdparty -Wl,-Bdynamic

3rdparty将被静态链接,同时malloc_hook_library将动态链接,从而产生预期的行为以及函数的地址3rdparty可通过调试符号进行翻译test。很整洁,是吧?

结论

上面的技术描述了一种未弃用的、几乎等效的方法__malloc_hooks,但有一些明显的限制:

__builtin_caller_address仅适用于gcc

__libc_malloc仅适用于glibc

dlsym(RTLD_NEXT, [...])是一个 GNU 扩展glibc

链接器标志-Wl,-Bstatic and -Wl,-Bdynamic特定于 GNU binutils。

换句话说,这个解决方案是完全不可移植的,如果要将钩子库移植到非 GNU 操作系统,则必须添加替代解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

glibc 已弃用的 __malloc_hook 功能的替代方案 的相关文章

  • 为什么 -march=native 很少使用?

    对于大多数 C C 编译器 有一个可传递给编译器的标志 march native 它告诉编译器调整为主机 CPU 的微架构和 ISA 扩展生成的代码 即使它的名称不同 基于 LLVM 的编译器通常也有一个等效的选项 例如rustc or s
  • Bazel:为 cc_binary/cc_test 设置运行时环境变量和配置文件位置

    我正在尝试在 Linux 上的 C 应用程序中使用 odbc 以下构建文件用于将库作为外部依赖项包含在内 licenses notice cc library name lib srcs lib libodbc so lib64 libod
  • 计算 .NET Core 项目的代码指标?

    我正在研究 ASP NET Core 和 NET Core 项目 对于经典的 C 项目 Visual Studio 2015 具有计算代码指标的功能 对于 NET Core 预览版 2 工具中缺少支持 在工具更加完整之前 有人知道解决方法吗
  • SQL Server 将 SP_EXECUTESQL 识别为对象而不是过程名称

    我在用DBContext Database SqlQuery
  • 下载文件并自动保存到文件夹

    我正在尝试制作一个用于从我的网站下载文件的用户界面 该站点有 zip 文件 需要将这些文件下载到用户输入的目录中 但是 我无法成功下载该文件 它只是从临时文件夹中打开 Code private void webBrowser1 Naviga
  • 屏幕截图忽略了一些窗口

    我正在 MFC 中工作 我正在尝试捕获桌面的 bmp 我正在使用 GetDC NULL 来执行此操作 但它似乎忽略了特殊的皮肤窗口 它似乎忽略了用 UpdateLayeredWindow 绘制的窗口 此行为似乎仅发生在 Vista x64
  • K&R 练习 1-9 (C)

    编写一个程序将其输入复制到 它的输出 替换每个字符串 一个或多个空格乘以一个空格 我假设他的意思是输入类似 We 空白 空白 空白 go blank to 空白 空白 空白 the blank mall 并输出如下 We blank go
  • recvfrom() 中的 addrlen 字段有何用途?

    我在程序中使用 recvfrom 从我在 src addr 中指定的服务器获取 DGRAM 数据 但是 我不确定为什么需要初始化并传入addrlen 我读了手册页 但不太明白它的意思 如果src addr不为NULL 并且底层协议提供了源地
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • Xamarin 没有安装的配置文件与安装的 iOS 签名身份匹配

    我想知道是否可以在 ios 设备上编译 Xamarin 应用程序 使用 Visual Studio for mac 而无需成为开发人员 费用为 99 美元 年 因为当我尝试在 iPhone 上构建项目时出现此错误 Xamarin iOS C
  • 比较两个constexpr指针不是constexpr吗?

    我正在寻找一种在编译时将类型映射到数值的方法 理想情况下不使用中建议的哈希this https stackoverflow com a 36122101 2173029 answer 由于指针可以是constexpr 我尝试过这个 stru
  • HttpClient 响应未刷新

    我正在使用 HttpClient 与 Web 服务进行通信以进行发送 接收 JSON 格式的响应 但我在接收数据时遇到一些问题 我每 5 分钟调用一次 Web 服务 使用 HttpClient 刷新 Windows Phone 上的内容 但
  • 为什么超过44个字符时打印随机符号

    我正在从 C 编程 现代方法 一书中学习 C 现在我正在进行有关数组的练习 练习之一是编写一个过滤器 以不同的方式打印输入消息 到目前为止 参见下面的代码 一切正常 直到字符数超过 44 然后它打印随机符号 如果字符数低于 44 则一切正常
  • 无法访问类“std::basic_ios<_Elem,_Traits>”中声明的私有成员

    此特定方法有问题 不知道如何解决 我收到的错误是上面的 错误 C2248 std basic ios basic ios 不能 访问类中声明的私有成员 std basic ios C Program Files Microsoft Visu
  • 如何在 [Authorize(Roles="")] 中使用变量

    我有一个 MVC 5 C Intranet Web 应用程序 其中使用了 30 多个 Active Directory 角色 并且由于业务文化的原因 权限经常发生变化 为了让事情变得简单 我想我应该尝试这样的事情来确定谁可以访问控制器操作或
  • 尝试映射大页面 (1GB) 时 mmap 失败

    我做了什么 使用 root 启用大页 我的系统支持 1MB 大页 echo 20 gt proc sys vm nr hugepages 将大页文件系统挂载到 mnt hugepages mount t hugetlbfs nodev mn
  • 在没有窗口的情况下从 C# 运行命令行并获取输出[重复]

    这个问题在这里已经有答案了 我正在尝试从 C 运行命令行脚本 我希望它在没有 shell 的情况下运行并将输出放入我的字符串输出中 它不喜欢 p StartInfo 行 我究竟做错了什么 我没有运行像 p StartInfo FileNam
  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • 如何将资源文件添加到 Visual Studios 以便在“选择资源”对话框中可见?

    在 Visual Studio 中 您可以使用 GUI 编辑器 又名 设计器 编辑按钮控件的图像 我想将我的资源分成两部分 resx文件放置在项目的 Properties 文件夹中 我的问题是 Visual Studio 中的 选择资源 对
  • 在 PCL 中使用 System.Net.Sockets(.Net 4.5 + 电话 8)

    我现有的 Net 库已经适用于 Net 4 5 和 Windows Phone 8 现在我想将其转换为可移植类库 突然我无法使用System Net Sockets不再了 我只检查了 Net 4 5和Windows Phone 8 未选择X

随机推荐

  • 如何使用Python和Pandas在时间翻转时添加24小时

    我必须分析一些日志 并基于此 我必须计算一些东西 但我坚持了一件事 在这里 我尝试以简单的形式重新创建我的问题 假设我有以下日志 堆栈溢出 txt file 23 58 03 458 23 58 13 446 23 58 23 447 23
  • Visual Studio 网站中的项目设置实际存储在哪里?

    在 VS2010 中使用网站 而不是 Web 应用程序 因此没有 csproj 文件 右键单击解决方案资源管理器中的 站点 节点并选择 属性页 会弹出一个对话框 其中包含 引用 生成 辅助功能 启动选项 MSBuild 选项 和 Silve
  • 下载 VSTS 附件

    有人知道如何使用 C 库检索附件 ID 并从 VSTS 下载 WorkItem 附件吗 我已经审查了附件样本 https github com Microsoft vsts dotnet samples blob master Client
  • Symfony ArrayCollection 与 PersistentCollection

    据我了解 当您通过存储库查询数据库时 您会得到 PersistentCollection 而当您使用实体时 您会得到 ArrayCollection 因此 考虑到我的用户实体有一对多的自引用关系 在我的用户实体中 我有一个 setChild
  • WPF 中的多列树视图 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道我在哪里可以获得 WPF 中的多列树视图之类的控件吗 夏普开发 http www icshar
  • Xalan XSLT 多个输出文件?

    我只是想知道 是否可以使用 Xalan 将单个输入 XML 文件的处理输出到多个其他文件 我不一定必须这样做 我知道我可以使用其他工具来做到这一点 如 Saxon 和 或我可以处理不同的文件以获得不同的输出 我只是想知道我必须使用哪些选项来
  • 无法计算表达式 - Visual Studio 调试模式

    当尝试单步执行代码并使用 Visual Studio 中的立即窗口或监视窗口时 我不断收到以下信息 无法评估表达式 我正在使用 Visual Studio 2008 搜索论坛 有很多关于使用重载的 Response Redirect 并将
  • 如何确定单元测试的测试用例?

    我刚刚开始单元测试 并编写了一些简短的测试来检查名为 isPrime 的函数是否正常工作 我有一个测试来检查该函数是否正常工作 并有一些数字和预期返回值形式的测试数据 我应该测试多少 我如何决定测试哪个 这里的最佳实践是什么 一种方法是生成
  • 从另一个 Java 小程序访问 Java 小程序

    Web 应用程序使用 Java 小程序 该小程序将用户提交的密码存储在私有属性中 并在多个公共方法中使用该属性 我想知道从相同或不同网站加载的另一个 Java 小程序是否可以调用该小程序的方法或可能访问包含密码的私有属性 不同的小程序是在相
  • 当您在 REST 中需要更多动词时该怎么办

    还有一个类似的question https stackoverflow com questions 2001773 understanding rest verbs error codes and authentication对我来说 但讨
  • “node-sass”用法已弃用,并将在未来的主要版本中删除

    当我从 Angular 升级时8 to 11我面临这个警告 node sass 用法已弃用 并将在未来的主要版本中删除 要选择退出已弃用的行为并开始使用 sass 请卸载 node sass 谁能帮我提前致谢 完整的错误消息是 node s
  • .Net Core 本地化视图:Linq 表达式中的 IViewLocalizer

    我正在 net core 中编写 mvc 应用程序 我遇到本地化问题 我不知道如何将 IViewLocalizer 添加到我的网格视图中 这是我的代码 using NonFactors Mvc Grid using Microsoft As
  • 流星刀片模板在 for 循环中抛出“同一分支中的第二个地标”异常

    我有一个 for 循环 我想在其中包含模板视图 表 刀片 game h1 table name if table playerSitting a btn btn danger stand href Stand table for var i
  • 如何使用 google-apps-script 以 Google 表单导入“文件上传”模块

    I am able to create a small google form using google apps script Which includes texts radio buttons etc But how to inclu
  • 身份框架用户锁定

    我尝试在 3 次登录尝试失败后锁定用户登录 5 分钟 我已将这 3 行添加到App Start IdentityConfig cs public static ApplicationUserManager Create method man
  • Keras 使用 mask 冻结特定权重

    我是 Keras 的新人 我想实现一个并非所有权重都会更新的层 例如 在下面的代码中 我想要dilation图层将以某些中心权重永远不会更新的方式进行更新 例如 每个特征矩阵 共 1024 个 的形状dilation层是448 448和一块
  • 是否有与 :hover 相反的 CSS 伪类?

    CSS中有没有伪类来指定 not hover 或者这是指定未悬停的项目的唯一方法 我浏览了几个 CSS3 参考资料 但没有看到任何提及 CSS 伪类来指定 hover 的相反内容 是的 使用 not hover child not hove
  • 使用Bundle传递数据时出现空指针异常

    我有一个浮点数组camObjCoord宣告为 public static float camObjCoord new float 8000 然后我在一个类中填充它的索引 该类执行如下操作 camObjCoord 1 2 5 然后我打电话ma
  • 更改 UIWebView 的文本颜色

    我正在制作一个 epub 阅读器 我将 HTML 页面加载到其中webview webview loadRequest NSURLRequest requestWithURL NSURL fileURLWithPath pagesPath
  • glibc 已弃用的 __malloc_hook 功能的替代方案

    我正在为 C 编写一个内存分析器 并为此拦截对malloc realloc and free通过 malloc hooks 函数 不幸的是 这些已被弃用 因为它们在多线程环境中表现不佳 我找不到描述实现相同目标的替代最佳实践解决方案的文档