forked from Imagelibrary/rtems
riscv: Address differences in the linkerscript between GNU LD and LLVM/LLD
LLVM/LLD does not support STARTUP and ALIGN_WITH_INPUT directives that GNU LD support. INPUT and ALIGN(8) are supported by LLVM/LLD and can replace the unsupported STARTUP/ALIGN_WITH_INPUT directives. The commit conditionally adds the supported directive that linkers can understand depending on the toolchain used to compile RTEMS i.e., clang or gcc. Clang is assumed to use LLD by default.
This commit is contained in:
@@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
OUTPUT_ARCH(riscv)
|
OUTPUT_ARCH(riscv)
|
||||||
ENTRY(_start)
|
ENTRY(_start)
|
||||||
STARTUP(start.o)
|
@RISCV_LINKER_START_DIRECTIVE@(start.o)
|
||||||
|
|
||||||
bsp_section_robarrier_align = DEFINED (bsp_section_robarrier_align) ? bsp_section_robarrier_align : 1;
|
bsp_section_robarrier_align = DEFINED (bsp_section_robarrier_align) ? bsp_section_robarrier_align : 1;
|
||||||
bsp_section_rwbarrier_align = DEFINED (bsp_section_rwbarrier_align) ? bsp_section_rwbarrier_align : 1;
|
bsp_section_rwbarrier_align = DEFINED (bsp_section_rwbarrier_align) ? bsp_section_rwbarrier_align : 1;
|
||||||
@@ -43,7 +43,7 @@ MEMORY {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
.start : ALIGN_WITH_INPUT {
|
.start : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
bsp_section_start_begin = .;
|
bsp_section_start_begin = .;
|
||||||
KEEP (*(.bsp_start_text))
|
KEEP (*(.bsp_start_text))
|
||||||
KEEP (*(.bsp_start_data))
|
KEEP (*(.bsp_start_data))
|
||||||
@@ -51,7 +51,7 @@ SECTIONS {
|
|||||||
} > REGION_START AT > REGION_START
|
} > REGION_START AT > REGION_START
|
||||||
bsp_section_start_size = bsp_section_start_end - bsp_section_start_begin;
|
bsp_section_start_size = bsp_section_start_end - bsp_section_start_begin;
|
||||||
|
|
||||||
.text : ALIGN_WITH_INPUT {
|
.text : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
bsp_section_text_begin = .;
|
bsp_section_text_begin = .;
|
||||||
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
|
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
|
||||||
*(.text.exit .text.exit.*)
|
*(.text.exit .text.exit.*)
|
||||||
@@ -61,10 +61,10 @@ SECTIONS {
|
|||||||
/* .gnu.warning sections are handled specially by elf32.em. */
|
/* .gnu.warning sections are handled specially by elf32.em. */
|
||||||
*(.gnu.warning)
|
*(.gnu.warning)
|
||||||
} > REGION_TEXT AT > REGION_TEXT_LOAD
|
} > REGION_TEXT AT > REGION_TEXT_LOAD
|
||||||
.init : ALIGN_WITH_INPUT {
|
.init : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
KEEP (*(SORT_NONE(.init)))
|
KEEP (*(SORT_NONE(.init)))
|
||||||
} > REGION_TEXT AT > REGION_TEXT_LOAD
|
} > REGION_TEXT AT > REGION_TEXT_LOAD
|
||||||
.fini : ALIGN_WITH_INPUT {
|
.fini : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
KEEP (*(SORT_NONE(.fini)))
|
KEEP (*(SORT_NONE(.fini)))
|
||||||
bsp_section_text_end = .;
|
bsp_section_text_end = .;
|
||||||
} > REGION_TEXT AT > REGION_TEXT_LOAD
|
} > REGION_TEXT AT > REGION_TEXT_LOAD
|
||||||
@@ -72,41 +72,41 @@ SECTIONS {
|
|||||||
bsp_section_text_load_begin = LOADADDR (.text);
|
bsp_section_text_load_begin = LOADADDR (.text);
|
||||||
bsp_section_text_load_end = bsp_section_text_load_begin + bsp_section_text_size;
|
bsp_section_text_load_end = bsp_section_text_load_begin + bsp_section_text_size;
|
||||||
|
|
||||||
.robarrier : ALIGN_WITH_INPUT {
|
.robarrier : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
. = ALIGN (bsp_section_robarrier_align);
|
. = ALIGN (bsp_section_robarrier_align);
|
||||||
} > REGION_RODATA AT > REGION_RODATA
|
} > REGION_RODATA AT > REGION_RODATA
|
||||||
|
|
||||||
.rodata : ALIGN_WITH_INPUT {
|
.rodata : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
bsp_section_rodata_begin = .;
|
bsp_section_rodata_begin = .;
|
||||||
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.rodata1 : ALIGN_WITH_INPUT {
|
.rodata1 : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.rodata1)
|
*(.rodata1)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.sdata2 : ALIGN_WITH_INPUT {
|
.sdata2 : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
|
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.sbss2 : ALIGN_WITH_INPUT {
|
.sbss2 : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
|
*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.eh_frame_hdr : ALIGN_WITH_INPUT {
|
.eh_frame_hdr : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*)
|
*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.eh_frame : ALIGN_WITH_INPUT {
|
.eh_frame : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
KEEP (*(.eh_frame)) *(.eh_frame.*)
|
KEEP (*(.eh_frame)) *(.eh_frame.*)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.gcc_except_table : ALIGN_WITH_INPUT {
|
.gcc_except_table : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.gcc_except_table .gcc_except_table.*)
|
*(.gcc_except_table .gcc_except_table.*)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.gnu_extab : ALIGN_WITH_INPUT {
|
.gnu_extab : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.gnu_extab*)
|
*(.gnu_extab*)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.tdata : ALIGN_WITH_INPUT {
|
.tdata : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
_TLS_Data_begin = .;
|
_TLS_Data_begin = .;
|
||||||
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
*(.tdata .tdata.* .gnu.linkonce.td.*)
|
||||||
_TLS_Data_end = .;
|
_TLS_Data_end = .;
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.tbss : ALIGN_WITH_INPUT {
|
.tbss : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
_TLS_BSS_begin = .;
|
_TLS_BSS_begin = .;
|
||||||
*(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
|
*(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
|
||||||
_TLS_BSS_end = .;
|
_TLS_BSS_end = .;
|
||||||
@@ -117,24 +117,24 @@ SECTIONS {
|
|||||||
_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
|
_TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin;
|
||||||
_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
|
_TLS_Size = _TLS_BSS_end - _TLS_Data_begin;
|
||||||
_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
|
_TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss));
|
||||||
.preinit_array : ALIGN_WITH_INPUT {
|
.preinit_array : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
PROVIDE_HIDDEN (__preinit_array_start = .);
|
PROVIDE_HIDDEN (__preinit_array_start = .);
|
||||||
KEEP (*(.preinit_array))
|
KEEP (*(.preinit_array))
|
||||||
PROVIDE_HIDDEN (__preinit_array_end = .);
|
PROVIDE_HIDDEN (__preinit_array_end = .);
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.init_array : ALIGN_WITH_INPUT {
|
.init_array : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
PROVIDE_HIDDEN (__init_array_start = .);
|
PROVIDE_HIDDEN (__init_array_start = .);
|
||||||
KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
|
KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
|
||||||
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
|
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
|
||||||
PROVIDE_HIDDEN (__init_array_end = .);
|
PROVIDE_HIDDEN (__init_array_end = .);
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.fini_array : ALIGN_WITH_INPUT {
|
.fini_array : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
PROVIDE_HIDDEN (__fini_array_start = .);
|
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||||
KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
|
KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
|
||||||
KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
|
KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
|
||||||
PROVIDE_HIDDEN (__fini_array_end = .);
|
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.ctors : ALIGN_WITH_INPUT {
|
.ctors : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
/* gcc uses crtbegin.o to find the start of
|
/* gcc uses crtbegin.o to find the start of
|
||||||
the constructors, so we make sure it is
|
the constructors, so we make sure it is
|
||||||
first. Because this is a wildcard, it
|
first. Because this is a wildcard, it
|
||||||
@@ -154,47 +154,47 @@ SECTIONS {
|
|||||||
KEEP (*(SORT(.ctors.*)))
|
KEEP (*(SORT(.ctors.*)))
|
||||||
KEEP (*(.ctors))
|
KEEP (*(.ctors))
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.dtors : ALIGN_WITH_INPUT {
|
.dtors : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
KEEP (*crtbegin.o(.dtors))
|
KEEP (*crtbegin.o(.dtors))
|
||||||
KEEP (*crtbegin?.o(.dtors))
|
KEEP (*crtbegin?.o(.dtors))
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
|
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
|
||||||
KEEP (*(SORT(.dtors.*)))
|
KEEP (*(SORT(.dtors.*)))
|
||||||
KEEP (*(.dtors))
|
KEEP (*(.dtors))
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.data.rel.ro : ALIGN_WITH_INPUT {
|
.data.rel.ro : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*)
|
*(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*)
|
||||||
*(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*)
|
*(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.jcr : ALIGN_WITH_INPUT {
|
.jcr : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
KEEP (*(.jcr))
|
KEEP (*(.jcr))
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.interp : ALIGN_WITH_INPUT {
|
.interp : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.interp)
|
*(.interp)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.note.gnu.build-id : { *(.note.gnu.build-id)
|
.note.gnu.build-id : { *(.note.gnu.build-id)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.hash : ALIGN_WITH_INPUT {
|
.hash : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.hash)
|
*(.hash)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.gnu.hash : ALIGN_WITH_INPUT {
|
.gnu.hash : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.gnu.hash)
|
*(.gnu.hash)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.dynsym : ALIGN_WITH_INPUT {
|
.dynsym : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.dynsym)
|
*(.dynsym)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.dynstr : ALIGN_WITH_INPUT {
|
.dynstr : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.dynstr)
|
*(.dynstr)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.gnu.version : ALIGN_WITH_INPUT {
|
.gnu.version : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.gnu.version)
|
*(.gnu.version)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.gnu.version_d : ALIGN_WITH_INPUT {
|
.gnu.version_d : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.gnu.version_d)
|
*(.gnu.version_d)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.gnu.version_r : ALIGN_WITH_INPUT {
|
.gnu.version_r : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.gnu.version_r)
|
*(.gnu.version_r)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.rela.dyn : ALIGN_WITH_INPUT {
|
.rela.dyn : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.rela.init)
|
*(.rela.init)
|
||||||
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
|
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
|
||||||
*(.rela.fini)
|
*(.rela.fini)
|
||||||
@@ -214,25 +214,25 @@ SECTIONS {
|
|||||||
*(.rela.iplt)
|
*(.rela.iplt)
|
||||||
PROVIDE_HIDDEN (__rela_iplt_end = .);
|
PROVIDE_HIDDEN (__rela_iplt_end = .);
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.rela.plt : ALIGN_WITH_INPUT {
|
.rela.plt : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.rela.plt)
|
*(.rela.plt)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.plt : ALIGN_WITH_INPUT {
|
.plt : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.plt)
|
*(.plt)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.iplt : ALIGN_WITH_INPUT {
|
.iplt : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.iplt)
|
*(.iplt)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.dynamic : ALIGN_WITH_INPUT {
|
.dynamic : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.dynamic)
|
*(.dynamic)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.tm_clone_table : ALIGN_WITH_INPUT {
|
.tm_clone_table : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.tm_clone_table)
|
*(.tm_clone_table)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.got : ALIGN_WITH_INPUT {
|
.got : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.got.plt) *(.igot.plt) *(.got) *(.igot)
|
*(.got.plt) *(.igot.plt) *(.got) *(.igot)
|
||||||
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
} > REGION_RODATA AT > REGION_RODATA_LOAD
|
||||||
.rtemsroset : ALIGN_WITH_INPUT {
|
.rtemsroset : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
/* Special FreeBSD linker set sections */
|
/* Special FreeBSD linker set sections */
|
||||||
__start_set_sysctl_set = .;
|
__start_set_sysctl_set = .;
|
||||||
*(set_sysctl_*);
|
*(set_sysctl_*);
|
||||||
@@ -247,11 +247,11 @@ SECTIONS {
|
|||||||
bsp_section_rodata_load_begin = LOADADDR (.rodata);
|
bsp_section_rodata_load_begin = LOADADDR (.rodata);
|
||||||
bsp_section_rodata_load_end = bsp_section_rodata_load_begin + bsp_section_rodata_size;
|
bsp_section_rodata_load_end = bsp_section_rodata_load_begin + bsp_section_rodata_size;
|
||||||
|
|
||||||
.rwbarrier : ALIGN_WITH_INPUT {
|
.rwbarrier : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
. = ALIGN (bsp_section_rwbarrier_align);
|
. = ALIGN (bsp_section_rwbarrier_align);
|
||||||
} > REGION_DATA AT > REGION_DATA
|
} > REGION_DATA AT > REGION_DATA
|
||||||
|
|
||||||
.fast_text : ALIGN_WITH_INPUT {
|
.fast_text : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
bsp_section_fast_text_begin = .;
|
bsp_section_fast_text_begin = .;
|
||||||
*(.bsp_fast_text)
|
*(.bsp_fast_text)
|
||||||
bsp_section_fast_text_end = .;
|
bsp_section_fast_text_end = .;
|
||||||
@@ -260,7 +260,7 @@ SECTIONS {
|
|||||||
bsp_section_fast_text_load_begin = LOADADDR (.fast_text);
|
bsp_section_fast_text_load_begin = LOADADDR (.fast_text);
|
||||||
bsp_section_fast_text_load_end = bsp_section_fast_text_load_begin + bsp_section_fast_text_size;
|
bsp_section_fast_text_load_end = bsp_section_fast_text_load_begin + bsp_section_fast_text_size;
|
||||||
|
|
||||||
.fast_data : ALIGN_WITH_INPUT {
|
.fast_data : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
bsp_section_fast_data_begin = .;
|
bsp_section_fast_data_begin = .;
|
||||||
*(.bsp_fast_data)
|
*(.bsp_fast_data)
|
||||||
bsp_section_fast_data_end = .;
|
bsp_section_fast_data_end = .;
|
||||||
@@ -269,21 +269,21 @@ SECTIONS {
|
|||||||
bsp_section_fast_data_load_begin = LOADADDR (.fast_data);
|
bsp_section_fast_data_load_begin = LOADADDR (.fast_data);
|
||||||
bsp_section_fast_data_load_end = bsp_section_fast_data_load_begin + bsp_section_fast_data_size;
|
bsp_section_fast_data_load_end = bsp_section_fast_data_load_begin + bsp_section_fast_data_size;
|
||||||
|
|
||||||
.data : ALIGN_WITH_INPUT {
|
.data : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
bsp_section_data_begin = .;
|
bsp_section_data_begin = .;
|
||||||
*(.data .data.* .gnu.linkonce.d.*)
|
*(.data .data.* .gnu.linkonce.d.*)
|
||||||
SORT(CONSTRUCTORS)
|
SORT(CONSTRUCTORS)
|
||||||
} > REGION_DATA AT > REGION_DATA_LOAD
|
} > REGION_DATA AT > REGION_DATA_LOAD
|
||||||
.data1 : ALIGN_WITH_INPUT {
|
.data1 : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.data1)
|
*(.data1)
|
||||||
} > REGION_DATA AT > REGION_DATA_LOAD
|
} > REGION_DATA AT > REGION_DATA_LOAD
|
||||||
.rtemsrwset : ALIGN_WITH_INPUT {
|
.rtemsrwset : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
KEEP (*(SORT(.rtemsrwset.*)))
|
KEEP (*(SORT(.rtemsrwset.*)))
|
||||||
} > REGION_DATA AT > REGION_DATA_LOAD
|
} > REGION_DATA AT > REGION_DATA_LOAD
|
||||||
.htif ALIGN(4096) : ALIGN_WITH_INPUT {
|
.htif ALIGN(4096) : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.htif)
|
*(.htif)
|
||||||
} > REGION_DATA AT > REGION_DATA_LOAD
|
} > REGION_DATA AT > REGION_DATA_LOAD
|
||||||
.sdata : ALIGN_WITH_INPUT {
|
.sdata : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
__global_pointer$ = . + 0x800;
|
__global_pointer$ = . + 0x800;
|
||||||
*(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*)
|
*(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*)
|
||||||
*(.sdata .sdata.* .gnu.linkonce.s.*)
|
*(.sdata .sdata.* .gnu.linkonce.s.*)
|
||||||
@@ -293,13 +293,13 @@ SECTIONS {
|
|||||||
bsp_section_data_load_begin = LOADADDR (.data);
|
bsp_section_data_load_begin = LOADADDR (.data);
|
||||||
bsp_section_data_load_end = bsp_section_data_load_begin + bsp_section_data_size;
|
bsp_section_data_load_end = bsp_section_data_load_begin + bsp_section_data_size;
|
||||||
|
|
||||||
.sbss : ALIGN_WITH_INPUT {
|
.sbss : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
bsp_section_bss_begin = .;
|
bsp_section_bss_begin = .;
|
||||||
*(.dynsbss)
|
*(.dynsbss)
|
||||||
*(.sbss .sbss.* .gnu.linkonce.sb.*)
|
*(.sbss .sbss.* .gnu.linkonce.sb.*)
|
||||||
*(.scommon)
|
*(.scommon)
|
||||||
} > REGION_DATA AT > REGION_DATA
|
} > REGION_DATA AT > REGION_DATA
|
||||||
.bss : ALIGN_WITH_INPUT {
|
.bss : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
*(.dynbss)
|
*(.dynbss)
|
||||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
@@ -307,14 +307,14 @@ SECTIONS {
|
|||||||
} > REGION_DATA AT > REGION_DATA
|
} > REGION_DATA AT > REGION_DATA
|
||||||
bsp_section_bss_size = bsp_section_bss_end - bsp_section_bss_begin;
|
bsp_section_bss_size = bsp_section_bss_end - bsp_section_bss_begin;
|
||||||
|
|
||||||
.rtemsstack (NOLOAD) : ALIGN_WITH_INPUT {
|
.rtemsstack (NOLOAD) : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
bsp_section_rtemsstack_begin = .;
|
bsp_section_rtemsstack_begin = .;
|
||||||
*(SORT(.rtemsstack.*))
|
*(SORT(.rtemsstack.*))
|
||||||
bsp_section_rtemsstack_end = .;
|
bsp_section_rtemsstack_end = .;
|
||||||
} > REGION_RTEMSSTACK AT > REGION_RTEMSSTACK
|
} > REGION_RTEMSSTACK AT > REGION_RTEMSSTACK
|
||||||
bsp_section_rtemsstack_size = bsp_section_rtemsstack_end - bsp_section_rtemsstack_begin;
|
bsp_section_rtemsstack_size = bsp_section_rtemsstack_end - bsp_section_rtemsstack_begin;
|
||||||
|
|
||||||
.work : ALIGN_WITH_INPUT {
|
.work : @RISCV_LINKER_ALIGN_DIRECTIVE@ {
|
||||||
/*
|
/*
|
||||||
* The work section will occupy the remaining REGION_WORK region and
|
* The work section will occupy the remaining REGION_WORK region and
|
||||||
* contains the RTEMS work space and heap.
|
* contains the RTEMS work space and heap.
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ start.$(OBJEXT): ../../../../../../bsps/riscv/shared/start/start.S
|
|||||||
project_lib_DATA = start.$(OBJEXT)
|
project_lib_DATA = start.$(OBJEXT)
|
||||||
|
|
||||||
project_lib_DATA += linkcmds
|
project_lib_DATA += linkcmds
|
||||||
project_lib_DATA += ../../../../../../bsps/riscv/shared/start/linkcmds.base
|
project_lib_DATA += linkcmds.base
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# LibBSP #
|
# LibBSP #
|
||||||
|
|||||||
@@ -30,11 +30,30 @@ AC_ARG_VAR([$1],[$2])dnl
|
|||||||
[$1]=[$]{[$1]:-[$3]}
|
[$1]=[$]{[$1]:-[$3]}
|
||||||
])
|
])
|
||||||
|
|
||||||
|
case "${RTEMS_BSP}" in
|
||||||
|
*clang)
|
||||||
|
RISCV_LINKER_START_DIRECTIVE_DEFAULT="INPUT"
|
||||||
|
RISCV_LINKER_ALIGN_DIRECTIVE_DEFAULT="ALIGN(8)"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
RISCV_LINKER_START_DIRECTIVE_DEFAULT="STARTUP"
|
||||||
|
RISCV_LINKER_ALIGN_DIRECTIVE_DEFAULT="ALIGN_WITH_INPUT"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AC_DEFUN([RISCV_LINKCMD],[
|
||||||
|
AC_ARG_VAR([$1],[$2])dnl
|
||||||
|
[$1]=[$]{[$1]:-[$3]}
|
||||||
|
])
|
||||||
|
|
||||||
RISCV_LINKCMD([RISCV_RAM_REGION_BEGIN],[begin of the RAM region for linker command file (default is 0x40000000)],[${RISCV_RAM_REGION_BEGIN_DEFAULT}])
|
RISCV_LINKCMD([RISCV_RAM_REGION_BEGIN],[begin of the RAM region for linker command file (default is 0x40000000)],[${RISCV_RAM_REGION_BEGIN_DEFAULT}])
|
||||||
RISCV_LINKCMD([RISCV_RAM_REGION_SIZE],[size of the RAM region for linker command file (default 16MiB)],[0x01000000])
|
RISCV_LINKCMD([RISCV_RAM_REGION_SIZE],[size of the RAM region for linker command file (default 16MiB)],[0x01000000])
|
||||||
|
RISCV_LINKCMD([RISCV_LINKER_START_DIRECTIVE],[GNU LD understands STARTUP directive while LLVM/LLD does not and needs INPUT instead],[${RISCV_LINKER_START_DIRECTIVE_DEFAULT}])
|
||||||
|
RISCV_LINKCMD([RISCV_LINKER_ALIGN_DIRECTIVE],[LLD does not support ALIGN_WITH_INPUT directive],[${RISCV_LINKER_ALIGN_DIRECTIVE_DEFAULT}])
|
||||||
|
|
||||||
AC_CONFIG_FILES([
|
AC_CONFIG_FILES([
|
||||||
Makefile
|
Makefile
|
||||||
linkcmds:../../../../../../bsps/riscv/griscv/start/linkcmds.in
|
linkcmds:../../../../../../bsps/riscv/griscv/start/linkcmds.in
|
||||||
|
linkcmds.base:../../../../../../bsps/riscv/shared/start/linkcmds.base.in
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|||||||
@@ -67,6 +67,17 @@ case "${RTEMS_BSP}" in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
case "${RTEMS_BSP}" in
|
||||||
|
*clang)
|
||||||
|
RISCV_LINKER_START_DIRECTIVE_DEFAULT="INPUT"
|
||||||
|
RISCV_LINKER_ALIGN_DIRECTIVE_DEFAULT="ALIGN(8)"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
RISCV_LINKER_START_DIRECTIVE_DEFAULT="STARTUP"
|
||||||
|
RISCV_LINKER_ALIGN_DIRECTIVE_DEFAULT="ALIGN_WITH_INPUT"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
AC_DEFUN([RISCV_LINKCMD],[
|
AC_DEFUN([RISCV_LINKCMD],[
|
||||||
AC_ARG_VAR([$1],[$2])dnl
|
AC_ARG_VAR([$1],[$2])dnl
|
||||||
[$1]=[$]{[$1]:-[$3]}
|
[$1]=[$]{[$1]:-[$3]}
|
||||||
@@ -74,6 +85,8 @@ AC_ARG_VAR([$1],[$2])dnl
|
|||||||
|
|
||||||
RISCV_LINKCMD([RISCV_RAM_REGION_BEGIN],[begin of the RAM region for linker command file (default is 0x70000000 for 64-bit with -mcmodel=medlow and 0x80000000 for all other)],[${RISCV_RAM_REGION_BEGIN_DEFAULT}])
|
RISCV_LINKCMD([RISCV_RAM_REGION_BEGIN],[begin of the RAM region for linker command file (default is 0x70000000 for 64-bit with -mcmodel=medlow and 0x80000000 for all other)],[${RISCV_RAM_REGION_BEGIN_DEFAULT}])
|
||||||
RISCV_LINKCMD([RISCV_RAM_REGION_SIZE],[size of the RAM region for linker command file (default is 256 MiB for frdme310arty and 64 MiB for all other)],[${RISCV_RAM_REGION_SIZE_DEFAULT}])
|
RISCV_LINKCMD([RISCV_RAM_REGION_SIZE],[size of the RAM region for linker command file (default is 256 MiB for frdme310arty and 64 MiB for all other)],[${RISCV_RAM_REGION_SIZE_DEFAULT}])
|
||||||
|
RISCV_LINKCMD([RISCV_LINKER_START_DIRECTIVE],[GNU LD understands STARTUP directive while LLVM/LLD does not and needs INPUT instead],[${RISCV_LINKER_START_DIRECTIVE_DEFAULT}])
|
||||||
|
RISCV_LINKCMD([RISCV_LINKER_ALIGN_DIRECTIVE],[LLD does not support ALIGN_WITH_INPUT directive],[${RISCV_LINKER_ALIGN_DIRECTIVE_DEFAULT}])
|
||||||
|
|
||||||
AC_CONFIG_FILES([
|
AC_CONFIG_FILES([
|
||||||
Makefile
|
Makefile
|
||||||
|
|||||||
Reference in New Issue
Block a user