为`newlib-nano`提供`malloc`实现

uqdfh47h  于 2023-05-06  发布在  其他
关注(0)|答案(2)|浏览(197)

我想为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中搜索了一个“从静态库中排除对象文件”选项,试图排除libc_nano.a(liba-malloc.o),但没有成功。请注意,编译器正在拉入这个目标文件,我无法访问编译器的libc_nano.a,无法使用自己的目标文件修补liba-malloc.o
不管怎样,我是错过了什么,还是我想实现的目标不可能实现?

wwtsj6pe

wwtsj6pe1#

liba-malloc.o可能包含其他分配器函数定义,如callocfreerealloc等。并且因此由于对它们中的一个的引用而被拉入以进行链接。您可以通过ld-t选项看到这一点(当链接使用-Wl,-t时,在gcc命令行上传递-Wl,-t)。如果是这种情况,您可以通过确保自己提供了所有这些函数的定义来避免链接它。
一个更好的想法可能是通过使用不同的strftime来摆脱malloc依赖性。对于strftime来说,调用malloc是相当荒谬的,尤其是面向嵌入式的实现;它没有基本的需要,我有点困惑,他们是如何找到一种方法,使malloc有用的。除了与locale的一些关联可以相当容易地摆脱之外,musl libc's strftime.c(披露:author=me)是非常独立的,可能可以作为一个直接的替代品。

tyg4sfes

tyg4sfes2#

ST提供的libc.a并不弱,因此不能简单地替换其中的对象。您必须首先使用objcopy削弱它,如www.example.com论坛上所述eevblog.com

相关问题