misc/bios: Update and improve linker script and related files
This commit is contained in:
parent
277cec6c88
commit
4b08bede0e
@ -3,7 +3,7 @@ extern bss_end
|
|||||||
extern entry
|
extern entry
|
||||||
extern gdt
|
extern gdt
|
||||||
|
|
||||||
section .entry
|
section .entry progbits alloc exec nowrite align=16
|
||||||
|
|
||||||
global _start
|
global _start
|
||||||
_start:
|
_start:
|
||||||
|
@ -5,8 +5,10 @@ ENTRY(_start)
|
|||||||
PHDRS
|
PHDRS
|
||||||
{
|
{
|
||||||
text_s2 PT_LOAD FLAGS((1 << 0) | (1 << 2)) ;
|
text_s2 PT_LOAD FLAGS((1 << 0) | (1 << 2)) ;
|
||||||
|
rodata_s2 PT_LOAD FLAGS((1 << 2)) ;
|
||||||
data_s2 PT_LOAD FLAGS((1 << 1) | (1 << 2)) ;
|
data_s2 PT_LOAD FLAGS((1 << 1) | (1 << 2)) ;
|
||||||
text_s3 PT_LOAD FLAGS((1 << 0) | (1 << 2)) ;
|
text_s3 PT_LOAD FLAGS((1 << 0) | (1 << 2)) ;
|
||||||
|
rodata_s3 PT_LOAD FLAGS((1 << 2)) ;
|
||||||
data_s3 PT_LOAD FLAGS((1 << 1) | (1 << 2)) ;
|
data_s3 PT_LOAD FLAGS((1 << 1) | (1 << 2)) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,17 +23,13 @@ SECTIONS
|
|||||||
*libgcc*.a:*(.text .text.*)
|
*libgcc*.a:*(.text .text.*)
|
||||||
} :text_s2
|
} :text_s2
|
||||||
|
|
||||||
.data.stage2 : {
|
.rodata.stage2 : {
|
||||||
|
*.s2.o(.rodata .rodata.*)
|
||||||
|
*libgcc*.a:*(.rodata .rodata.*)
|
||||||
|
|
||||||
build_id_s2 = .;
|
build_id_s2 = .;
|
||||||
KEEP(*build-id.s2.o(*))
|
KEEP(*build-id.s2.o(*))
|
||||||
|
|
||||||
*.s2.o(.no_unwind)
|
|
||||||
s2_data_begin = .;
|
|
||||||
*.s2.o(.data .data.*)
|
|
||||||
*libgcc*.a:*(.data .data.*)
|
|
||||||
s2_data_end = .;
|
|
||||||
*.s2.o(.rodata .rodata.*)
|
|
||||||
*libgcc*.a:*(.rodata .rodata.*)
|
|
||||||
#ifdef LINKER_STAGE2ONLY
|
#ifdef LINKER_STAGE2ONLY
|
||||||
/* stage2 missing symbols overrides */
|
/* stage2 missing symbols overrides */
|
||||||
stage2_map = .;
|
stage2_map = .;
|
||||||
@ -54,6 +52,15 @@ SECTIONS
|
|||||||
*(.stage2_map)
|
*(.stage2_map)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
} :rodata_s2
|
||||||
|
|
||||||
|
.data.stage2 : {
|
||||||
|
s2_data_begin = .;
|
||||||
|
*.s2.o(.data .data.*)
|
||||||
|
*libgcc*.a:*(.data .data.*)
|
||||||
|
s2_data_end = .;
|
||||||
|
|
||||||
|
*.s2.o(.no_unwind)
|
||||||
} :data_s2
|
} :data_s2
|
||||||
|
|
||||||
#ifndef LINKER_STAGE2ONLY
|
#ifndef LINKER_STAGE2ONLY
|
||||||
@ -62,19 +69,25 @@ SECTIONS
|
|||||||
*(.text .text.*)
|
*(.text .text.*)
|
||||||
} :text_s3
|
} :text_s3
|
||||||
|
|
||||||
.data.stage3 : {
|
.rodata.stage3 : {
|
||||||
|
*(.rodata .rodata.*)
|
||||||
|
|
||||||
build_id_s3 = .;
|
build_id_s3 = .;
|
||||||
KEEP(*build-id.s3.o(*))
|
KEEP(*build-id.s3.o(*))
|
||||||
|
|
||||||
*(.rodata .rodata.*)
|
|
||||||
#ifdef LINKER_NOMAP
|
#ifdef LINKER_NOMAP
|
||||||
full_map = .;
|
full_map = .;
|
||||||
#else
|
#else
|
||||||
*(.full_map)
|
*(.full_map)
|
||||||
#endif
|
#endif
|
||||||
*(.no_unwind)
|
} :rodata_s3
|
||||||
|
|
||||||
|
.data.stage3 : {
|
||||||
data_begin = .;
|
data_begin = .;
|
||||||
*(.data .data.*)
|
*(.data .data.*)
|
||||||
|
data_end = .;
|
||||||
|
|
||||||
|
*(.no_unwind)
|
||||||
} :data_s3
|
} :data_s3
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -88,7 +101,6 @@ SECTIONS
|
|||||||
*(.bss .bss.*)
|
*(.bss .bss.*)
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
bss_end = .;
|
bss_end = .;
|
||||||
data_end = .;
|
|
||||||
} :data_s3
|
} :data_s3
|
||||||
|
|
||||||
/DISCARD/ : {
|
/DISCARD/ : {
|
||||||
|
@ -585,6 +585,7 @@ static size_t rewound_memmap_entries = 0;
|
|||||||
static no_unwind uint8_t *rewound_data;
|
static no_unwind uint8_t *rewound_data;
|
||||||
#if defined (BIOS)
|
#if defined (BIOS)
|
||||||
static no_unwind uint8_t *rewound_s2_data;
|
static no_unwind uint8_t *rewound_s2_data;
|
||||||
|
static no_unwind uint8_t *rewound_bss;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern symbol data_begin;
|
extern symbol data_begin;
|
||||||
@ -592,6 +593,8 @@ extern symbol data_end;
|
|||||||
#if defined (BIOS)
|
#if defined (BIOS)
|
||||||
extern symbol s2_data_begin;
|
extern symbol s2_data_begin;
|
||||||
extern symbol s2_data_end;
|
extern symbol s2_data_end;
|
||||||
|
extern symbol bss_begin;
|
||||||
|
extern symbol bss_end;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void menu_init_term(void) {
|
static void menu_init_term(void) {
|
||||||
@ -629,12 +632,14 @@ noreturn void _menu(bool first_run) {
|
|||||||
size_t data_size = (uintptr_t)data_end - (uintptr_t)data_begin;
|
size_t data_size = (uintptr_t)data_end - (uintptr_t)data_begin;
|
||||||
#if defined (BIOS)
|
#if defined (BIOS)
|
||||||
size_t s2_data_size = (uintptr_t)s2_data_end - (uintptr_t)s2_data_begin;
|
size_t s2_data_size = (uintptr_t)s2_data_end - (uintptr_t)s2_data_begin;
|
||||||
|
size_t bss_size = (uintptr_t)bss_end - (uintptr_t)bss_begin;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (rewound_memmap != NULL) {
|
if (rewound_memmap != NULL) {
|
||||||
memcpy(data_begin, rewound_data, data_size);
|
memcpy(data_begin, rewound_data, data_size);
|
||||||
#if defined (BIOS)
|
#if defined (BIOS)
|
||||||
memcpy(s2_data_begin, rewound_s2_data, s2_data_size);
|
memcpy(s2_data_begin, rewound_s2_data, s2_data_size);
|
||||||
|
memcpy(bss_begin, rewound_bss, bss_size);
|
||||||
#endif
|
#endif
|
||||||
memcpy(memmap, rewound_memmap, rewound_memmap_entries * sizeof(struct memmap_entry));
|
memcpy(memmap, rewound_memmap, rewound_memmap_entries * sizeof(struct memmap_entry));
|
||||||
memmap_entries = rewound_memmap_entries;
|
memmap_entries = rewound_memmap_entries;
|
||||||
@ -642,6 +647,7 @@ noreturn void _menu(bool first_run) {
|
|||||||
rewound_data = ext_mem_alloc(data_size);
|
rewound_data = ext_mem_alloc(data_size);
|
||||||
#if defined (BIOS)
|
#if defined (BIOS)
|
||||||
rewound_s2_data = ext_mem_alloc(s2_data_size);
|
rewound_s2_data = ext_mem_alloc(s2_data_size);
|
||||||
|
rewound_bss = ext_mem_alloc(bss_size);
|
||||||
#endif
|
#endif
|
||||||
rewound_memmap = ext_mem_alloc(256 * sizeof(struct memmap_entry));
|
rewound_memmap = ext_mem_alloc(256 * sizeof(struct memmap_entry));
|
||||||
memcpy(rewound_memmap, memmap, memmap_entries * sizeof(struct memmap_entry));
|
memcpy(rewound_memmap, memmap, memmap_entries * sizeof(struct memmap_entry));
|
||||||
@ -649,6 +655,7 @@ noreturn void _menu(bool first_run) {
|
|||||||
memcpy(rewound_data, data_begin, data_size);
|
memcpy(rewound_data, data_begin, data_size);
|
||||||
#if defined (BIOS)
|
#if defined (BIOS)
|
||||||
memcpy(rewound_s2_data, s2_data_begin, s2_data_size);
|
memcpy(rewound_s2_data, s2_data_begin, s2_data_size);
|
||||||
|
memcpy(rewound_bss, bss_begin, bss_size);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user