How to link stm8.lib?
jxltom opened this issue · 9 comments
Following error is raised when linking with stm8-ld
. It looks like stm8.lib
is not linked. I tried with -L
and -l
options, but stm-ld
reports can not find library.
main.c:201: undefined reference to `___uint2fs'
main.c:206: undefined reference to `___fslt'
main.c:206: undefined reference to `___fslt'
main.c:217: undefined reference to `_(float, short, short, bool __restrict)'
main.c:217: undefined reference to `_(float, short, double, int, void)'
main.c:217: undefined reference to `___fsmul'
main.c:217: undefined reference to `___fs2uint'
main.c:221: undefined reference to `_(float, short, short, bool __restrict)'
main.c:221: undefined reference to `_(float, short, double, int, void)'
main.c:221: undefined reference to `___fsmul'
main.c:221: undefined reference to `___fs2uint'
This issue arises when you do arithmetic operations such as divisions or multiplications, as they rely on functions provided by the compiler. SDCC includes both platform-specific and portable implementations so sdld
includes them on the link phase.
As a quick workaround, you can compile any needed source files corresponding to the portable implementations e.g.: _fsmul.c
using the same compilation flags as stm8-dce-example
and add them into the objects list for stm8-ld
. While the platform-specific implementations are surely more optimized, they are written in assembly using sdas
syntax instead of stm8-as
, so you will need some (minor) modifications to make them work on stm8-as
.
Therefore, should the sdcc-gas
repository be ever merged into upstream, two versions of the assembly code should be then provided: one for sdas
and one for stm8-as
.
Hey @XaviDCR92 many thanks for the clarification!
I've compiled and linked _fs2uinit.c
, _fs2ulong.c
, _fslt.c
, _fsmul.c
, _uint2fs.c
, _ulong2fs.c
and __mulsint2slong.s
(with a little bit modification) to remove most of the errors.
However, following errors still exist. Do you mind telling me which files should I add? Thanks!
.pio/build/default/src/main.o: In function `_ADC_REG':
main:(.text._ADC_REG+0xa0): undefined reference to `_(float, short, short, bool __restrict)'
main:(.text._ADC_REG+0xb0): undefined reference to `_(float, short, double, int, void)'
main:(.text._ADC_REG+0xe6): undefined reference to `_(float, short, short, bool __restrict)'
main:(.text._ADC_REG+0xf6): undefined reference to `_(float, short, double, int, void)
I am not sure what your ADC_REG
function is doing to require such symbols. Moreover, I see their names have a parameter list in them for some reason, but can't tell you why, I'm sorry.
Could you please paste either ADC_REG
or the problematic lines so we can find the root cause of the issue? Thanks a lot.
Thanks for help!
After some digging, I can reproduce the issue with below code. It looks like it is happending when doing arithmetic with float and int and then passing it to a function.
.pio/build/default/src/main.o: In function `_main':
main:(.text._main+0x13): undefined reference to `_(float, short, short, bool __restrict)'
#include "stm8s_adc1.h"
void test_function(uint16_t value) {}
void main(void)
{
uint16_t value = 1.0f - ADC1_GetConversionValue();
test_function(value);
}
The error message is, for some reason, very unfortunate. Please add the following files to the build:
_fsadd.c
_fsdiv.c
_fsmul.c
_fssub.c
Adding them worked for me.
Thanks! It finally working!
It will be nice, If there is a precompiled version of stm8.lib provided for sdcc-gas 😄
If I'm not mistaken, the stm8-binutils-gdb
should be modified to include stm8.lib
, similarly to how libc.a
is included. I should take a look at how to do that.
That will be great! It will be much easier for the linking.
Thanks for the help! I will close this issue since it is actually solved.
I created another issue XaviDCR92/stm8-binutils-gdb#1 to tracking the precompiled stm8.lib feature.