Hello,
maybe someone can help with this this issue.
I am implementing a bootloader for MPC5643L. I am using CodeWarrior 10.5.
I've already tried a lot of solutions from this forum and the great search engine but it always throws me an linker error.
I implemented the code as follows:
__declspec(section ".init") extern void __startup(int argc, char **argv, char **envp); #pragma section code_type ".bootvector" data_mode=far_abs __declspec(section ".bootvector") __asm void jumpToStartup(void); __asm void jumpToStartup(void) { b __startup; }
Then I added the following line into the MEMORY block:
bootvector: org = 0x40004, len = 0x8
And I added the following code to the SECTIONS block:
GROUP : { .bootvector : {} } > bootvector
I also tried the upper statement without the GROUP definition - same result.
When I try to compile it I always get the linker error:
Linker command file output section '.bootvector' has a type or input which is incompatible with section '.bootvector' in file 'Boot_c.obj'. Change the type or add an input for this section.
What I am doing wrong here ?
Thank you,
Markus
Hi Markus,
I've checked with colleague and see below their comments.
++++++++++++++++++++
The space occupied by the RCHW and application start address should be aligned at 16 bytes boundary.
You need to make bootvector section aligned at 16 bytes boundary.
++++++++++++++++++++
Regards
Pascal
Hello Pascal,
thank you for your response.
My bootloader progam doesn't use the BAM (and therefore the RCHW) to jump into my application.
But even if I relocate the section 'bootvector' to an 0x10 aligned address (e.g. 0x40000 or 0x40010) I get the following
Linker error: Linker command file output section '.bootvector' has a type or input which is incompatible with section '.bootvector' in file 'Boot_c.obj'. Change the type or add an input for this section.
My bootloader works as follows:
So I try to implement a branch instruction at address 0x40004 which points to the start of my application.
The bootloader uses a function pointer to jump to address 0x40004 and therefore should jump again to the start of my application.
Regards,
Markus
Hi Markus,
You can change your code as follows to avoid that error:
1. define the application function pointer
typedef void (*funcptr)(void);
#pragma push /* Save the current state */
#pragma section sconst_type ".__bootvectorarea"
const funcptr my_application = __startup;
#pragma pop
2. add items to linker command file
bootvector: org = 0x00040000 len = 0x10
.__bootvectorarea LOAD(ADDR(bootvector)): {} > bootvector
FORCEACTIVE { "my_application"}
Regards,
Kevin
Hello,
not exactly what I'm looking for but I'll give it a try - thanks.
My bootloader already uses a function pointer to jump to the start of the application (currently 0x40004 resp. 0x40010) so it would be nice if either the start of the application or a branch instruction to the start of the application would be located at this address.
With the solution above I now have a function pointer to a function pointer.
It's a common question for me how to locate a function to a designated memory address without this linker error.