Files
m241Neelima/vxworks-6.9/target/h/tool/common/ldscripts/genScript.sh
T
2026-07-30 11:19:44 +05:30

694 lines
21 KiB
Bash

#!/bin/sh
# genScript.sh
#
# a shell script to generate linker scripts.
#
# TODO:
# 1. convenience labels like etext, edata, end, and wrs_kernel_*_{start,end}
# are primarily used by ROM kernels and can most likely be omitted from RAM
# kernels. But they're harmless and it makes script sharing easier.
# 2. "classic" convenience labels (etext/edata/end) should be phased out in
# favor of the newer ones. Further, DAT has requested that we make the new
# names conform to wrsInitialCapitals style.
# 3. Due to the template generation strategy employed here, the final output
# may look a little awkwardly formatted and certainly is not as clean and
# simple as the early versions of the Diab scripts. Suggestions welcome.
# I actually think this might not be such a bad application for (gasp!) Tcl,
# so a future Tcl rewrite (which also helps windows users) is possible.
# 4. Currently GNU aligns everything to 16. This is probably overkill on many
# chips, and especially once everyone is ELF, the internal section alignment
# should take care of things -- except for convenience labels which need to
# guarantee 4 byte alignment for use with copyLongs and fillLongs.
# 5. General convergence...
mod_history()
{
cat <<'EOF'
/*
modification history
--------------------
02k,16sep14,mcm Fix for NOTYPE symbols (TCGNU-76)
02j,22apr13,g_x Adding *(.gnu.linkonce.s.*) for gnu. (WIND00414091)
02i,02apr13,g_x Add *(text.romentry) in the text segment for MIPS
(WIND00408686)
02h,12mar13,gvm Fix for WIND00376986. Close alignment gap
between _wrs_kernel_tls_vars_start and .tls_vars
02g,05jan12,my_ Place .copy.text and inflate.text into the .data
section for ARMARCH4
02f,06may10,slk updates for large memory model support
02e,12jan11,pgh Place .copy.text and inflate.text into the .data section
02d,09jul10,mcm Adding .wrs_build_vars for GNU as well.
02c,10mar10,gvm updates for icc
02b,16feb10,mcm Update to allow the 'AT' directive introduced for .boot and
.reset to be present for gnu only.
02a,15feb10,mcm Updates for GCC 4.3.3
01z,24jul09,pee adding wrs_build_vars section.
01y,13nov08,mcm Fix for WIND00143294 - gnu.linkonce.b sections not handled
correctly. Also added .bss.* and .sbss.*
01x,06may08,mcm Changes for GNU Dwarf EH
01w,16oct07,sn WIND00107939:fixed LMAs of .sdata etc. for Diab
01v,11jul07,pes Update and rename generation of .kseg0data segment. (Renamed
to .kseg0bss.) Add .rodata.cst16 segment.
01u,07jul07,mcm Fixing position of .tls* sections and adding support for tls
for GCC.
01t,08jun07,r_s add support for Small Data Area segments.
01s,09nov06,gvm Support for .tls_data, .tls_vars, and associated absolute
symbols in the Diab linker script
01r,25aug05,dlk Support .text.init, .text.fast, .data.init, .data.fast.
01r,29jul05,slk SPR 104264: fix MIPS romResident images
01q,06may05,rlg changes for MIPS specific devices
01p,03jul04,f_b Improved support for data alignment
01o,12dec03,sn added more .rodata.str1.* handlers
01n,04dec03,sn Diab: .rodata.* is not handled correctly by Diab linker; instead
use specific names
01m,28oct03,sn Diab: collapse .rodata.cst* sections into .rodata
01l,29may02,tpw Diab: pad out sections, needed for MIPS byteswap. SPR 78076
01k,24apr02,sn GNU: SPR 75835 - added support for relocatable script link.OUT
01j,19apr02,tpw Diab: provide _etext for ColdFire. SPR 75122
01i,06feb02,sn Both: place .got2 to handle tramp.o (_x_gnu_tramp.o).
01h,25jan02,tpw GNU: give debug sections explicit 0 addresses.
01g,14jan02,tpw Diab: place .eh_frame data, in case of insistent GNU objects.
01f,14dec01,tpw Diab: provide both underscore options of wrs_kernel* here too.
01e,05dec01,tpw Both: Add .boot and .reset section support, for PPC 4xx series
and Book E.
01d,05dec01,tpw Diab: Add .frame_info section to text region.
01c,03dec01,jab Diab: replaced LOAD() with AT()
01b,14nov01,tpw ALL: Correct some more bootrom/kernel issues.
01b,06nov01,tpw GNU: Add /DISCARD/ directive to discard uninteresting sections
01a,01nov01,tpw gnu script written
01a,29oct01,jab diab script written
*/
EOF
}
filename="$1"
TOOL="$2"
shift 2
style="$*"
align=16
am1=`expr $align - 1`
bind=""
[ "$TOOL" = icc ] && TOOL=gnu
[ "$TOOL" = diab ] && bind=BIND
[ "$TOOL" = gnu ] && dot_boot_text="
.boot $bind(wrs_kernel_text_start + wrs_kernel_rom_size - 0x800) : AT(wrs_kernel_text_start + wrs_kernel_rom_size - 0x800)
{
*(.boot)
}
.reset $bind(wrs_kernel_text_start + wrs_kernel_rom_size - 4) : AT(wrs_kernel_text_start + wrs_kernel_rom_size - 4)
{
*(.reset)
}
"
[ "$TOOL" = diab ] && dot_boot_text="
.boot $bind(wrs_kernel_text_start + wrs_kernel_rom_size - 0x800) :
{
*(.boot)
}
.reset $bind(wrs_kernel_text_start + wrs_kernel_rom_size - 4) :
{
*(.reset)
}
"
bind=""
if [ "$TOOL" = diab ]; then
bind=BIND
kseg0bss_text="
/* if LMM_ENABLED == 0 then this GROUP is legacy mode.
* legacy mode requires the .kseg0bss section be located at
* (wrs_kernel_bss_end & 0xbfffffff). the other sections in this
* group are not defined for legacy mode so they will not be included
* in the image
*
* if LMM_ENABLED != 0 then the GROUP should be
* located at the address specified by _VX_START_EXCPT_BASE.
*/
_VX_START_EXCPT_ADRS = LMM_ENABLED==0?wrs_kernel_bss_end & 0xbfffffff :_VX_START_EXCPT_BASE;
GROUP $bind(_VX_START_EXCPT_ADRS) :{
wrs_unmapped_text_start = .;
.vectors.text (TEXT) : {
*(.vectors.text)
}
.unmapped.text (TEXT) : {
*(.unmapped.text)
}
wrs_unmapped_text_end = .;
. = ((. + 31) & ~31);
wrs_unmapped_data_start = .;
.unmapped.data (DATA) : {
wrs_unmapped_data_start = .;
*(.unmapped.data)
}
wrs_unmapped_data_end = .;
. = ((. + 15) & ~15);
wrs_unmapped_bss_start = .;
.kseg0bss (BSS) : {
*(.kseg0bss)
}
wrs_unmapped_bss_end = .;
. = ((. + 15) & ~15);
}
"
kseg0bss_data="
_VX_START_EXCPT_ADRS = wrs_kernel_bss_end & 0xbfffffff;
GROUP $bind(_VX_START_EXCPT_ADRS) :
{
wrs_unmapped_text_start = .;
.vectors.text (TEXT) : {
*(.vectors.text)
}
.unmapped.text (TEXT) : {
*(.unmapped.text)
}
wrs_unmapped_text_end = .;
. = ((. + 31) & ~31);
wrs_unmapped_data_start = .;
.unmapped.data (DATA) : {
wrs_unmapped_data_start = .;
*(.unmapped.data)
}
wrs_unmapped_data_end = .;
. = ((. + 15) & ~15);
wrs_unmapped_bss_start = .;
.kseg0bss (BSS) : {
*(.kseg0bss)
}
wrs_unmapped_bss_end = .;
. = ((. + 15) & ~15);
}
"
wrs_kernel_text_start="wrs_kernel_text_start = .; _wrs_kernel_text_start = .;
*(.text)"
fi
bind=""
if [ "$TOOL" = gnu ]; then
bind=BIND
kseg0bss_text="
/* if LMM_ENABLED == 0 then this GROUP is legacy mode.
* legacy mode requires the .kseg0bss section be located at
* (wrs_kernel_bss_end & 0xbfffffff). the other sections in this
* group are not defined for legacy mode so they will not be included
* in the image
*
* if LMM_ENABLED != 1 then the GROUP should be
* located at the address specified by _VX_START_EXCPT_BASE. this
* is a large memory model configuration
*/
_VX_START_EXCPT_ADRS = LMM_ENABLED==0?wrs_kernel_bss_end & 0xbfffffff :_VX_START_EXCPT_BASE;
/* unmapped data and text sections */
.vectors.text _VX_START_EXCPT_ADRS :
{
wrs_unmapped_text_start = .;
*(.vectors.text)
*(.unmapped.text)
wrs_unmapped_text_end = .;
. = ALIGN(32);
}
.unmapped.data :
{
wrs_unmapped_data_start = .;
*(.unmapped.data)
wrs_unmapped_data_end = .;
. = ALIGN(32);
}
.kseg0bss :
{
wrs_unmapped_bss_start = .;
*(.kseg0bss)
. = ALIGN(32);
wrs_unmapped_bss_end = .;
}
"
kseg0bss_data="
_VX_START_EXCPT_ADRS = wrs_kernel_bss_end & 0xbfffffff;
/* unmapped data and text sections */
.vectors.text _VX_START_EXCPT_ADRS :
{
wrs_unmapped_text_start = .;
*(.vectors.text)
*(.unmapped.text)
wrs_unmapped_text_end = .;
. = ALIGN(32);
}
.unmapped.data :
{
wrs_unmapped_data_start = .;
*(.unmapped.data)
wrs_unmapped_data_end = .;
. = ALIGN(32);
}
.kseg0bss :
{
wrs_unmapped_bss_start = .;
*(.kseg0bss)
. = ALIGN(32);
wrs_unmapped_bss_end = .;
}
"
wrs_kernel_text_start="wrs_kernel_text_start = ABSOLUTE(.); _wrs_kernel_text_start = ABSOLUTE(.);
_VX_START_TEXT = .;
*(.text)"
fi
diab_data_group_text=" }
GROUP BIND(_VX_START_DATA) : {"
diab_data_group_aligned=" }
GROUP BIND((etext + _VX_DATA_ALIGN - 1) & -_VX_DATA_ALIGN) : {"
gnu_data_group_aligned=" . = ALIGN(_VX_DATA_ALIGN);"
named_debug_sections="
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }"
rom_at=""
dot_boot=""
kseg0bss=""
gnu_data_group=""
diab_data_group=""
zero=""
if [ "$TOOL" = diab ]; then
wrs_kernel_text_fast="wrs_kernel_text_fast = .; _wrs_kernel_text_fast = .;"
wrs_kernel_text_init="wrs_kernel_text_init = .; _wrs_kernel_text_init = .;"
wrs_kernel_text_end="wrs_kernel_text_end = .; _wrs_kernel_text_end = .;"
else
wrs_kernel_text_fast="wrs_kernel_text_fast = ABSOLUTE(.); _wrs_kernel_text_fast = ABSOLUTE(.);"
wrs_kernel_text_init="wrs_kernel_text_init = ABSOLUTE(.); _wrs_kernel_text_init = ABSOLUTE(.);"
wrs_kernel_text_end="wrs_kernel_text_end = ABSOLUTE(.); _wrs_kernel_text_end = ABSOLUTE(.);"
fi
etext="etext = .; _etext = .;"
wrs_kernel_copy_text=""
wrs_kernel_data_start="wrs_kernel_data_start = .; _wrs_kernel_data_start = .;"
wrs_kernel_data_fast="wrs_kernel_data_fast = .; _wrs_kernel_data_fast = .;"
wrs_kernel_data_init="wrs_kernel_data_init = .; _wrs_kernel_data_init = .;"
wrs_kernel_data_end="wrs_kernel_data_end = .; _wrs_kernel_data_end = .;"
edata="edata = .; _edata = .;"
wrs_kernel_bss_start="wrs_kernel_bss_start = .; _wrs_kernel_bss_start = .;"
wrs_kernel_bss_end="wrs_kernel_bss_end = .; _wrs_kernel_bss_end = .;"
wrs_kernel_tls_data_start="wrs_kernel_tls_data_start = .; _wrs_kernel_tls_data_start = .;"
wrs_kernel_tls_data_size="wrs_kernel_tls_data_size = . - wrs_kernel_tls_data_start; _wrs_kernel_tls_data_size = . - _wrs_kernel_tls_data_start;"
if [ "$TOOL" = diab ]; then
wrs_kernel_tls_data_align="wrs_kernel_tls_data_align = ALIGNOF(.tls_data); _wrs_kernel_tls_data_align = ALIGNOF(.tls_data);"
wrs_kernel_tls_vars_align=". = ((. + 7) & ~7);"
else
wrs_kernel_tls_data_align="wrs_kernel_tls_data_align = 16; _wrs_kernel_tls_data_align = 16;"
wrs_kernel_tls_vars_align=". = ALIGN(8);"
fi
wrs_kernel_tls_vars_start="wrs_kernel_tls_vars_start = .; _wrs_kernel_tls_vars_start = .;"
if [ "$TOOL" = diab ]; then
wrs_kernel_tls_vars_size="wrs_kernel_tls_vars_size = RAWSIZEOF(.tls_vars); _wrs_kernel_tls_vars_size = RAWSIZEOF(.tls_vars);"
else
wrs_kernel_tls_vars_size="wrs_kernel_tls_vars_size = SIZEOF(.tls_vars); _wrs_kernel_tls_vars_size = SIZEOF(.tls_vars);"
fi
end="end = .; _end = .;"
gp_mips_diab="_gp = ((. + $am1) & ~$am1) + 0x7ff0;"
gp_mips_gnu="_gp = ALIGN(16) + 0x7ff0; /* set gp for MIPS startup code */"
wrs_gnu_stub_warn="*(.text.*) *(.stub) *(.gnu.warning) *(.gnu.linkonce.t*)";
sec_align_diab=". = ((. + 3) & ~3);"
sec_align_gnu=". = ALIGN($align);"
end_align_diab="$sec_align_diab"
end_align_gnu="$sec_align_gnu"
kseg0bss_align_diab=". = ((. + 255) & ~255);"
kseg0bss_align_gnu=". = ALIGN(256);"
mips_lmm_enabled=""
dot_text_begin=".text :
{"
wrs_text_wired=""
mips_end="
/* add sizeof .kseg0bss to end and _end if it follows .bss section */
endAdd = LMM_ENABLED == 0 ? SIZEOF(.kseg0bss) : 0x0;
end = . + endAdd; _end = . + endAdd;"
is_rom=false
is_mips=false
is_armarch4=false
rom_section_at()
{
if $is_rom && [ "$TOOL" = diab ]; then
echo " AT(etext + ADDR($1) - ADDR(.data))"
fi
}
for arg
do
case "$arg" in
AOUT) named_debug_sections="" ;;
ROM) diab_data_group="$diab_data_group_text" ;
if [ "$kseg0bss" != "" ]; then
kseg0bss="$kseg0bss_data"
fi
is_rom=true ;
rom_at=" AT(etext)" ;;
RAM) gnu_data_group="$gnu_data_group_aligned" ;
diab_data_group="$diab_data_group_aligned" ;;
DOTBOOT) dot_boot="$dot_boot_text" ;;
ARMARCH4) is_armarch4=true ;;
MIPS) kseg0bss="$kseg0bss_text" ;
wrs_kernel_text_start="wrs_kernel_text_start = .; _wrs_kernel_text_start = .;" ;
end_align_gnu="$kseg0bss_align_gnu" ;
end_align_diab="$kseg0bss_align_diab" ;
sdabase_mips_diab="_SDA_BASE_ = _gp;" ;
dot_text_begin="" ;
wrs_text_wired="*(.text.romentry)
*(.text.wired)
*(.text)" ;
is_mips=true ;
end="$mips_end" ;;
OUT) zero="0"
dot_text_begin=".text 0 :
{"
wrs_kernel_text_start="_VX_START_TEXT = .;
*(.text)"
wrs_kernel_text_fast=""
wrs_kernel_text_init=""
wrs_kernel_text_end=""
etext=""
wrs_kernel_data_start=""
wrs_kernel_data_fast=""
wrs_kernel_data_init=""
wrs_kernel_data_end=""
edata=""
wrs_kernel_bss_start=""
wrs_kernel_bss_end=""
end=""
gp_mips_gnu=""
gp_mips_diab=""
sec_align_gnu=""
sec_align_diab=""
end_align_gnu=""
end_align_diab=""
wrs_kernel_tls_vars_size=""
wrs_kernel_tls_vars_start=""
wrs_kernel_tls_data_align=""
wrs_kernel_tls_data_size=""
wrs_kernel_tls_data_start=""
;;
*) echo "$0: '$arg' unknown." 1>&2 ; exit 1 ;;
esac
done
if [ "$is_rom" = true ] && [ "$is_armarch4" = true ]; then
wrs_kernel_copy_text="wrs_kernel_copy_text_start = .;
*(.copy.text)
wrs_kernel_copy_text_end = .;
*(.inflate.text)"
fi
if [ "$is_rom" = true ] && [ "$is_mips" = true ]; then
mips_lmm_enabled="LMM_ENABLED = 0;" ;
wrs_kernel_copy_text="wrs_kernel_copy_text_start = .;
*(.copy.text)
wrs_kernel_copy_text_end = .;
*(.inflate.text)"
wrs_gnu_stub_warn="*(.text.*) *(.stub) *(.gnu.warning) *(.gnu.linkonce.t*)";
if [ "$TOOL" = gnu ]; then
wrs_text_wired=".text :
{
wrs_kernel_text_start = ABSOLUTE(.); _wrs_kernel_text_start = ABSOLUTE(.);
_VX_START_TEXT = .;
*(.text.romentry)
*(.text)
*(.text.wired)" ;
wrs_kernel_text_start="" ;
else
wrs_text_wired="*(.text.romentry)
*(.text)
*(.text.wired)"
wrs_kernel_text_start="wrs_kernel_text_start = ABSOLUTE(.); _wrs_kernel_text_start = ABSOLUTE(.);" ;
fi
fi
if [ "$is_rom" = false ] && [ "$is_mips" = true ] && [ "$TOOL" = gnu ]; then
wrs_text_wired="wrs_kernel_text_wired_size = 0;
.text :
{
wrs_kernel_text_wired_start = .;
*(.text.romentry)
*(.text.wired)
wrs_kernel_text_wired_end = .;
wrs_kernel_text_wired_size = SIZEOF(.text);
}" ;
wrs_kernel_text_start=".text :
{
_VX_START_TEXT = wrs_kernel_text_wired_size == 0 ? . : wrs_kernel_text_wired_start;
wrs_kernel_text_start = _VX_START_TEXT;
_wrs_kernel_text_start = _VX_START_TEXT;
*(.text)" ;
wrs_gnu_stub_warn="*(.stub) *(.gnu.warning) *(.gnu.linkonce.t*)";
fi
cat <<EOF
/* $filename - $TOOL linker command file for VxWorks: $style */
/* Copyright 2001-2014 Wind River Systems, Inc. */
/* This file was automatically generated using tool/common/ldscripts. */
EOF
mod_history
if [ "$TOOL" = diab ]; then
cat <<EOF
SECTIONS {
$mips_lmm_enabled
GROUP BIND(_VX_START_TEXT) : {
.text (TEXT) : {
$wrs_kernel_text_start
$wrs_text_wired
$wrs_kernel_text_fast
*(.text.fast)
$wrs_kernel_text_init
*(.text.init)
*(.rdata) *(.rodata) *(.rodata.cst16) *(.rodata.cst8) *(.rodata.cst4) *(.rodata.str1.1) *(.rodata.str1.2) *(.rodata.str1.4) *(.rodata.str1.8) *(.rodata.str1.16) *(.rodata.str1.32) *(.rodata.str1.64) *(.rodata.str1.128) *(.rodata.str1.256)
*(.init) *(.fini)
*(.frame_info)
$sec_align_diab
}
.wrs_build_vars (CONST) : {
*(.wrs_build_vars)
$sec_align_diab
}
.sdata2 (TEXT) : {
*(.sdata2)
$sec_align_diab
}
$sec_align_diab
$etext
$wrs_kernel_text_end
$diab_data_group
.data (DATA)$rom_at : {
$wrs_kernel_copy_text
$wrs_kernel_data_start
*(.data)
$wrs_kernel_data_fast
*(.data.fast)
$wrs_kernel_data_init
*(.data.init)
*(.eh_frame) /* Some GNU objects insist on having .eh_frame data. */
*(.ctors)
*(.dtors)
*(.got2)
$sec_align_diab
}
$wrs_kernel_tls_data_start
.tls_data (DATA)`rom_section_at .tls_data` : {
*(.tls_data)
}
$wrs_kernel_tls_data_size
$wrs_kernel_tls_data_align
$wrs_kernel_tls_vars_align
$wrs_kernel_tls_vars_start
.tls_vars (DATA)`rom_section_at .tls_vars` : {
*(.tls_vars)
}
$wrs_kernel_tls_vars_size
$sec_align_diab
/* set gp for MIPS startup code */
$gp_mips_diab
$sdabase_mips_diab
.sdata (DATA)`rom_section_at .sdata` : {
*(.sdata)
$sec_align_diab
}
$sec_align_diab
$edata
$wrs_kernel_data_end
.sbss (BSS)`rom_section_at .sbss` : {
$wrs_kernel_bss_start
*(.sbss)
$sec_align_diab
}
.bss (BSS)`rom_section_at .bss` : {
*(.bss)
$sec_align_diab
}
$end_align_diab
$end
$wrs_kernel_bss_end
}
$kseg0bss$dot_boot}
EOF
else
# presume $TOOL = gnu
cat <<EOF
ENTRY(_start)
SECTIONS
{
$mips_lmm_enabled
$dot_text_begin
$wrs_text_wired
$wrs_kernel_text_start
$wrs_kernel_text_fast
*(.text.fast)
$wrs_kernel_text_init
*(.text.init)
$wrs_gnu_stub_warn
KEEP(*(.init)) KEEP(*(.fini))
*(.glue_7t) *(.glue_7) *(.rdata) /* for ARM */
*(.mips16.fn.*) *(.mips16.call.*) *(.reginfo) /* for MIPS */
*(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) *(.rodata1)
$sec_align_gnu
. = ALIGN (8);
*(.eh_frame_hdr)
. = ALIGN (8);
__EH_FRAME_BEGIN__ = .;
KEEP (*(.eh_frame))
LONG (0)
. = ALIGN (8);
*(.gcc_except_table .gcc_except_table.*)
}
.wrs_build_vars $zero : {
*(.wrs_build_vars)
$sec_align_gnu
}
.sdata2 $zero : {
_SDA2_BASE_ = . + 0x7ff0 ;
*(.sdata2) *(.sbss2) /* for PPC */
$sec_align_gnu
}
$sec_align_gnu
$wrs_kernel_text_end
$etext
$gnu_data_group
.data $zero :$rom_at
{
$wrs_kernel_copy_text
$wrs_kernel_data_start
_VX_START_DATA = .;
*(.data)
$wrs_kernel_data_fast
*(.data.fast)
$wrs_kernel_data_init
*(.data.init)
*(.data.*) *(.gnu.linkonce.d*) SORT(CONSTRUCTORS) *(.data1)
KEEP (*crtbegin.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
KEEP (*crtbegin.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
/* got*, dynamic, sdata*, lit[48], and sbss should follow _gp */
*(.got.plt) *(.got) *(.dynamic)
*(.got2)
*(.lit8) *(.lit4)
$sec_align_gnu
}
$wrs_kernel_tls_data_start
.tls_data $zero : {
*(.tls_data)
}
$wrs_kernel_tls_data_size
$wrs_kernel_tls_data_align
$wrs_kernel_tls_vars_align
$wrs_kernel_tls_vars_start
.tls_vars $zero : {
*(.tls_vars)
}
$wrs_kernel_tls_vars_size
$sec_align_gnu
$gp_mips_gnu
.sdata $zero :
{
_SDA_BASE_ = . + 0x7ff0 ;
*(.sdata) *(.sdata.*) *(.gnu.linkonce.s.*)
$sec_align_gnu
}
$sec_align_gnu
$edata
$wrs_kernel_data_end
.sbss $zero :
{
$wrs_kernel_bss_start
*(.sbss) *(.sbss.*) *(.scommon)
$sec_align_gnu
}
.bss $zero :
{
*(.dynbss) *(.bss) *(.bss.*) *(COMMON) *(.gnu.linkonce.b*)
$sec_align_gnu
}
$end_align_gnu
$end
$wrs_kernel_bss_end
$kseg0bss$dot_boot
/DISCARD/ :
{
*(.note) /* seen on Pentium ELF */
*(.comment) /* seen on PPC & SH ELF */
*(.pdr) /* seen on MIPS ELF */
}$named_debug_sections
}
EOF
fi