繁体   English   中英

当不同的对象文件使用不同的malloc实现时会发生什么

[英]What happens when different object files use different malloc implementations

我有一些问题。

  1. 假设程序是使用2个目标文件编译的。 每个人在大多数功能中都使用malloc和free。 但是这些目标文件是在不同时间生成的,并且碰巧使用了不同的malloc实现。 假设实现共享变量名和函数名。 该程序能否正常运行? 为什么?

  2. 如果程序具有目标文件1和2,则目标文件1中的代码调用malloc并分配一些内存,然后释放它。 现在,来自目标文件2的代码将调用malloc。 它可以使用已释放的内存吗? 它在下面如何工作?

试图提供一个有用的答案,尽管还远远没有完成。

第1部分。

  • 首先,将程序与malloc共享函数名的两种实现链接起来非常困难:重复定义通常会导致链接器错误。 我可以看到我们如何使用GNU binutils做到这一点,其他工具链可能也有一些等效的技巧。 对于其余的答案,让我们假设我们成功地链接了两个实现。 (获得链接器错误而不是混合两个实现,这通常是一件好事,甚至可能引入几乎没有机会工作的malloc / free不对称)。

  • 我们还假设分配给一个特定实现的内存始终使用同一个实现中的free释放。 否则,几乎可以保证它会失败。

  • 当本地堆空间不足时,这两种实现可能一起工作,也可能会干扰,这取决于它们如何从OS请求更多内存。 MS Windows具有一个用于管理堆的系统接口,并且可能在其之上构建两个不同的malloc 然后没有什么可以阻止他们一起工作。 如果它们都准备好让其他人独立于malloc来请求sbrk增加,则通过sbrk的调用请求内存的实现将一起工作。 我希望glibc中的malloc不会在这里失败,但是我不确定。

第2部分。

如果对象1使用的实现能够将内存返回给OS,则对象2调用的实现可以重用内存。也就是说,内存重用可能会发生,但是比使用单个实现的可能性要小。

将内存返回给OS的可能性取决于malloc / free的实现,还可能取决于分配的块大小和各种系统设置。 例如,glibc对大块内存使用匿名mmap ,并且释放时这些块不会被映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM