cancel
Showing results for 
Search instead for 
Did you mean: 

Position independent Code, for STM32L476 using Keil MDK-ARM Professional 5.42.0.0 and armclang 6.23/6.19/5.06

AdrianBWeissman
Associate

Hi,
I am trying to create a binary image that can be run from either 0x08010000 of 0x08044000 in a STM32L476 Processor using the Keil MDK-ARM 5.42.0.0 Development environment with the armclang 6.23/6.19/5.06 (Options I have tried) compiler.
I am unable to find detailed documention on how to make this work.
I have found a trivial project guidelines that does not really include any of the sections needed in the scatter file.
here is the trivial example: https://developer.arm.com/documentation/100748/0624/Mapping-Code-and-Data-to-the-Target/Bare-metal-Position-Independent-Executables?lang=en

However, this is not detailed at all and does not describe what is and what is not supported in Compiler 6.23/6.19/5.06

Here is what I have tried with 6.23:
C/C++(AC6) flags: -fbare-metal-pie,
Asm flags: -fbare-metal-pie <--- argument ununsed during compilation
Linker flags: --bare_metal_pie.
When I do this, I see the following linker warnings/errors:

linking...
.\OBJ\ELSA-16T_Application.axf: Warning: L6083W: Use of the --scatter option with the --pie option is experimental
.\OBJ\ELSA-16T_Application.axf: Warning: L6320W: Ignoring --keep command. Cannot find argument '__arm_relocate_pie_'.
.\OBJ\ELSA-16T_Application.axf: Error: L6218E: Undefined symbol __RW_BASE (referred from startup_stm32l476xx.o).
.\OBJ\ELSA-16T_Application.axf: Error: L6218E: Undefined symbol __arm_relocate_pie_ (referred from anon$$obj.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.

The first warning I am sure was put in for a reason. Use of the --scatter option with the --pie option is experimental. i.e. Your on your own.
The undefined symbol __RW_BASE comes from the startup_stm32l476xx.s where I do this:
IMPORT __RW_BASE
LDR R9, =__RW_BASE
Just before LDR RO, =__main.

The simple scatter file shown in the example link above does not explain how to put __arm_relocate_pie_ into a scatter file.
The next option I tried was also with Compiler 6.23

C/C++(AC6) flags: -fropi -frwpi
Asm flags: -fropi -frwpi
Linker flags: --ropi --rwpi

I have the linker flags with and without --ropi --rwpi.
The only difference is if I get the warnings about --ropi and --rwpi.

linking...

.\OBJ\XXXXX.axf: Warning: L6914W: option ropi ignored when using --scatter.

.\OBJ\XXXXX.axf: Warning: L6914W: option rwpi ignored when using --scatter.

.\OBJ\XXXXX.axf: Error: L6640E: PDTTable section not least static data address, least static data section is .cmis_i2c_table0

Not enough information to list image symbols.
Finished: 1 information, 2 warning and 1 error messages.
".\OBJ\XXXXX.axf" - 1 Error(s), 64 Warning(s).

I have tried adding an attached pdt_marker.c to get the .r9base sections.
With or without the pdt_marker in my scatter file I still get the dreaded error L6640E:

linking...
.\OBJ\XXXXX.axf: Error: L6640E: PDTTable section not least static data address, least static data section is .cmis_i2c_table0
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 1 error messages.

".\OBJ\XXXXX.axf" - 1 Error(s), 62 Warning(s).
Target not created.

I also tried the same strategies on the armclang version 6.11 and 5.06 with similar results using slightly different arguments.
What I would really like is some advice on the best way to make a position independent executable that relocates its vectors to a spot in ram. I have the relocation of the vectors in ram working, I just cannot for the life of me figure out how to get this compiler to use the R9 base ( register R9 ) to make relative jumps and addresses.

Detailed documentation would also be greatly appreciated.
Thanks in advance for any help.

Adrian

1 ACCEPTED SOLUTION

Accepted Solutions
mƎALLEm
ST Employee

Hello,

I don't think this is the correct forum to ask that question. Did you ask that question in ARM community?

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.

View solution in original post

1 REPLY 1
mƎALLEm
ST Employee

Hello,

I don't think this is the correct forum to ask that question. Did you ask that question in ARM community?

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.