I'd like to provide an implementation of malloc
for newlib-nano
when using it with gcc
. In my situation, I have some source file, say main.c
, that calls strftime
. The newlib-nano
implementation of strftime
uses malloc
. In a header file, my_memory.h
, I've declared a function void *malloc(size_t size)
and provided an implementation in a corresponding my_memory.c
file.
When linking the project using gcc
, the linker fails at .../libc_nano.a(liba-malloc.o)
because of multiple definitions of malloc
. The behavior I'd like is for the linker to take my implementation of malloc
rather than pulling newlib-nano
's, but to retain using newlib-nano
's implementation of other standard library functions, e.g. memset
.
I've searched around for an "exclude object file from static library" option in gcc to try to exclude libc_nano.a(liba-malloc.o)
but with no luck. Note that the compiler is pulling in this object file and I don't have access to the compiler's libc_nano.a
to patch liba-malloc.o
with my own object file.
Anyway, am I missing something, or is it not possible to achieve what I'm trying to achieve?
Likely liba-malloc.o
contains other allocator function definitions like calloc
, free
, realloc
, etc. and thus is getting pulled in for linking because of references to one of them. You can see this with the -t
option to ld
(pass -Wl,-t
on gcc
command line when linking to use it). If this is the case, you can avoid linking it just by ensuring you've provided definitions of all these functions yourself.
A better idea might be getting rid of the malloc
dependency by using a different strftime
. It's rather ridiculous for strftime
, especially an embedded-oriented implementation, to be calling malloc
; it has no fundamental need to and I'm somewhat baffled how they found a way to make malloc
useful to it. Aside from some tie-in with locale which could be extricated fairly easily, musl libc's strftime.c
(disclosure: author=me) is very self-contained and could probably serve as a drop-in replacement.