包装第三方库 libA.a 的 malloc 调用,但不适用于 libB.a

Posted

技术标签:

【中文标题】包装第三方库 libA.a 的 malloc 调用,但不适用于 libB.a【英文标题】:Wrap calls to malloc for third party library libA.a, but not for libB.a 【发布时间】:2015-07-30 14:15:52 【问题描述】:

假设您有目标文件 main.o 和两个外部第三方静态库 libA.a 和 libB.b。你想把它们联系在一起。但是您想包装从 libA.a 对 malloc 的调用(将 malloc 替换为您自己的),但不适用于 libB.a。

你会怎么做?

这是一个有趣的问题,但它可以解决吗?

(为了更有趣,假设它是 c 和 c++ 代码的混合:))

编辑 1:

为了让事情更清楚。我将向您展示如何为这两个库完成此操作:

gcc -static -Wl,--wrap=malloc -o main.out main.o mem.o -lA -lB

这里的 mem.o 文件包含函数 __wrap_malloc 的代码。但这将导致两个库都使用自定义 malloc。 问题是,如何让它只对其中一个起作用?

【问题讨论】:

由于库是单独编译的,我想这不会有任何问题。 如果libA存储通过函数指针调用一个函数,该指针指向libB中的一个函数,而该函数调用malloc 由于libAlibB 已经编译,它们包含对CRT 的内存例程的直接调用。你不能覆盖它。您需要重新编译 libA 并使用重载/#define/delegate。 你不会自己编译库。这是两个不相互依赖的第三方库。只是 main.o 取决于它们。 @MateuszGrzejek 如果我不为他们两个都打包对 malloc 的调用,那将很容易。无需重新编译。我会编辑帖子。 【参考方案1】:

我的另一个问题得到了一个很好的答案,更具体。

Wrap malloc but only for some of input files (object and lib)

【讨论】:

以上是关于包装第三方库 libA.a 的 malloc 调用,但不适用于 libB.a的主要内容,如果未能解决你的问题,请参考以下文章

一个弱声明问题

在 Xamarin.iOS 中为 2 个依赖静态库创建绑定

标准库》第三章 包装对象和Boolean对象

malloc,colloc,realloc内存分配,动态库,静态库的生成与调用

给定两个 Linux 静态库,如何判断一个是不是依赖于另一个?

golang cgo 使用总结