[En-Nut-Discussion] CM4: Linking external (crypto) library

Philipp Burch phip at hb9etc.ch
Fri Feb 8 14:54:29 CET 2019


Hi everyone,

I'm on the way to add encryption and signature support to the
tiva_ethloader bootloader (see https://hb9etc.ch/hg/tiva_ethloader/). As
a start, I looked for a suitable crypto library to do the hard work,
which provides support for (symmetric) encryption and (asymmetric)
signature checking. As it is planned right now, there should be no need
for a random number generator on the device, so it really is only a
software thing.

I know that Ethernut already has some kind of crypto library included,
but haven't looked closely at it yet. In the configurator, I see that
AES is mentioned, but haven't seen anything that provides signature
checking (could be RSA-based, or even better some EC cryptography to get
away with shorter keys). Correct me, if I'm wrong. I'll happily use some
existing Ethernut code if it already includes what I need.

Anyway, as the topic suggests, I'm actually trying to get an external
lib included in my code, libsodium
(https://github.com/jedisct1/libsodium) to be exact. Compilation of the
library itself for the arm-none-eabi target is quite easy and gives me
the libsodium.a for inclusion.

Now, when trying to add the library to the bootloader, the linker coughs
because of multiple definitions of fflush() and also due to undefined
references to some underlying functions like _close() and _read():

------- 8< ------- 8< -------

/usr/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libc.a(lib_a-fflush.o):
In function `fflush':
fflush.c:(.text.fflush+0x0): multiple definition of `fflush'
/home/phip/phipsfiles/developing/ethernut/nutinstall-fpm_01b/libnutcrt.a(fflush.o):fflush.c:(.text.fflush+0x0):
first defined here
/usr/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/bin/ld:
section .ARM.exidx LMA [000000000001e0e0,000000000001e0e7] overlaps
section .data LMA [000000000001e0e0,000000000001f1d7]
/usr/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libc.a(lib_a-closer.o):
In function `_close_r':
closer.c:(.text._close_r+0xc): undefined reference to `_close'
/usr/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libc.a(lib_a-readr.o):
In function `_read_r':
readr.c:(.text._read_r+0x12): undefined reference to `_read'
/usr/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libc.a(lib_a-fstatr.o):
In function `_fstat_r':
fstatr.c:(.text._fstat_r+0x10): undefined reference to `_fstat'
/usr/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libc.a(lib_a-isattyr.o):
In function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
/usr/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libc.a(lib_a-lseekr.o):
In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x12): undefined reference to `_lseek'

------- 8< ------- 8< -------

According to the paths, this is because the linker takes code from ARM's
standard library, instead of the one included in Ethernut.

Now the question: How can I find out what symbol triggers the inclusion
of the ARM standard library? And how can I fix this? I already tried
various compiler flags when compiling libsodium, also the ones that are
used when compiling the Ethernut libs or the bootloader itself, but
without luck, the errors stay the same.

I'd be glad for any hints!

Thanks and regards,
Philipp


More information about the En-Nut-Discussion mailing list