This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Issues linking the startup file in a precompiled .lib

Background

On our company, we precompile our platform library into a .lib and provide these library to other developers.
Till the day, we've used the default startup provided in the Standard Peripheral Library from ST.

Goal

We need to allow the user to customize the Stack and Heap Size.

What we have tried

For this example we're using and STM32F103RB(Nucleo Board).


I've tried to split the startup we've been using in two; one will carry the Heap and Stack definitions and the other will be contain the vector definitions.
The file with the vectors definitions(stm32f1_md_vectors.s) will be included in the .lib file and the other will be linked by the Application developer and together with hiw own code and the .lib file.

These are the milestones I propose:

0) Compile the .lib and link it to an application to obtain the map.

1) Split the startup file in two

2) Assemble them and ensure they work together in the same way than the single startup

3) Assemble them and incorporate them into the .lib and ensure it works like point 2)

4) Assemble the vector stm32f1_md_vectors.s and incorporate in the .lib. Assemble the startup.s and link with the application and the .lib 

This is the code I'm using:

Code of the startup.s:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


Code of the stm32f1_md_vectors.s file:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
IMPORT __initial_sp
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


And the scatter:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LR_IROMPROGRAM1 0x08000000 0x1C800 { ; load region size_region
ER_IROM1 0x08000000 0x1C800 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00010000 { ; RW data
.ANY (+RW +ZI)
}
}
LR_IROMDATA1 0x0801F800 0x800 { ; load region size_region
ER_EMPTY1 0x0801F800 EMPTY 0x800 {
;Empty region not zero-initialized in run time
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX



Outcome
2) It works when I compile the files together in a sample project.

3) It succeds in incorporating them in the.lib , but when I try to link them with the application, it seems the RESET area isn't found. This is the linker output:

"..\..\.\output\generated\gf_hal.sct", line 10 (column 9): Error: L6236E: No section matches selector - no section to be FIRST/LAST.
Not enough information to list image symbols.
Not enough information to list the image map.
Finished: 2 information, 0 warning and 1 error messages.
Error: Linker error 1


I attach three maps: the one obtained in the steps 0, 2 and 3.


Tomorrow I'll try to reproduce the steps 2 and 3 with a minimal library(and no propetary code) so I can provide sample projects.

0