【发布时间】:2020-09-24 23:09:23
【问题描述】:
我有一个只有标头的库,目前正在调用 malloc 和 free
这个头文件包含在许多不同的静态库中,用于构建不同配置的程序。
我希望能够在链接时将这些调用替换为对另一个分配器的调用——基于该分配器库是否包含在链接步骤中,而不影响对malloc 和free 的其他调用。
我的想法是让库调用 customizable_malloc 和 customizable_free 并让这些符号“默认”解析为 malloc 和 free - 然后分配器库可以为 customizable_malloc 和customizable_free
但是,我搞砸了 weak/alias/weakref 属性,我似乎无法让任何工作。有没有办法做到这一点?
注意:我知道我可以创建一个额外的间接层:customizable_malloc 可能是调用 malloc 的函数的弱别名。但这增加了一个似乎不必要的间接级别。
理想情况下,这是我希望链接器在遇到可定制的_malloc 调用时采取的步骤:
- 检查 Customized_malloc 的定义是否存在
- 如果有,请调用它
- 如果不是,则将调用视为对常规 malloc 的调用。
澄清说明:在单一目标场景中,这可以通过#define 完成。该库可以创建默认为malloc 和free 的宏customizable_malloc 和customizable_free。但是,这在这种情况下不起作用,因为在不知道是否存在覆盖的情况下将内容构建到静态库中。
【问题讨论】:
-
in the link step只需与您自己的malloc实现链接即可。但还有更多,请阅读overwriting malloc from glibc。 -
@KamilCuk 问题是我不想全局覆盖 malloc 和 free - 我想专门改变这个库的行为。 (其中的原因真的不值得探讨)。
-
然后你必须重命名它们,例如
customizable_*。那么奇怪的是你不能让它与弱符号一起工作(很可能你遇到了在解析弱符号时静态库的顺序很重要的情况,对-Wl,--whole-archive感兴趣)。然后请提供minimal reproducible example。一个真正简单的方法是使用静态函数指针。