Archive (library) which overrides syscalls from toolchain's archive?
Freddie Chopin
freddie.chopin@gmail.com
Fri Sep 25 06:52:00 GMT 2015
Hi!
I'm trying to archive the majority of my RTOS project (
https://github.com/DISTORTEC/distortos ) as a static library. It works with
every single source/object file except for the files where I override (or
provide) newlib's syscalls (
https://github.com/DISTORTEC/distortos/blob/master/source/syscalls/sbrk_r.cpp
or
https://github.com/DISTORTEC/distortos/blob/master/source/syscalls/syscallsStubs.cpp
). The toolchain I am using is targeting ARM microcontrollers (arm-none-
eabi-). Newlib's syscalls are functions like _sbrk_r(), _write_r(), _open_r()
that are used internally by various other functions (malloc(), printf(),
fopen(), ...). There are maybe a dozen syscalls that need to be overridden.
If I link with my syscalls files as objects (not archived) and the archive
with rest of the code, then everything is fine - my own syscalls get
precedence and replace the stubs from the toolchain's archives.
If I want to link with my syscalls archived I get the following error:
> /home/freddie/gcc-arm-none-eabi-4_9-150626/bin/../lib/gcc/arm-none-eabi/4.9.
> 3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libg.a(lib_a-signalr.o): In
> function `_kill_r':
> /home/freddie/bleeding-edge-toolchain/src/newlib/newlib/libc/reent/signalr.
> c:61: undefined reference to `_kill'
> /home/freddie/gcc-arm-none-eabi-4_9-150626/bin/../lib/gcc/arm-none-eabi/4.9
> .3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libg.a(lib_a-signalr.o): In
> function `_getpid_r':
> /home/freddie/bleeding-edge-toolchain/src/newlib/newlib/libc/reent/signalr.
> c:96: undefined reference to `_getpid'
> /home/freddie/gcc-arm-none-eabi-4_9-150626/bin/../lib/gcc/arm-none-eabi/4.9
> .3/../../../../arm-none-eabi/lib/armv7e-m/fpu/libg.a(lib_a-sbrkr.o): In
> function `_sbrk_r':
> /home/freddie/bleeding-edge-toolchain/src/newlib/newlib/libc/reent/sbrkr.c:
> 58: undefined reference to `_sbrk'
> collect2: error: ld returned 1 exit status
The problem is that my own _sbrk_r() from the archive is discarded and the
function from libg.a is used (a stub for _sbrk())... Is there any (possibly
simple and generic) way to solve it? Maybe I'm missing some command line
switch or a command in linker script? I've tried grouping (via command line
and in linker script) or forcing _sbrk_r() to be initially undefined with
EXTERN(_sbrk_r) in the linker script, but this didn't change much. However - I
might have done something wrong...
It works if I explicitly call any of the functions from the code that is
linked as objects (so not from any source that goes into the archive), but
that can hardly be considered a solution...
Basically I'm looking for a way to just force some functions to be taken from
designated archive.
Thanks in advance for any help!
Regards,
Freddie Chopin
More information about the Binutils
mailing list