Linker script from upstream ish
This commit is contained in:
parent
0c71360d71
commit
dc3de0135e
1 changed files with 62 additions and 8 deletions
70
link.ld
70
link.ld
|
@ -1,26 +1,80 @@
|
||||||
OUTPUT_ARCH(riscv)
|
OUTPUT_ARCH(riscv)
|
||||||
ENTRY(_start)
|
ENTRY(_start)
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* ensure that entry.S / _entry is at 0x80000000,
|
||||||
|
* where qemu's -kernel jumps.
|
||||||
|
*/
|
||||||
. = 0x80000000;
|
. = 0x80000000;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This section contains the code. This is, the machine language instructions
|
||||||
|
* that will be executed by the processor. In here we will find symbols
|
||||||
|
* that reference the functions in your object file.
|
||||||
|
*/
|
||||||
.text : {
|
.text : {
|
||||||
|
/* Match any section that starts with .text. */
|
||||||
*(.text*)
|
*(.text*)
|
||||||
|
|
||||||
|
/* Align the next section to a 4KB (page) boundary. */
|
||||||
|
. = ALIGN(0x1000);
|
||||||
|
|
||||||
|
/* Put the trampoline code here. */
|
||||||
|
_trampoline = .;
|
||||||
|
|
||||||
|
/* Match any section that starts with .trampsec. */
|
||||||
|
*(trampsec)
|
||||||
|
|
||||||
|
/* Align the next section to a 4KB (page) boundary. */
|
||||||
|
. = ALIGN(0x1000);
|
||||||
|
|
||||||
|
/* Assert that the trampoline code is exactly 4KB (page) in size. */
|
||||||
|
/* ASSERT(. - _trampoline == 0x1000, "error: trampoline larger than one page"); */
|
||||||
|
|
||||||
|
/* Define symbol etext to be the current location. */
|
||||||
|
PROVIDE(etext = .);
|
||||||
} :text
|
} :text
|
||||||
|
|
||||||
.bss : {
|
/*
|
||||||
*(.bss*)
|
* This contains any data that is marked as read only.
|
||||||
*(COMMON)
|
* It is not unusual to find this data interleaved with the text section.
|
||||||
|
*/
|
||||||
|
.rodata : {
|
||||||
|
/* Align on quadword boundary. */
|
||||||
|
. = ALIGN(16);
|
||||||
|
*(.srodata*) /* do not need to distinguish this from .rodata */
|
||||||
|
. = ALIGN(16);
|
||||||
|
*(.rodata*)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This section contains initialized global and static variables.
|
||||||
|
* Any global object that has been explicitly initialized to a value different than zero.
|
||||||
|
*/
|
||||||
.data : {
|
.data : {
|
||||||
*(.data)
|
. = ALIGN(16);
|
||||||
|
*(.sdata*) /* do not need to distinguish this from .data */
|
||||||
|
. = ALIGN(16);
|
||||||
|
*(.data*)
|
||||||
}
|
}
|
||||||
|
|
||||||
/DISCARD/ : {
|
/*
|
||||||
*(.eh_frame)
|
* Contains all uninitialized global and static var iables. These are usually
|
||||||
*(.comment)
|
* zeroed out by the startup code before we reach the main function. However,
|
||||||
|
* In an embedded system we usually provide our own startup code, which means
|
||||||
|
* we need to remember to do this ourselves.
|
||||||
|
*/
|
||||||
|
.bss : {
|
||||||
|
. = ALIGN(16);
|
||||||
|
*(.sbss*) /* do not need to distinguish this from .bss */
|
||||||
|
. = ALIGN(16);
|
||||||
|
*(.bss*)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Define symbol end as current location, note that this is not aligned, see vm.c */
|
||||||
|
PROVIDE(end = .);
|
||||||
}
|
}
|
||||||
|
|
||||||
PHDRS {
|
PHDRS {
|
||||||
|
|
Loading…
Add table
Reference in a new issue