Position independent code libgcc, libc_nano, libstdc++, libm, etc

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Position independent code libgcc, libc_nano, libstdc++, libm, etc

923 Views
bp1979
Senior Contributor I

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. 

 

0 Kudos
2 Replies

892 Views
bp1979
Senior Contributor I

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?

0 Kudos

911 Views
bp1979
Senior Contributor I

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. 

0 Kudos