Skip to content

Commit

Permalink
linker: allow SoC to insert linker script fragments
Browse files Browse the repository at this point in the history
This allows the SoC to specify some additional linker script
fragments into the bss, data and read-only data sections.

For example, the Cypress PSOC6 has a few input sections that
must be put into bss and data sections. Without specifying
these in the linker script, they are consider orphan sections
and the placement is based on linker heuristic which is
arbitrary.

POSIX is not supported as the main linker script is
provided by the host system's binutils and we have no control
over it. Also, currently Xtensa SoCs have their own linker
scripts so there is no need to this feature.

Signed-off-by: Daniel Leung <[email protected]>
  • Loading branch information
dcpleung authored and nashif committed Oct 19, 2018
1 parent 005f6c7 commit 1134e59
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 0 deletions.
12 changes: 12 additions & 0 deletions include/arch/arc/v2/linker.ld
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ SECTIONS {
*(".rodata.*")
*(.gnu.linkonce.r.*)

#ifdef CONFIG_SOC_RODATA_LD
#include <soc-rodata.ld>
#endif

#ifdef CONFIG_CUSTOM_RODATA_LD
/* Located in project source directory */
#include <custom-rodata.ld>
Expand Down Expand Up @@ -228,6 +232,10 @@ SECTIONS {
KERNEL_INPUT_SECTION(".noinit.*")
*(".kernel_noinit.*")

#ifdef CONFIG_SOC_NOINIT_LD
#include <soc-noinit.ld>
#endif

} GROUP_LINK_IN(RAMABLE_REGION)

SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,) {
Expand All @@ -238,6 +246,10 @@ SECTIONS {
KERNEL_INPUT_SECTION(".data.*")
*(".kernel.*")

#ifdef CONFIG_SOC_RWDATA_LD
#include <soc-rwdata.ld>
#endif

#ifdef CONFIG_CUSTOM_RWDATA_LD
/* Located in project source directory */
#include <custom-rwdata.ld>
Expand Down
12 changes: 12 additions & 0 deletions include/arch/arm/cortex_m/scripts/linker.ld
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,10 @@ SECTIONS
*(".rodata.*")
*(.gnu.linkonce.r.*)

#ifdef CONFIG_SOC_RODATA_LD
#include <soc-rodata.ld>
#endif

#ifdef CONFIG_CUSTOM_RODATA_LD
/* Located in project source directory */
#include <custom-rodata.ld>
Expand Down Expand Up @@ -330,6 +334,10 @@ SECTIONS
KERNEL_INPUT_SECTION(".noinit.*")
*(".kernel_noinit.*")

#ifdef CONFIG_SOC_NOINIT_LD
#include <soc-noinit.ld>
#endif

} GROUP_LINK_IN(RAMABLE_REGION)

SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,)
Expand All @@ -339,6 +347,10 @@ SECTIONS
KERNEL_INPUT_SECTION(".data.*")
*(".kernel.*")

#ifdef CONFIG_SOC_RWDATA_LD
#include <soc-rwdata.ld>
#endif

#ifdef CONFIG_CUSTOM_RWDATA_LD
/* Located in project source directory */
#include <custom-rwdata.ld>
Expand Down
13 changes: 13 additions & 0 deletions include/arch/nios2/linker.ld
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,10 @@ SECTIONS
*(".rodata.*")
*(.gnu.linkonce.r.*)

#ifdef CONFIG_SOC_RODATA_LD
#include <soc-rodata.ld>
#endif

#ifdef CONFIG_CUSTOM_RODATA_LD
/* Located in project source directory */
#include <custom-rodata.ld>
Expand Down Expand Up @@ -174,6 +178,10 @@ SECTIONS
*(.data)
*(".data.*")

#ifdef CONFIG_SOC_RWDATA_LD
#include <soc-rwdata.ld>
#endif

#ifdef CONFIG_CUSTOM_RWDATA_LD
/* Located in project source directory */
#include <custom-rwdata.ld>
Expand Down Expand Up @@ -231,6 +239,11 @@ SECTIONS
*/
*(.noinit)
*(".noinit.*")

#ifdef CONFIG_SOC_NOINIT_LD
#include <soc-noinit.ld>
#endif

} GROUP_LINK_IN(RAMABLE_REGION)

/* Define linker symbols */
Expand Down
14 changes: 14 additions & 0 deletions include/arch/riscv32/common/linker.ld
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,11 @@ SECTIONS
*(.rodata)
*(".rodata.*")
*(.gnu.linkonce.r.*)

