RT-Thread / RT-Thread/rt-thread
Bug in linker script for all stm32 targets
Open
Nobody has claimed this yet.
good first issue
- Dominant language
- C
- Stars
- 12.2k
- Forks
- 5.4k
- Avg merge
- 4d 12h
- Merged PRs (30d)
- 40
Description
The following prints -2 but must print 1234:
void variadic_test(int n, ...) {
va_list vl;
va_start(vl, n);
double val = va_arg(vl, double);
rt_kprintf("%d", (int)val);
va_end(vl);
}
void main() {
double v = 1234.5678;
variadic_test(1, v);
while(1);
}
Seems like stack is aligned by 4 for all stm32 targets but double size is 8 bytes. The following patch fixes the issue:
--- link.lds.o 2023-05-18 11:11:50.831727100 +0300
+++ link.lds 2023-05-18 11:43:42.305975225 +0300
@@ -93,10 +93,10 @@
.stack :
{
- . = ALIGN(4);
+ . = ALIGN(8);
_sstack = .;
. = . + _system_stack_size;
- . = ALIGN(4);
+ . = ALIGN(8);
_estack = .;
} >RAM
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the link.lds linker script and inspect the .stack section for the STM32 targets. Reproduce the provided variadic_test example, then verify that the stack alignment change makes it print 1234 rather than -2 across the affected targets.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c
- Domain
- build-system, embedded-iot
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 58/100