Initial PRU port for libgloss and newlib
Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
This commit is contained in:
committed by
Jeff Johnston
parent
0574317971
commit
0c7734673a
80
libgloss/pru/ldscripts/gen-ld-scripts.sh
Executable file
80
libgloss/pru/ldscripts/gen-ld-scripts.sh
Executable file
@@ -0,0 +1,80 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
#
|
||||
# Copyright 2018-2019 Dimitar Dimitrov <dimitar@dinux.eu>
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
# Generate additional MCU-specific linker scripts by using the
|
||||
# default PRU-LD linker script.
|
||||
#
|
||||
# We do it automatically so that:
|
||||
# 1. We only change the default linker script in binutils.
|
||||
# 2. All the default script complexity stays in binutils.
|
||||
# 3. Here in libgloss we only bump the memory sizes to
|
||||
# allow large test programs to be executed.
|
||||
|
||||
dump_modified()
|
||||
{
|
||||
IMEM_SIZE=$1
|
||||
DMEM_SIZE=$2
|
||||
HEAP_SIZE=$3
|
||||
STACK_SIZE=$4
|
||||
|
||||
echo "/* WARNING: automatically generated from the default pru-ld script! */"
|
||||
echo -e "\n\n"
|
||||
pru-ld --verbose | awk "
|
||||
BEGIN { LDV_MARKER = 0; }
|
||||
{
|
||||
if (\$0 == \"==================================================\" )
|
||||
{
|
||||
LDV_MARKER++;
|
||||
}
|
||||
else if (LDV_MARKER != 1)
|
||||
{
|
||||
}
|
||||
else if (\$0 ~ /^ imem.*ORIGIN =.*LENGTH =/)
|
||||
{
|
||||
print \" imem (x) : ORIGIN = 0x20000000, LENGTH = $IMEM_SIZE\"
|
||||
}
|
||||
else if (\$0 ~ /^ dmem.*ORIGIN =.*LENGTH =/)
|
||||
{
|
||||
print \" dmem (rw!x) : ORIGIN = 0x0, LENGTH = $DMEM_SIZE\"
|
||||
}
|
||||
else if (\$0 ~ /^__HEAP_SIZE = DEFINED/)
|
||||
{
|
||||
print \"__HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : $HEAP_SIZE ;\";
|
||||
}
|
||||
else if (\$0 ~ /^__STACK_SIZE = DEFINED/)
|
||||
{
|
||||
print \"__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : $STACK_SIZE ;\";
|
||||
}
|
||||
else
|
||||
{
|
||||
print \$0;
|
||||
}
|
||||
}"
|
||||
}
|
||||
|
||||
# IMEM DMEM HEAP_SIZE STACK_SIZE
|
||||
dump_modified 256K 65536K "32 * 1024 * 1024" "1024 * 1024" | tee pruelf-sim.x
|
200
libgloss/pru/ldscripts/pruelf-sim.x
Normal file
200
libgloss/pru/ldscripts/pruelf-sim.x
Normal file
@@ -0,0 +1,200 @@
|
||||
/* WARNING: automatically generated from the default pru-ld script! */
|
||||
|
||||
|
||||
|
||||
/* Default linker script, for normal executables */
|
||||
OUTPUT_FORMAT("elf32-pru","elf32-pru","elf32-pru")
|
||||
OUTPUT_ARCH(pru)
|
||||
MEMORY
|
||||
{
|
||||
imem (x) : ORIGIN = 0x20000000, LENGTH = 256K
|
||||
dmem (rw!x) : ORIGIN = 0x0, LENGTH = 65536K
|
||||
}
|
||||
__HEAP_SIZE = DEFINED(__HEAP_SIZE) ? __HEAP_SIZE : 32 * 1024 * 1024 ;
|
||||
__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 1024 * 1024 ;
|
||||
PROVIDE (_stack_top = ORIGIN(dmem) + LENGTH(dmem));
|
||||
ENTRY (_start)
|
||||
SECTIONS
|
||||
{
|
||||
/* Read-only sections, merged into text segment: */
|
||||
.hash : { *(.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
.gnu.version_d : { *(.gnu.version_d) }
|
||||
.gnu.version_r : { *(.gnu.version_r) }
|
||||
.rel.init : { *(.rel.init) }
|
||||
.rela.init : { *(.rela.init) }
|
||||
.rel.text :
|
||||
{
|
||||
*(.rel.text)
|
||||
*(.rel.text.*)
|
||||
*(.rel.text:*)
|
||||
*(.rel.gnu.linkonce.t*)
|
||||
}
|
||||
.rela.text :
|
||||
{
|
||||
*(.rela.text)
|
||||
*(.rela.text.*)
|
||||
*(.rela.text:*)
|
||||
*(.rela.gnu.linkonce.t*)
|
||||
}
|
||||
.rel.fini : { *(.rel.fini) }
|
||||
.rela.fini : { *(.rela.fini) }
|
||||
.rel.rodata :
|
||||
{
|
||||
*(.rel.rodata)
|
||||
*(.rel.rodata.*)
|
||||
*(.rel.rodata:*)
|
||||
*(.rel.gnu.linkonce.r*)
|
||||
}
|
||||
.rela.rodata :
|
||||
{
|
||||
*(.rela.rodata)
|
||||
*(.rela.rodata.*)
|
||||
*(.rela.rodata:*)
|
||||
*(.rela.gnu.linkonce.r*)
|
||||
}
|
||||
.rel.data :
|
||||
{
|
||||
*(.rel.data)
|
||||
*(.rel.data.*)
|
||||
*(.rel.data:*)
|
||||
*(.rel.gnu.linkonce.d*)
|
||||
}
|
||||
.rela.data :
|
||||
{
|
||||
*(.rela.data)
|
||||
*(.rela.data.*)
|
||||
*(.rela.data:*)
|
||||
*(.rela.gnu.linkonce.d*)
|
||||
}
|
||||
.rel.init_array : { *(.rel.init_array) }
|
||||
.rela.init_array : { *(.rela.init_array) }
|
||||
.rel.fini_array : { *(.rel.fini_array) }
|
||||
.rela.fini_array : { *(.rela.fini_array) }
|
||||
.rel.got : { *(.rel.got) }
|
||||
.rela.got : { *(.rela.got) }
|
||||
.rel.bss : { *(.rel.bss) }
|
||||
.rela.bss : { *(.rela.bss) }
|
||||
.rel.plt : { *(.rel.plt) }
|
||||
.rela.plt : { *(.rela.plt) }
|
||||
/* Internal text space. */
|
||||
.text :
|
||||
{
|
||||
_text_start = . ;
|
||||
. = ALIGN(4);
|
||||
*(.init0) /* Start here after reset. */
|
||||
KEEP (*(.init0))
|
||||
. = ALIGN(4);
|
||||
*(.text)
|
||||
. = ALIGN(4);
|
||||
*(.text.*)
|
||||
. = ALIGN(4);
|
||||
*(.text:*)
|
||||
. = ALIGN(4);
|
||||
*(.gnu.linkonce.t*)
|
||||
. = ALIGN(4);
|
||||
_text_end = . ;
|
||||
} > imem
|
||||
.data :
|
||||
{
|
||||
/* Optional variable that user is prepared to have NULL address. */
|
||||
*(.data.atzero*)
|
||||
/* CRT is prepared for constructor/destructor table to have
|
||||
a "valid" NULL address. */
|
||||
__init_array_start = . ;
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)))
|
||||
KEEP (*(.init_array))
|
||||
__init_array_end = . ;
|
||||
__fini_array_start = . ;
|
||||
KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
|
||||
KEEP (*(.fini_array))
|
||||
__fini_array_end = . ;
|
||||
/* DATA memory starts at address 0. So to avoid placing a valid static
|
||||
variable at the invalid NULL address, we introduce the .data.atzero
|
||||
section. If CRT can make some use of it - great. Otherwise skip a
|
||||
word. In all cases .data/.bss sections must start at non-zero. */
|
||||
. += (. == 0 ? 4 : 0);
|
||||
PROVIDE (_data_start = .) ;
|
||||
*(.data)
|
||||
*(.data*)
|
||||
*(.data:*)
|
||||
*(.rodata) /* We need to include .rodata here if gcc is used. */
|
||||
*(.rodata.*) /* with -fdata-sections. */
|
||||
*(.rodata:*)
|
||||
*(.gnu.linkonce.d*)
|
||||
*(.gnu.linkonce.r*)
|
||||
. = ALIGN(4);
|
||||
PROVIDE (_data_end = .) ;
|
||||
} > dmem
|
||||
.resource_table :
|
||||
{
|
||||
KEEP (*(.resource_table))
|
||||
} > dmem
|
||||
.bss :
|
||||
{
|
||||
PROVIDE (_bss_start = .) ;
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
*(.bss:*)
|
||||
*(.gnu.linkonce.b*)
|
||||
*(COMMON)
|
||||
PROVIDE (_bss_end = .) ;
|
||||
} > dmem
|
||||
/* Global data not cleared after reset. */
|
||||
.noinit :
|
||||
{
|
||||
PROVIDE (_noinit_start = .) ;
|
||||
*(.noinit)
|
||||
PROVIDE (_noinit_end = .) ;
|
||||
PROVIDE (_heap_start = .) ;
|
||||
. += __HEAP_SIZE ;
|
||||
/* Stack is not here really. It will be put at the end of DMEM.
|
||||
But we take into account its size here, in order to allow
|
||||
for MEMORY overflow checking during link time. */
|
||||
. += __STACK_SIZE ;
|
||||
} > dmem
|
||||
/* 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) }
|
||||
.note.gnu.build-id : { *(.note.gnu.build-id) }
|
||||
/* 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 .gnu.linkonce.wi.*) }
|
||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||
.debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
|
||||
.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) }
|
||||
/* DWARF 3 */
|
||||
.debug_pubtypes 0 : { *(.debug_pubtypes) }
|
||||
.debug_ranges 0 : { *(.debug_ranges) }
|
||||
/* DWARF Extension. */
|
||||
.debug_macro 0 : { *(.debug_macro) }
|
||||
.debug_addr 0 : { *(.debug_addr) }
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user