【问题标题】:Providing a `malloc` implementation for `newlib-nano`为`newlib-nano`提供`malloc`实现
【发布时间】:2020-01-31 23:37:11
【问题描述】:

当与gcc 一起使用时,我想为newlib-nano 提供malloc 的实现。在我的情况下,我有一些源文件,比如main.c,它调用strftimestrftimenewlib-nano 实现使用 malloc。在头文件my_memory.h 中,我声明了一个函数void *malloc(size_t size),并在相应的my_memory.c 文件中提供了一个实现。

使用gcc 链接项目时,由于malloc 的多个定义,链接器在.../libc_nano.a(liba-malloc.o) 处失败。我希望链接器采用我的malloc 实现而不是拉newlib-nano 的行为,但保留使用newlib-nano 的其他标准库函数的实现,例如memset.

我在 gcc 中搜索了“从静态库中排除目标文件”选项,试图排除 libc_nano.a(liba-malloc.o),但没有成功。请注意,编译器正在拉入此目标文件,而我无权访问编译器的libc_nano.a 以使用我自己的目标文件修补liba-malloc.o

无论如何,我是错过了什么,还是无法实现我想要实现的目标?

【问题讨论】:

  • 您可以用您的源文件替换他们的源文件,但您的里程可能会有所不同。他们的malloc 很可能更高效、功能更丰富,而且无论如何都是你的。
  • @SSAnne 我无权从libc_nano.a 共享库访问编译器的目标文件,也无权访问源代码,所以我不确定这会如何工作吗?
  • 啊。那你不能。无论如何,手写代码可能更容易出现错误;他们的实现很可能比你的更受考验。

标签: c libc newlib


【解决方案1】:

liba-malloc.o 可能包含其他分配器函数定义,例如 callocfreerealloc 等,因此由于对其中之一的引用而被拉入链接。您可以通过ld-t 选项看到这一点(在链接使用它时在gcc 命令行上传递-Wl,-t)。如果是这种情况,您可以通过确保自己提供所有这些函数的定义来避免链接它。

一个更好的主意可能是通过使用不同的strftime 来摆脱malloc 依赖项。对于strftime,尤其是面向嵌入式的实现,调用malloc 是相当可笑的;它没有基本的需要,我有点困惑他们如何找到一种使malloc 对它有用的方法。除了可以相当容易地摆脱与语言环境的一些搭配之外,musl libc's strftime.c(披露:作者=我)非常独立,可能可以作为替代品。

【讨论】:

  • 谢谢!很好的答案,感谢您在 musl libc 上所做的工作!
猜你喜欢
  • 2018-10-13
  • 2018-03-06
  • 1970-01-01
  • 2015-11-09
  • 2018-11-15
  • 1970-01-01
  • 2012-05-15
  • 2011-07-22
  • 1970-01-01
相关资源
最近更新 更多