我想为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中搜索了一个“从静态库中排除对象文件”选项,试图排除libc_nano.a(liba-malloc.o)
,但没有成功。请注意,编译器正在拉入这个目标文件,我无法访问编译器的libc_nano.a
,无法使用自己的目标文件修补liba-malloc.o
。
不管怎样,我是错过了什么,还是我想实现的目标不可能实现?
2条答案
按热度按时间wwtsj6pe1#
liba-malloc.o
可能包含其他分配器函数定义,如calloc
、free
、realloc
等。并且因此由于对它们中的一个的引用而被拉入以进行链接。您可以通过ld
的-t
选项看到这一点(当链接使用-Wl,-t
时,在gcc
命令行上传递-Wl,-t
)。如果是这种情况,您可以通过确保自己提供了所有这些函数的定义来避免链接它。一个更好的想法可能是通过使用不同的
strftime
来摆脱malloc
依赖性。对于strftime
来说,调用malloc
是相当荒谬的,尤其是面向嵌入式的实现;它没有基本的需要,我有点困惑,他们是如何找到一种方法,使malloc
有用的。除了与locale的一些关联可以相当容易地摆脱之外,musl libc'sstrftime.c
(披露:author=me)是非常独立的,可能可以作为一个直接的替代品。tyg4sfes2#
ST提供的
libc.a
并不弱,因此不能简单地替换其中的对象。您必须首先使用objcopy
削弱它,如www.example.com论坛上所述eevblog.com