Support for exception handling in linker scripts.
This is needed even in plain C when 64 bit variable (e.g. long long int) arithmetic is used. For example it is required when newlib is compiled with --enable-newlib-io-long-long. Conflicts: lib/stm32/f1/libopencm3_stm32f1.ld lib/stm32/f2/libopencm3_stm32f2.ld
This commit is contained in:
parent
c3038bc876
commit
bf65589183
@ -31,7 +31,8 @@ TOOLCHAIN_DIR = ../../../../..
|
|||||||
CFLAGS += -Os -g -Wall -Wextra -I$(TOOLCHAIN_DIR)/include \
|
CFLAGS += -Os -g -Wall -Wextra -I$(TOOLCHAIN_DIR)/include \
|
||||||
-fno-common -mcpu=cortex-m3 -mthumb -msoft-float -MD -DSTM32F1
|
-fno-common -mcpu=cortex-m3 -mthumb -msoft-float -MD -DSTM32F1
|
||||||
LDSCRIPT ?= $(BINARY).ld
|
LDSCRIPT ?= $(BINARY).ld
|
||||||
LDFLAGS += -lc -lnosys -L$(TOOLCHAIN_DIR)/lib -L$(TOOLCHAIN_DIR)/lib/stm32/f1 \
|
LDFLAGS += -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group \
|
||||||
|
-L$(TOOLCHAIN_DIR)/lib -L$(TOOLCHAIN_DIR)/lib/stm32/f1 \
|
||||||
-T$(LDSCRIPT) -nostartfiles -Wl,--gc-sections \
|
-T$(LDSCRIPT) -nostartfiles -Wl,--gc-sections \
|
||||||
-mthumb -march=armv7 -mfix-cortex-m3-ldrd -msoft-float
|
-mthumb -march=armv7 -mfix-cortex-m3-ldrd -msoft-float
|
||||||
OBJS += $(BINARY).o
|
OBJS += $(BINARY).o
|
||||||
|
@ -32,8 +32,8 @@ TOOLCHAIN_DIR = ../../../../..
|
|||||||
CFLAGS += -Os -g -Wall -Wextra -I$(TOOLCHAIN_DIR)/include \
|
CFLAGS += -Os -g -Wall -Wextra -I$(TOOLCHAIN_DIR)/include \
|
||||||
-fno-common -mcpu=cortex-m3 -mthumb -msoft-float -MD -DSTM32F2
|
-fno-common -mcpu=cortex-m3 -mthumb -msoft-float -MD -DSTM32F2
|
||||||
LDSCRIPT ?= $(BINARY).ld
|
LDSCRIPT ?= $(BINARY).ld
|
||||||
LDFLAGS += -lc -lnosys -L$(TOOLCHAIN_DIR)/lib \
|
LDFLAGS += -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group \
|
||||||
-L$(TOOLCHAIN_DIR)/lib/stm32/f2 \
|
-L$(TOOLCHAIN_DIR)/lib -L$(TOOLCHAIN_DIR)/lib/stm32/f2 \
|
||||||
-T$(LDSCRIPT) -nostartfiles -Wl,--gc-sections \
|
-T$(LDSCRIPT) -nostartfiles -Wl,--gc-sections \
|
||||||
-mthumb -march=armv7 -mfix-cortex-m3-ldrd -msoft-float
|
-mthumb -march=armv7 -mfix-cortex-m3-ldrd -msoft-float
|
||||||
OBJS += $(BINARY).o
|
OBJS += $(BINARY).o
|
||||||
|
@ -40,17 +40,22 @@ SECTIONS
|
|||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
} >rom
|
} >rom
|
||||||
|
|
||||||
/* exception index - required due to libgcc.a issuing /0 exceptions */
|
/*
|
||||||
__exidx_start = .;
|
* Another section used by C++ stuff, appears when using newlib with
|
||||||
|
* 64bit (long long) printf support
|
||||||
|
*/
|
||||||
|
.ARM.extab : {
|
||||||
|
*(.ARM.extab*)
|
||||||
|
} >rom
|
||||||
.ARM.exidx : {
|
.ARM.exidx : {
|
||||||
*(.ARM.exidx*)
|
__exidx_start = .;
|
||||||
} > rom
|
*(.ARM.exidx*)
|
||||||
__exidx_end = .;
|
__exidx_end = .;
|
||||||
|
} >rom
|
||||||
|
|
||||||
|
. = ORIGIN(ram);
|
||||||
|
|
||||||
_etext = .;
|
.data : AT (__exidx_end) {
|
||||||
|
|
||||||
.data : {
|
|
||||||
_data = .;
|
_data = .;
|
||||||
*(.data*) /* Read-write initialized data */
|
*(.data*) /* Read-write initialized data */
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
@ -64,11 +69,6 @@ SECTIONS
|
|||||||
_ebss = .;
|
_ebss = .;
|
||||||
} >ram
|
} >ram
|
||||||
|
|
||||||
/* exception unwind data - required due to libgcc.a issuing /0 exceptions */
|
|
||||||
.ARM.extab : {
|
|
||||||
*(.ARM.extab*)
|
|
||||||
} >ram
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
end = .;
|
end = .;
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#define WEAK __attribute__ ((weak))
|
#define WEAK __attribute__ ((weak))
|
||||||
|
|
||||||
/* Symbols exported by the linker script(s). */
|
/* Symbols exported by the linker script(s). */
|
||||||
extern unsigned _etext, _data, _edata, _ebss, _stack;
|
extern unsigned __exidx_end, _data, _edata, _ebss, _stack;
|
||||||
|
|
||||||
void main(void);
|
void main(void);
|
||||||
void reset_handler(void);
|
void reset_handler(void);
|
||||||
@ -197,7 +197,7 @@ void reset_handler(void)
|
|||||||
|
|
||||||
__asm__("MSR msp, %0" : : "r"(&_stack));
|
__asm__("MSR msp, %0" : : "r"(&_stack));
|
||||||
|
|
||||||
for (src = &_etext, dest = &_data; dest < &_edata; src++, dest++)
|
for (src = &__exidx_end, dest = &_data; dest < &_edata; src++, dest++)
|
||||||
*dest = *src;
|
*dest = *src;
|
||||||
|
|
||||||
while (dest < &_ebss)
|
while (dest < &_ebss)
|
||||||
|
@ -40,17 +40,22 @@ SECTIONS
|
|||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
} >rom
|
} >rom
|
||||||
|
|
||||||
/* exception index - required due to libgcc.a issuing /0 exceptions */
|
/*
|
||||||
__exidx_start = .;
|
* Another section used by C++ stuff, appears when using newlib with
|
||||||
|
* 64bit (long long) printf support
|
||||||
|
*/
|
||||||
|
.ARM.extab : {
|
||||||
|
*(.ARM.extab*)
|
||||||
|
} >rom
|
||||||
.ARM.exidx : {
|
.ARM.exidx : {
|
||||||
*(.ARM.exidx*)
|
__exidx_start = .;
|
||||||
} > rom
|
*(.ARM.exidx*)
|
||||||
__exidx_end = .;
|
__exidx_end = .;
|
||||||
|
} >rom
|
||||||
|
|
||||||
|
. = ORIGIN(ram);
|
||||||
|
|
||||||
_etext = .;
|
.data : AT (__exidx_end) {
|
||||||
|
|
||||||
.data : {
|
|
||||||
_data = .;
|
_data = .;
|
||||||
*(.data*) /* Read-write initialized data */
|
*(.data*) /* Read-write initialized data */
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
@ -64,11 +69,6 @@ SECTIONS
|
|||||||
_ebss = .;
|
_ebss = .;
|
||||||
} >ram
|
} >ram
|
||||||
|
|
||||||
/* exception unwind data - required due to libgcc.a issuing /0 exceptions */
|
|
||||||
.ARM.extab : {
|
|
||||||
*(.ARM.extab*)
|
|
||||||
} >ram
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
end = .;
|
end = .;
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#define WEAK __attribute__ ((weak))
|
#define WEAK __attribute__ ((weak))
|
||||||
|
|
||||||
/* Symbols exported by the linker script(s): */
|
/* Symbols exported by the linker script(s): */
|
||||||
extern unsigned _etext, _data, _edata, _ebss, _stack;
|
extern unsigned __exidx_end, _data, _edata, _ebss, _stack;
|
||||||
|
|
||||||
void main(void);
|
void main(void);
|
||||||
void reset_handler(void);
|
void reset_handler(void);
|
||||||
@ -224,7 +224,7 @@ void reset_handler(void)
|
|||||||
|
|
||||||
__asm__("MSR msp, %0" : : "r"(&_stack));
|
__asm__("MSR msp, %0" : : "r"(&_stack));
|
||||||
|
|
||||||
for (src = &_etext, dest = &_data; dest < &_edata; src++, dest++)
|
for (src = &__exidx_end, dest = &_data; dest < &_edata; src++, dest++)
|
||||||
*dest = *src;
|
*dest = *src;
|
||||||
|
|
||||||
while (dest < &_ebss)
|
while (dest < &_ebss)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user