Hi,
I am using a M3 cpu (STM32103) and a gcc toolchain selfmade. Everything
work fine if I compile my code for using the internal Flash (for the
code) and the internal RAM (for the data). For reason of place I have to
use the external RAM. So, I have modified my linker script accordingly.
Now the linker report a problem.
With this script the linker works
_stEPROM = 0x00000000;
_stRAM = 0x20000000;
MEMORY {
prgm_code (rx) : ORIGIN = 0x00000000, LENGTH = 512K
prgm_data (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
}
SECTIONS {
.text _stEPROM : {
_stVECTORS = ABSOLUTE(.);
KEEP(*(.isr_vector))
_enVECTORS = ABSOLUTE(.);
_stTEXT = ABSOLUTE(.);
*(.text .text.*)
_enTEXT = ABSOLUTE(.);
_stRODATA = ABSOLUTE(.);
*(.rodata .rodata.*)
. = ALIGN(4);
_enRODATA = ABSOLUTE(.);
} > prgm_code
.data _stRAM : AT (_enRODATA) {
_stDATA = ABSOLUTE(.);
*(.data .data.*)
. = ALIGN(4);
*(vtable)
*(.data*)
_enDATA = ABSOLUTE(.);
} > prgm_data
. = ALIGN(4);
.eh_frame : {
KEEP (*(.eh_frame))
} > prgm_data
. = ALIGN(4);
.ARM.extab : {
*(.ARM.extab*)
} > prgm_data
. = ALIGN(4);
__exidx_start = ABSOLUTE(.);
.ARM.exidx : {
*(.ARM.exidx*)
} > prgm_data
__exidx_end = ABSOLUTE(.);
.bss (NOLOAD) : {
_stBSS = ABSOLUTE(.);
*(.bss .bss.*)
. = ALIGN(4);
*(COMMON)
. = ALIGN(4);
_enBSS = ABSOLUTE(.);
_end = ABSOLUTE(.);
end = ABSOLUTE(.);
_heap = ABSOLUTE(.);
. += 0x800;
_main_stack = ABSOLUTE(.);
} > prgm_data
}
With this modification the linker fails
_stEPROM = 0x00000000;
_stRAM = 0x60000000;
MEMORY {
prgm_code (rx) : ORIGIN = 0x00000000, LENGTH = 512K
prgm_data (rwx) : ORIGIN = 0x60000000, LENGTH = 8M
}
The linker reports me this error:
/Users/Shared/cross/gcc-4.6.1/arm/lib/gcc/arm-none-eabi/4.6.1/thumb/v7m/
libgcc.a(unwind-arm.o):(.ARM.exidx+0x38): relocation truncated to fit:
R_ARM_PREL31 against `.text'
/Users/Shared/cross/gcc-4.6.1/arm/lib/gcc/arm-none-eabi/4.6.1/thumb/v7m/
libgcc.a(unwind-arm.o):(.ARM.exidx+0x40): additional relocation
overflows omitted from the output
I have tried to use the compilation flag -mlong-calls but t doesn't
work.
Any opinion or idea to workaround this problem?
Regards
Bangla
Please create a minimal but full example so just typing "make all" in a shell will do to reproduce the issue.
Hi Martin, Of course I did a minimal project. It turns out that the problem appears only when I call a newlib function (like printf, puts, etc). Strange ... do you think I have to recreate the libc and libgcc with some special configuration flags?
I have rebuild all my toolchain with the switch --enable-newlib-io-long-long disabled during the newlib creation. Now it works. It is difficult to understand what is happening. Anyway, this is only a partial solution because I need to print long long integers. Any comment or suggestions? Regards Bangla
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.