I have a working prototype of position independent code, where I can copy my binary to any location in flash, and jump to it.
While testing my app on different locations I ran into an issue. When I only deploy "app2" (thus, I do not write the app to flash on the originally linked location, but I upload the app to some offset location), then my application crashes as soon as it calls `__libc_init_array()` in startup code.
When I upload the app on the originally linked location, and again make my bootloader jump to app2, then it works fine.
So it seems that "libc_nano.a" isn't suitable for position independent code. I have the following library dependencies (taken over from the initially generated linker script by mcuxpresso)
GROUP (
"libgcc.a"
"libc_nano.a"
"libstdc++_nano.a"
"libm.a"
"libcr_newlib_nohost.a"
"crti.o"
"crtn.o"
"crtbegin.o"
"crtend.o"
)
The c runtime object files are compatible for both pic and non pic, I understand from reading this oracle page.
When I comment the line `__libc_init_array()` in my startup code, my app2 starts fine, even without having app1 available in flash. So I am sure the only problematic line is this one.
Is there a solution for this? Should I compile libc_nano myself with -fpic? And if that's the way to go, where do I find the sources of the libraries nxp is providing me here? I found this github repo, but not sure if you compiled it from these sources.
I managed to workaround the first issue by copying the implementation of `__libc_init_array` from picolib. The next call I do towards libc_nano, will hard fault the application again.
Is there something I need to do specifically for the included libs? Are they linked against the .got automatically? Can you share an example please?
Ran into this question, it seems to confirm my hypothesis that libc_nano is not compiled with -fpic.
I think I need help to obtain or compile libc_nano with -fpic.