为 newlib-nano 提供一个 malloc 实现

Providing a `malloc` implementation for `newlib-nano`

我想为 newlib-nano 提供 malloc 的实现,当它与 gcc 一起使用时。在我的情况下,我有一些源文件,比如 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 中搜索了 "exclude object file from static library" 选项以尝试排除 libc_nano.a(liba-malloc.o) 但没有成功。请注意,编译器正在引入此目标文件,而我无权访问编译器的 libc_nano.a 以使用我自己的目标文件修补 liba-malloc.o

无论如何,我是否遗漏了什么,或者我无法实现我想要实现的目标?

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

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