m68k: improve build process
This includes several improvements to the link flags, link script, common makefile, etc.. Previously bss initialization in m68k start was incorrect. m68k can now call static initializers if necessary.
This commit is contained in:
parent
123653fda1
commit
e449090df0
@ -2,13 +2,13 @@ LIB ?= .
|
||||
OPT ?= -Og
|
||||
|
||||
AARCH = --isa=sh2 --big
|
||||
AFLAGS = -g -gdwarf-4
|
||||
AFLAGS = -g -gdwarf-4 --fatal-warnings
|
||||
|
||||
CARCH = -m2 -mb
|
||||
CFLAGS += -falign-functions=4 -ffunction-sections -fdata-sections -fshort-enums -ffreestanding -nostdlib
|
||||
CFLAGS += -Wall -Werror -Wfatal-errors -Wno-error=unused-variable -g -gdwarf-4 $(OPT)
|
||||
LDFLAGS = --gc-sections --no-warn-rwx-segment --print-memory-usage --entry=_start
|
||||
CXXFLAGS = -std=c++17 -fno-exceptions -fno-non-call-exceptions -fno-rtti -fno-threadsafe-statics
|
||||
LDFLAGS = --gc-sections --print-gc-sections --no-warn-rwx-segment --print-memory-usage --entry=_start --orphan-handling=error
|
||||
CXXFLAGS = -std=c++20 -fno-exceptions -fno-non-call-exceptions -fno-rtti -fno-threadsafe-statics
|
||||
|
||||
TARGET = sh2-none-elf-
|
||||
CC = $(TARGET)gcc
|
||||
|
@ -4,13 +4,13 @@ OPT ?= -Og
|
||||
ARCH = -march=68000 -mcpu=68000
|
||||
|
||||
AARCH = $(ARCH)
|
||||
AFLAGS = -g -gdwarf-4
|
||||
AFLAGS = -g -gdwarf-4 --fatal-warnings
|
||||
|
||||
CARCH = $(ARCH) -mtune=68000
|
||||
CFLAGS += -falign-functions=4 -ffunction-sections -fdata-sections -fshort-enums -ffreestanding -nostdlib
|
||||
CFLAGS += -Wall -Werror -Wfatal-errors -Wno-error=unused-variable -g -gdwarf-4 $(OPT)
|
||||
LDFLAGS = --gc-sections --no-warn-rwx-segment --print-memory-usage --entry=start
|
||||
CXXFLAGS = -fno-exceptions -fno-rtti
|
||||
LDFLAGS = --gc-sections --print-gc-sections --no-warn-rwx-segment --print-memory-usage --entry=start --orphan-handling=error
|
||||
CXXFLAGS = -std=c++20 -fno-exceptions -fno-non-call-exceptions -fno-rtti -fno-threadsafe-statics
|
||||
|
||||
TARGET = m68k-none-elf-
|
||||
CC = $(TARGET)gcc
|
||||
@ -41,8 +41,8 @@ all: main.bin
|
||||
%.o: %.cpp
|
||||
$(CXX) $(CFLAGS) $(CXXFLAGS) $(CARCH) -c $< -o $@
|
||||
|
||||
%.elf:
|
||||
$(LD) $(LDFLAGS) -T $(LIB)/m68k/m68k.lds $(LIB)/m68k/vectors.o $(LIB)/m68k/start.o $(LIB)/m68k/handlers.o $^ -o $@
|
||||
%.elf: $(LIB)/m68k/vectors.o $(LIB)/m68k/start.o $(LIB)/m68k/handlers.o
|
||||
$(LD) $(LDFLAGS) -T $(LIB)/m68k/m68k.lds $^ -o $@
|
||||
|
||||
%.bin: %.elf
|
||||
$(OBJCOPY) -O binary $< $@
|
||||
|
@ -1,14 +1,17 @@
|
||||
void auto_vector_1(void) __attribute__ ((weak, interrupt_handler));
|
||||
void auto_vector_1(void) { return; }
|
||||
void auto_vector_1(void) { while (1); }
|
||||
void auto_vector_2(void) __attribute__ ((weak, interrupt_handler));
|
||||
void auto_vector_2(void) { return; }
|
||||
void auto_vector_2(void) { while (1); }
|
||||
void auto_vector_3(void) __attribute__ ((weak, interrupt_handler));
|
||||
void auto_vector_3(void) { return; }
|
||||
void auto_vector_3(void) { while (1); }
|
||||
void auto_vector_4(void) __attribute__ ((weak, interrupt_handler));
|
||||
void auto_vector_4(void) { return; }
|
||||
void auto_vector_4(void) { while (1); }
|
||||
void auto_vector_5(void) __attribute__ ((weak, interrupt_handler));
|
||||
void auto_vector_5(void) { return; }
|
||||
void auto_vector_5(void) { while (1); }
|
||||
void auto_vector_6(void) __attribute__ ((weak, interrupt_handler));
|
||||
void auto_vector_6(void) { return; }
|
||||
void auto_vector_6(void) { while (1); }
|
||||
void auto_vector_7(void) __attribute__ ((weak, interrupt_handler));
|
||||
void auto_vector_7(void) { return; }
|
||||
void auto_vector_7(void) { while (1); }
|
||||
|
||||
void exception(void) __attribute__ ((weak, interrupt_handler, noreturn));
|
||||
void exception(void) { while (1); }
|
||||
|
@ -6,33 +6,52 @@ MEMORY
|
||||
}
|
||||
SECTIONS
|
||||
{
|
||||
.text :
|
||||
. = 0x00000000;
|
||||
|
||||
.text ALIGN(4) : SUBALIGN(4)
|
||||
{
|
||||
. = 0x000000;
|
||||
KEEP(*(.vectors))
|
||||
KEEP(*(.text.start))
|
||||
KEEP(*(.vectors*))
|
||||
KEEP(*(.text.start))
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.text.*)
|
||||
} > sound_ram
|
||||
|
||||
.data ALIGN(4) : SUBALIGN(4)
|
||||
{
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.data.*)
|
||||
} > sound_ram
|
||||
|
||||
.rodata ALIGN(4) : SUBALIGN(4)
|
||||
{
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
} > sound_ram
|
||||
|
||||
.ctors ALIGN(4) : SUBALIGN(4)
|
||||
{
|
||||
KEEP(*(.ctors))
|
||||
KEEP(*(.ctors.*))
|
||||
} > sound_ram
|
||||
|
||||
.bss ALIGN(4) (NOLOAD) : SUBALIGN(4)
|
||||
{
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
} > sound_ram
|
||||
|
||||
/DISCARD/ :
|
||||
{
|
||||
*(.debug*)
|
||||
*(.comment*)
|
||||
*(.rela*)
|
||||
}
|
||||
|
||||
__bss_link_start = ADDR(.bss);
|
||||
__bss_link_end = ADDR(.bss) + SIZEOF(.bss);
|
||||
|
||||
__ctors_link_start = ADDR(.ctors);
|
||||
__ctors_link_end = ADDR(.ctors) + SIZEOF(.ctors);
|
||||
}
|
||||
|
||||
scsp = 0x000000;
|
||||
|
@ -1,18 +1,33 @@
|
||||
#include <stdint.h>
|
||||
|
||||
extern uint32_t * __bss_link_start;
|
||||
extern uint32_t * __bss_link_end;
|
||||
extern "C" uint32_t __bss_link_start __asm("__bss_link_start");
|
||||
extern "C" uint32_t __bss_link_end __asm("__bss_link_end");
|
||||
|
||||
typedef void(*init_t)(void);
|
||||
|
||||
extern "C" uint32_t __ctors_link_start __asm("__ctors_link_start");
|
||||
extern "C" uint32_t __ctors_link_end __asm("__ctors_link_end");
|
||||
|
||||
extern void main();
|
||||
|
||||
extern "C"
|
||||
void start(void)
|
||||
{
|
||||
uint32_t * start = __bss_link_start;
|
||||
uint32_t * end = __bss_link_end;
|
||||
uint32_t * start;
|
||||
uint32_t * end;
|
||||
|
||||
start = &__bss_link_start;
|
||||
end = &__bss_link_end;
|
||||
while (start < end) {
|
||||
*start++ = 0;
|
||||
}
|
||||
|
||||
start = &__ctors_link_start;
|
||||
end = &__ctors_link_end;
|
||||
while (start < end) {
|
||||
(reinterpret_cast<init_t>(*start++))();
|
||||
}
|
||||
|
||||
main();
|
||||
|
||||
while (1);
|
||||
|
112
m68k/vectors.s
112
m68k/vectors.s
@ -2,29 +2,29 @@
|
||||
|
||||
.long 0x7fffc /* Reset - initial stack pointer */
|
||||
.long start /* Reset - initial program counter */
|
||||
.long start /* Bus error */
|
||||
.long start /* Address error */
|
||||
.long start /* Illegal command */
|
||||
.long start /* Divide by zero */
|
||||
.long start /* CHK exception */
|
||||
.long start /* TRAPV exception */
|
||||
.long start /* Privilege violation */
|
||||
.long start /* Trace */
|
||||
.long start /* Line 1010 emulator */
|
||||
.long start /* Line 1111 emulator */
|
||||
.long start /* reserved 12 */
|
||||
.long start /* reserved 13 */
|
||||
.long start /* reserved 14 */
|
||||
.long start /* Uninitialized interrupt vector */
|
||||
.long start /* reserved 16 */
|
||||
.long start /* reserved 17 */
|
||||
.long start /* reserved 18 */
|
||||
.long start /* reserved 19 */
|
||||
.long start /* reserved 20 */
|
||||
.long start /* reserved 21 */
|
||||
.long start /* reserved 22 */
|
||||
.long start /* reserved 23 */
|
||||
.long start /* Spurious interrupt */
|
||||
.long exception /* Bus error */
|
||||
.long exception /* Address error */
|
||||
.long exception /* Illegal command */
|
||||
.long exception /* Divide by zero */
|
||||
.long exception /* CHK exception */
|
||||
.long exception /* TRAPV exception */
|
||||
.long exception /* Privilege violation */
|
||||
.long exception /* Trace */
|
||||
.long exception /* Line 1010 emulator */
|
||||
.long exception /* Line 1111 emulator */
|
||||
.long exception /* reserved 12 */
|
||||
.long exception /* reserved 13 */
|
||||
.long exception /* reserved 14 */
|
||||
.long exception /* Uninitialized interrupt vector */
|
||||
.long exception /* reserved 16 */
|
||||
.long exception /* reserved 17 */
|
||||
.long exception /* reserved 18 */
|
||||
.long exception /* reserved 19 */
|
||||
.long exception /* reserved 20 */
|
||||
.long exception /* reserved 21 */
|
||||
.long exception /* reserved 22 */
|
||||
.long exception /* reserved 23 */
|
||||
.long exception /* Spurious interrupt */
|
||||
.long auto_vector_1 /* Auto vector level 1 interrupt */
|
||||
.long auto_vector_2 /* Auto vector level 2 interrupt */
|
||||
.long auto_vector_3 /* Auto vector level 3 interrupt */
|
||||
@ -32,37 +32,37 @@
|
||||
.long auto_vector_5 /* Auto vector level 5 interrupt */
|
||||
.long auto_vector_6 /* Auto vector level 6 interrupt */
|
||||
.long auto_vector_7 /* Auto vector level 7 interrupt */
|
||||
.long start /* Trap #0 vector */
|
||||
.long start /* Trap #1 vector */
|
||||
.long start /* Trap #2 vector */
|
||||
.long start /* Trap #3 vector */
|
||||
.long start /* Trap #4 vector */
|
||||
.long start /* Trap #5 vector */
|
||||
.long start /* Trap #6 vector */
|
||||
.long start /* Trap #7 vector */
|
||||
.long start /* Trap #8 vector */
|
||||
.long start /* Trap #9 vector */
|
||||
.long start /* Trap #10 vector */
|
||||
.long start /* Trap #11 vector */
|
||||
.long start /* Trap #12 vector */
|
||||
.long start /* Trap #13 vector */
|
||||
.long start /* Trap #14 vector */
|
||||
.long start /* Trap #15 vector */
|
||||
.long start /* reserved 48 */
|
||||
.long start /* reserved 49 */
|
||||
.long start /* reserved 50 */
|
||||
.long start /* reserved 51 */
|
||||
.long start /* reserved 52 */
|
||||
.long start /* reserved 53 */
|
||||
.long start /* reserved 54 */
|
||||
.long start /* reserved 55 */
|
||||
.long start /* reserved 56 */
|
||||
.long start /* reserved 57 */
|
||||
.long start /* reserved 58 */
|
||||
.long start /* reserved 59 */
|
||||
.long start /* reserved 60 */
|
||||
.long start /* reserved 61 */
|
||||
.long start /* reserved 62 */
|
||||
.long start /* reserved 63 */
|
||||
.long exception /* Trap #0 vector */
|
||||
.long exception /* Trap #1 vector */
|
||||
.long exception /* Trap #2 vector */
|
||||
.long exception /* Trap #3 vector */
|
||||
.long exception /* Trap #4 vector */
|
||||
.long exception /* Trap #5 vector */
|
||||
.long exception /* Trap #6 vector */
|
||||
.long exception /* Trap #7 vector */
|
||||
.long exception /* Trap #8 vector */
|
||||
.long exception /* Trap #9 vector */
|
||||
.long exception /* Trap #10 vector */
|
||||
.long exception /* Trap #11 vector */
|
||||
.long exception /* Trap #12 vector */
|
||||
.long exception /* Trap #13 vector */
|
||||
.long exception /* Trap #14 vector */
|
||||
.long exception /* Trap #15 vector */
|
||||
.long exception /* reserved 48 */
|
||||
.long exception /* reserved 49 */
|
||||
.long exception /* reserved 50 */
|
||||
.long exception /* reserved 51 */
|
||||
.long exception /* reserved 52 */
|
||||
.long exception /* reserved 53 */
|
||||
.long exception /* reserved 54 */
|
||||
.long exception /* reserved 55 */
|
||||
.long exception /* reserved 56 */
|
||||
.long exception /* reserved 57 */
|
||||
.long exception /* reserved 58 */
|
||||
.long exception /* reserved 59 */
|
||||
.long exception /* reserved 60 */
|
||||
.long exception /* reserved 61 */
|
||||
.long exception /* reserved 62 */
|
||||
.long exception /* reserved 63 */
|
||||
|
||||
.align 0x400, 0xee
|
||||
.fill 0x300, 1, 0xee
|
||||
|
11
sh2.lds
11
sh2.lds
@ -2,7 +2,7 @@ OUTPUT_FORMAT("elf32-sh", "elf32-sh", "elf32-sh")
|
||||
OUTPUT_ARCH(sh)
|
||||
MEMORY
|
||||
{
|
||||
ipl_rom : ORIGIN = 0x00000000, LENGTH = 512K
|
||||
ipl_rom : ORIGIN = 0x00000000, LENGTH = 512K
|
||||
work_ram_l : ORIGIN = 0x00200000, LENGTH = 1M
|
||||
work_ram_h : ORIGIN = 0x06000000, LENGTH = 1M
|
||||
}
|
||||
@ -26,6 +26,7 @@ SECTIONS
|
||||
.rodata ALIGN(4) : SUBALIGN(4)
|
||||
{
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
} > work_ram_h
|
||||
|
||||
.ctors ALIGN(4) : SUBALIGN(4)
|
||||
@ -37,6 +38,7 @@ SECTIONS
|
||||
.bss ALIGN(4) (NOLOAD) : SUBALIGN(4)
|
||||
{
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
} > work_ram_h
|
||||
|
||||
.bss.work_ram_l ALIGN(4) (NOLOAD) : SUBALIGN(4)
|
||||
@ -44,6 +46,13 @@ SECTIONS
|
||||
*(.bss.work_ram_l)
|
||||
} > work_ram_l
|
||||
|
||||
/DISCARD/ :
|
||||
{
|
||||
*(.debug*)
|
||||
*(.comment*)
|
||||
*(.rela*)
|
||||
}
|
||||
|
||||
__bss_link_start = ADDR(.bss);
|
||||
__bss_link_end = ADDR(.bss) + SIZEOF(.bss);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user