为 newlib-nano 提供一个 malloc 实现
Providing a `malloc` implementation for `newlib-nano`
我想为 newlib-nano
提供 malloc
的实现,当它与 gcc
一起使用时。在我的情况下,我有一些源文件,比如 main.c
,调用 strftime
。 strftime
的 newlib-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
包含其他分配器函数定义,如 calloc
、free
、realloc
等,因此由于对一个的引用而被拉入链接他们中的。您可以通过 ld
的 -t
选项看到这一点(链接时在 gcc
命令行上传递 -Wl,-t
以使用它)。如果是这种情况,您可以通过确保自己提供了所有这些函数的定义来避免链接它。
一个更好的主意可能是通过使用不同的 strftime
摆脱 malloc
依赖。 strftime
,尤其是面向嵌入式的实现,调用malloc
是相当荒谬的;它没有基本的需要,我有点困惑他们是如何找到一种方法让 malloc
对它有用的。 musl libc's strftime.c
(披露:作者=我)除了可以很容易地从语言环境中解脱出来之外,它是非常独立的,可以作为一个替代品。
我想为 newlib-nano
提供 malloc
的实现,当它与 gcc
一起使用时。在我的情况下,我有一些源文件,比如 main.c
,调用 strftime
。 strftime
的 newlib-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
包含其他分配器函数定义,如 calloc
、free
、realloc
等,因此由于对一个的引用而被拉入链接他们中的。您可以通过 ld
的 -t
选项看到这一点(链接时在 gcc
命令行上传递 -Wl,-t
以使用它)。如果是这种情况,您可以通过确保自己提供了所有这些函数的定义来避免链接它。
一个更好的主意可能是通过使用不同的 strftime
摆脱 malloc
依赖。 strftime
,尤其是面向嵌入式的实现,调用malloc
是相当荒谬的;它没有基本的需要,我有点困惑他们是如何找到一种方法让 malloc
对它有用的。 musl libc's strftime.c
(披露:作者=我)除了可以很容易地从语言环境中解脱出来之外,它是非常独立的,可以作为一个替代品。