#ifdef CONFIG_SOC_RODATA_LD
#include <soc-rodata.ld>
#endif

} GROUP_LINK_IN(ROMABLE_REGION)

_image_rom_end = .;
Expand All @@ -117,6 +122,10 @@ SECTIONS
*(.sdata .sdata.* .gnu.linkonce.s.*)
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)

#ifdef CONFIG_SOC_RWDATA_LD
#include <soc-rwdata.ld>
#endif

} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)

#include <linker/common-ram.ld>
Expand Down Expand Up @@ -151,6 +160,11 @@ SECTIONS
*/
*(.noinit)
*(".noinit.*")

#ifdef CONFIG_SOC_NOINIT_LD
#include <soc-noinit.ld>
#endif

} GROUP_LINK_IN(RAMABLE_REGION)

_image_ram_end = .;
Expand Down
14 changes: 14 additions & 0 deletions include/arch/riscv32/pulpino/linker.ld
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@ SECTIONS
*(.rodata)
*(".rodata.*")
*(.gnu.linkonce.r.*)

#ifdef CONFIG_SOC_RODATA_LD
#include <soc-rodata.ld>
#endif

} GROUP_LINK_IN(RAMABLE_REGION)

_image_ram_start = .;
Expand All @@ -106,6 +111,10 @@ SECTIONS
*(.sdata .sdata.* .gnu.linkonce.s.*)
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)

#ifdef CONFIG_SOC_RWDATA_LD
#include <soc-rwdata.ld>
#endif

} GROUP_LINK_IN(RAMABLE_REGION)

SECTION_DATA_PROLOGUE(_BSS_SECTION_NAME,(NOLOAD),)
Expand Down Expand Up @@ -136,6 +145,11 @@ SECTIONS
*/
*(.noinit)
*(".noinit.*")

#ifdef CONFIG_SOC_NOINIT_LD
#include <soc-noinit.ld>
#endif

} GROUP_LINK_IN(RAMABLE_REGION)

_image_ram_end = .;
Expand Down
12 changes: 12 additions & 0 deletions include/arch/x86/linker.ld
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,10 @@ SECTIONS
#endif
#endif

#ifdef CONFIG_SOC_RODATA_LD
#include <soc-rodata.ld>
#endif

#ifdef CONFIG_CUSTOM_RODATA_LD
/* Located in project source directory */
#include <custom-rodata.ld>
Expand Down Expand Up @@ -244,6 +248,10 @@ SECTIONS
KERNEL_INPUT_SECTION(".noinit.*")
*(".kernel_noinit.*")

#ifdef CONFIG_SOC_NOINIT_LD
#include <soc-noinit.ld>
#endif

MMU_PAGE_ALIGN

} GROUP_DATA_LINK_IN(RAMABLE_REGION, RAMABLE_REGION)
Expand All @@ -257,6 +265,10 @@ SECTIONS
KERNEL_INPUT_SECTION(".data.*")
*(".kernel.*")

#ifdef CONFIG_SOC_RWDATA_LD
#include <soc-rwdata.ld>
#endif

#ifdef CONFIG_CUSTOM_RWDATA_LD
/* Located in project source directory */
#include <custom-rwdata.ld>
Expand Down
36 changes: 36 additions & 0 deletions soc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,39 @@ config SOC_COMPATIBLE_NRF52X

config SOC_COMPATIBLE_NRF52832
bool

#
# SOC_*_LD: SoC specific Linker script additions
#
config SOC_NOINIT_LD
bool
depends on (ARC || ARM || X86 || NIOS2 || RISCV32)
help
Include an SoC specific linker script fragment named soc-noinit.ld
for inserting additional data and linker directives into
the noinit section.

This only has effect if the SoC uses the common linker script
under include/arch/.

config SOC_RODATA_LD
bool
depends on (ARC || ARM || X86 || NIOS2 || RISCV32)
help
Include an SoC specific linker script fragment named soc-rodata.ld
for inserting additional data and linker directives into
the rodata section.

This only has effect if the SoC uses the common linker script
under include/arch/.

config SOC_RWDATA_LD
bool
depends on (ARC || ARM || X86 || NIOS2 || RISCV32)
help
Include an SoC specific linker script fragment named soc-rwdata.ld
for inserting additional data and linker directives into
the data section.

This only has effect if the SoC uses the common linker script
under include/arch/.

0 comments on commit 1134e59

Please sign in to comment.