From 353984bb9720f31f7e27ac761a718f7fa564ba82 Mon Sep 17 00:00:00 2001 From: Callum Farmer Date: Tue, 11 Jun 2024 14:13:31 +0100 Subject: [PATCH] Move riscv64 default to objcopy Fixes ncroxon/gnu-efi#11 Signed-off-by: Callum Farmer --- Make.defaults | 12 +- apps/Makefile | 14 ++- gnuefi/Makefile | 4 +- gnuefi/crt0-efi-riscv64-local.S | 185 +++++++++++++++++++++++++++++++ gnuefi/crt0-efi-riscv64.S | 130 ---------------------- gnuefi/elf_riscv64_efi.lds | 77 +++++-------- gnuefi/elf_riscv64_efi_local.lds | 143 ++++++++++++++++++++++++ 7 files changed, 380 insertions(+), 185 deletions(-) create mode 100644 gnuefi/crt0-efi-riscv64-local.S create mode 100644 gnuefi/elf_riscv64_efi_local.lds diff --git a/Make.defaults b/Make.defaults index 1b7d8e9..2edcb02 100755 --- a/Make.defaults +++ b/Make.defaults @@ -178,12 +178,22 @@ endif # ifneq ($(ARCH),arm) ifneq ($(ARCH),mips64el) -ifneq ($(ARCH),riscv64) export HAVE_EFI_OBJCOPY=y endif endif + +ifeq ($(ARCH),riscv64) +export SYSTEM_HAS_EFI_OBJCOPY ?= 0 endif +ifeq ($(HAVE_EFI_OBJCOPY),y) +export SYSTEM_HAS_EFI_OBJCOPY ?= 1 +else +export SYSTEM_HAS_EFI_OBJCOPY ?= 0 +endif + + + ifeq ($(ARCH),arm) CFLAGS += -marm endif diff --git a/apps/Makefile b/apps/Makefile index 41f6c71..05a6f0f 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -44,15 +44,23 @@ include $(SRCDIR)/../Make.defaults LINUX_HEADERS = /usr/src/sys/build APPSDIR = $(LIBDIR)/gnuefi/apps CPPFLAGS += -D__KERNEL__ -I$(LINUX_HEADERS)/include + +ifneq ($(HAVE_EFI_OBJCOPY),) +ifeq ($(SYSTEM_HAS_EFI_OBJCOPY),0) +CRT0_LOCAL = -local +LDS_LOCAL = _local +endif +endif + ifeq ($(IS_MINGW32),) # The CRT0 libs are only needed for non MinGW platforms CRT0_LIBS = -lgnuefi endif ifneq ($(CRT0_LIBS),) -CRTOBJS = $(TOPDIR)/$(ARCH)/gnuefi/crt0-efi-$(ARCH).o +CRTOBJS = $(TOPDIR)/$(ARCH)/gnuefi/crt0-efi-$(ARCH)$(CRT0_LOCAL).o -LDSCRIPT = $(TOPDIR)/gnuefi/elf_$(ARCH)_efi.lds +LDSCRIPT = $(TOPDIR)/gnuefi/elf_$(ARCH)_efi$(LDS_LOCAL).lds ifneq (,$(findstring FreeBSD,$(OS))) LDSCRIPT = $(TOPDIR)/gnuefi/elf_$(ARCH)_fbsd_efi.lds endif @@ -81,7 +89,7 @@ SUBSYSTEM := 0xa $(TARGET_BSDRIVERS): SUBSYSTEM = 0xb $(TARGET_RTDRIVERS): SUBSYSTEM = 0xc -ifneq ($(HAVE_EFI_OBJCOPY),) +ifeq ($(SYSTEM_HAS_EFI_OBJCOPY),1) FORMAT := --target efi-app-$(ARCH) $(TARGET_BSDRIVERS): FORMAT=--target efi-bsdrv-$(ARCH) diff --git a/gnuefi/Makefile b/gnuefi/Makefile index ff768a8..aace99d 100644 --- a/gnuefi/Makefile +++ b/gnuefi/Makefile @@ -80,7 +80,7 @@ endif # on aarch64, avoid jump tables before all relocations have been processed reloc_aarch64.o: CFLAGS += -fno-jump-tables -ifneq (,$(filter $(ARCH),aarch64)) +ifneq (,$(filter $(ARCH),aarch64 riscv64)) CRT0_LOCAL_TARGET = crt0-efi-$(ARCH)-local.o endif @@ -116,7 +116,7 @@ ifneq (,$(findstring FreeBSD,$(OS))) ifeq ($(ARCH),x86_64) $(INSTALL) -m 644 $(SRCDIR)/elf_$(ARCH)_fbsd_efi.lds $(INSTALLROOT)$(LIBDIR) else - ifneq (,$(filter $(ARCH),aarch64)) + ifneq (,$(filter $(ARCH),aarch64 riscv64)) $(INSTALL) -m 644 $(SRCDIR)/elf_$(ARCH)_efi_local.lds $(INSTALLROOT)$(LIBDIR) endif $(INSTALL) -m 644 $(SRCDIR)/elf_$(ARCH)_efi.lds $(INSTALLROOT)$(LIBDIR) diff --git a/gnuefi/crt0-efi-riscv64-local.S b/gnuefi/crt0-efi-riscv64-local.S new file mode 100644 index 0000000..fe3813c --- /dev/null +++ b/gnuefi/crt0-efi-riscv64-local.S @@ -0,0 +1,185 @@ +/* SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause */ +/* + * crt0-efi-riscv64-local.S - PE/COFF header for RISC-V 64 EFI applications (without suitable objcopy) + * + * Copyright (C) 2014 Linaro Ltd. + * Copyright (C) 2018 Alexander Graf + * + * 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 and this list of conditions, without modification. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License as published by the Free Software Foundation; + * either version 2 of the License, or (at your option) any later version. + */ + + .section .text.head + + /* + * Magic "MZ" signature for PE/COFF + */ + .globl ImageBase +ImageBase: + .ascii "MZ" + .skip 58 // 'MZ' + pad + offset == 64 + .4byte pe_header - ImageBase // Offset to the PE header. +pe_header: + .ascii "PE" + .2byte 0 +coff_header: + .2byte 0x5064 // riscv64 + .2byte 4 // nr_sections + .4byte 0 // TimeDateStamp + .4byte 0 // PointerToSymbolTable + .4byte 0 // NumberOfSymbols + .2byte section_table - optional_header // SizeOfOptionalHeader + .2byte 0x206 // Characteristics. + // IMAGE_FILE_DEBUG_STRIPPED | + // IMAGE_FILE_EXECUTABLE_IMAGE | + // IMAGE_FILE_LINE_NUMS_STRIPPED +optional_header: + .2byte 0x20b // PE32+ format + .byte 0x02 // MajorLinkerVersion + .byte 0x14 // MinorLinkerVersion + .4byte _text_size - ImageBase // SizeOfCode + .4byte _alldata_size - ImageBase // SizeOfInitializedData + .4byte 0 // SizeOfUninitializedData + .4byte _start - ImageBase // AddressOfEntryPoint + .4byte _text - ImageBase // BaseOfCode + +extra_header_fields: + .8byte 0 // ImageBase + .4byte 0x1000 // SectionAlignment + .4byte 0x1000 // FileAlignment + .2byte 0 // MajorOperatingSystemVersion + .2byte 0 // MinorOperatingSystemVersion + .2byte 0 // MajorImageVersion + .2byte 0 // MinorImageVersion + .2byte 0 // MajorSubsystemVersion + .2byte 0 // MinorSubsystemVersion + .4byte 0 // Win32VersionValue + + .4byte _image_end - ImageBase // SizeOfImage + + // Everything before the kernel image is considered part of the header + .4byte _text - ImageBase // SizeOfHeaders + .4byte 0 // CheckSum + .2byte 0 // Subsystem + .2byte 0 // DllCharacteristics + .8byte 0 // SizeOfStackReserve + .8byte 0 // SizeOfStackCommit + .8byte 0 // SizeOfHeapReserve + .8byte 0 // SizeOfHeapCommit + .4byte 0 // LoaderFlags + .4byte 0x10 // NumberOfRvaAndSizes + + .8byte 0 // ExportTable + .8byte 0 // ImportTable + .8byte 0 // ResourceTable + .8byte 0 // ExceptionTable + .8byte 0 // CertificationTable + .4byte _reloc - ImageBase // BaseRelocationTable (VirtualAddress) + .4byte _reloc_vsize - ImageBase // BaseRelocationTable (Size) + .8byte 0 // Debug + .8byte 0 // Architecture + .8byte 0 // Global Ptr + .8byte 0 // TLS Table + .8byte 0 // Load Config Table + .8byte 0 // Bound Import + .8byte 0 // IAT + .8byte 0 // Delay Import Descriptor + .8byte 0 // CLR Runtime Header + .8byte 0 // Reserved, must be zero + + // Section table +section_table: + + .ascii ".text\0\0\0" + .4byte _text_vsize - ImageBase // VirtualSize + .4byte _text - ImageBase // VirtualAddress + .4byte _text_size - ImageBase // SizeOfRawData + .4byte _text - ImageBase // PointerToRawData + .4byte 0 // PointerToRelocations (0 for executables) + .4byte 0 // PointerToLineNumbers (0 for executables) + .2byte 0 // NumberOfRelocations (0 for executables) + .2byte 0 // NumberOfLineNumbers (0 for executables) + .4byte 0x60000020 // Characteristics (section flags) + + /* + * The EFI application loader requires a relocation section + * because EFI applications must be relocatable. This is a + * dummy section as far as we are concerned. + */ + .ascii ".reloc\0\0" + .4byte _reloc_vsize - ImageBase // VirtualSize + .4byte _reloc - ImageBase // VirtualAddress + .4byte _reloc_size - ImageBase // SizeOfRawData + .4byte _reloc - ImageBase // PointerToRawData + .4byte 0 // PointerToRelocations + .4byte 0 // PointerToLineNumbers + .2byte 0 // NumberOfRelocations + .2byte 0 // NumberOfLineNumbers + .4byte 0x42000040 // Characteristics (section flags) + + .ascii ".data\0\0\0" + .4byte _data_vsize - ImageBase // VirtualSize + .4byte _data - ImageBase // VirtualAddress + .4byte _data_size - ImageBase // SizeOfRawData + .4byte _data - ImageBase // PointerToRawData + .4byte 0 // PointerToRelocations + .4byte 0 // PointerToLineNumbers + .2byte 0 // NumberOfRelocations + .2byte 0 // NumberOfLineNumbers + .4byte 0xC0000040 // Characteristics (section flags) + + .ascii ".rodata\0" + .4byte _rodata_vsize - ImageBase // VirtualSize + .4byte _rodata - ImageBase // VirtualAddress + .4byte _rodata_size - ImageBase // SizeOfRawData + .4byte _rodata - ImageBase // PointerToRawData + .4byte 0 // PointerToRelocations + .4byte 0 // PointerToLineNumbers + .2byte 0 // NumberOfRelocations + .2byte 0 // NumberOfLineNumbers + .4byte 0x40000040 // Characteristics (section flags) + + .text + .globl _start + .type _start,%function +_start: + addi sp, sp, -24 + sd a0, 0(sp) + sd a1, 8(sp) + sd ra, 16(sp) + lla a0, ImageBase + lla a1, _DYNAMIC + call _relocate + bne a0, zero, 0f + ld a1, 8(sp) + ld a0, 0(sp) + call _entry + ld ra, 16(sp) +0: addi sp, sp, 24 + ret + +// hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: + + .data +dummy: .4byte 0 + +#define IMAGE_REL_ABSOLUTE 0 + .section .reloc, "a" +label1: + .4byte dummy-label1 // Page RVA + .4byte 12 // Block Size (2*4+2*2), must be aligned by 32 Bits + .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy + .2byte (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy + +#if defined(__ELF__) && defined(__linux__) + .section .note.GNU-stack,"",%progbits +#endif diff --git a/gnuefi/crt0-efi-riscv64.S b/gnuefi/crt0-efi-riscv64.S index 2d35d11..e8b0c08 100644 --- a/gnuefi/crt0-efi-riscv64.S +++ b/gnuefi/crt0-efi-riscv64.S @@ -16,136 +16,6 @@ * either version 2 of the License, or (at your option) any later version. */ - .section .text.head - - /* - * Magic "MZ" signature for PE/COFF - */ - .globl ImageBase -ImageBase: - .ascii "MZ" - .skip 58 // 'MZ' + pad + offset == 64 - .4byte pe_header - ImageBase // Offset to the PE header. -pe_header: - .ascii "PE" - .2byte 0 -coff_header: - .2byte 0x5064 // riscv64 - .2byte 4 // nr_sections - .4byte 0 // TimeDateStamp - .4byte 0 // PointerToSymbolTable - .4byte 0 // NumberOfSymbols - .2byte section_table - optional_header // SizeOfOptionalHeader - .2byte 0x206 // Characteristics. - // IMAGE_FILE_DEBUG_STRIPPED | - // IMAGE_FILE_EXECUTABLE_IMAGE | - // IMAGE_FILE_LINE_NUMS_STRIPPED -optional_header: - .2byte 0x20b // PE32+ format - .byte 0x02 // MajorLinkerVersion - .byte 0x14 // MinorLinkerVersion - .4byte _text_size - ImageBase // SizeOfCode - .4byte _alldata_size - ImageBase // SizeOfInitializedData - .4byte 0 // SizeOfUninitializedData - .4byte _start - ImageBase // AddressOfEntryPoint - .4byte _text - ImageBase // BaseOfCode - -extra_header_fields: - .8byte 0 // ImageBase - .4byte 0x1000 // SectionAlignment - .4byte 0x1000 // FileAlignment - .2byte 0 // MajorOperatingSystemVersion - .2byte 0 // MinorOperatingSystemVersion - .2byte 0 // MajorImageVersion - .2byte 0 // MinorImageVersion - .2byte 0 // MajorSubsystemVersion - .2byte 0 // MinorSubsystemVersion - .4byte 0 // Win32VersionValue - - .4byte _image_end - ImageBase // SizeOfImage - - // Everything before the kernel image is considered part of the header - .4byte _text - ImageBase // SizeOfHeaders - .4byte 0 // CheckSum - .2byte 0 // Subsystem - .2byte 0 // DllCharacteristics - .8byte 0 // SizeOfStackReserve - .8byte 0 // SizeOfStackCommit - .8byte 0 // SizeOfHeapReserve - .8byte 0 // SizeOfHeapCommit - .4byte 0 // LoaderFlags - .4byte 0x10 // NumberOfRvaAndSizes - - .8byte 0 // ExportTable - .8byte 0 // ImportTable - .8byte 0 // ResourceTable - .8byte 0 // ExceptionTable - .8byte 0 // CertificationTable - .4byte _reloc - ImageBase // BaseRelocationTable (VirtualAddress) - .4byte _reloc_vsize - ImageBase // BaseRelocationTable (Size) - .8byte 0 // Debug - .8byte 0 // Architecture - .8byte 0 // Global Ptr - .8byte 0 // TLS Table - .8byte 0 // Load Config Table - .8byte 0 // Bound Import - .8byte 0 // IAT - .8byte 0 // Delay Import Descriptor - .8byte 0 // CLR Runtime Header - .8byte 0 // Reserved, must be zero - - // Section table -section_table: - - .ascii ".text\0\0\0" - .4byte _text_vsize - ImageBase // VirtualSize - .4byte _text - ImageBase // VirtualAddress - .4byte _text_size - ImageBase // SizeOfRawData - .4byte _text - ImageBase // PointerToRawData - .4byte 0 // PointerToRelocations (0 for executables) - .4byte 0 // PointerToLineNumbers (0 for executables) - .2byte 0 // NumberOfRelocations (0 for executables) - .2byte 0 // NumberOfLineNumbers (0 for executables) - .4byte 0x60000020 // Characteristics (section flags) - - /* - * The EFI application loader requires a relocation section - * because EFI applications must be relocatable. This is a - * dummy section as far as we are concerned. - */ - .ascii ".reloc\0\0" - .4byte _reloc_vsize - ImageBase // VirtualSize - .4byte _reloc - ImageBase // VirtualAddress - .4byte _reloc_size - ImageBase // SizeOfRawData - .4byte _reloc - ImageBase // PointerToRawData - .4byte 0 // PointerToRelocations - .4byte 0 // PointerToLineNumbers - .2byte 0 // NumberOfRelocations - .2byte 0 // NumberOfLineNumbers - .4byte 0x42000040 // Characteristics (section flags) - - .ascii ".data\0\0\0" - .4byte _data_vsize - ImageBase // VirtualSize - .4byte _data - ImageBase // VirtualAddress - .4byte _data_size - ImageBase // SizeOfRawData - .4byte _data - ImageBase // PointerToRawData - .4byte 0 // PointerToRelocations - .4byte 0 // PointerToLineNumbers - .2byte 0 // NumberOfRelocations - .2byte 0 // NumberOfLineNumbers - .4byte 0xC0000040 // Characteristics (section flags) - - .ascii ".rodata\0" - .4byte _rodata_vsize - ImageBase // VirtualSize - .4byte _rodata - ImageBase // VirtualAddress - .4byte _rodata_size - ImageBase // SizeOfRawData - .4byte _rodata - ImageBase // PointerToRawData - .4byte 0 // PointerToRelocations - .4byte 0 // PointerToLineNumbers - .2byte 0 // NumberOfRelocations - .2byte 0 // NumberOfLineNumbers - .4byte 0x40000040 // Characteristics (section flags) - .text .globl _start .type _start,%function diff --git a/gnuefi/elf_riscv64_efi.lds b/gnuefi/elf_riscv64_efi.lds index c6c9df9..3360641 100644 --- a/gnuefi/elf_riscv64_efi.lds +++ b/gnuefi/elf_riscv64_efi.lds @@ -5,37 +5,37 @@ OUTPUT_ARCH(riscv) ENTRY(_start) SECTIONS { - .text 0 : { - *(.text.head) - . = ALIGN(4096); + . = 0; + ImageBase = .; + /* .hash and/or .gnu.hash MUST come first! */ + .hash : { *(.hash) } + .gnu.hash : { *(.gnu.hash) } + . = ALIGN(4096); + .eh_frame : { *(.eh_frame) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + .gcc_except_table : { *(.gcc_except_table*) } + . = ALIGN(4096); + .text : { _text = .; *(.text) *(.text.*) *(.gnu.linkonce.t.*) *(.plt) . = ALIGN(16); - _evtext = .; - . = ALIGN(4096); - _etext = .; - } =0 - _text_vsize = _evtext - _text; + } + _etext = .; _text_size = _etext - _text; + . = ALIGN(65536); + .reloc : + { + KEEP (*(.reloc)) + } . = ALIGN(4096); - _reloc = .; - .reloc : { - *(.reloc) - _evreloc = .; - . = ALIGN(4096); - _ereloc = .; - } =0 - _reloc_vsize = _evreloc - _reloc; - _reloc_size = _ereloc - _reloc; - . = ALIGN(4096); - _data = .; .dynamic : { *(.dynamic) } . = ALIGN(4096); .data : { + _data = .; *(.sdata) *(.data) *(.data1) @@ -77,20 +77,15 @@ SECTIONS *(.sbss) *(.scommon) *(.dynbss) - *(.bss) - *(.bss.*) + *(.bss*) *(COMMON) + *(.rel.local) . = ALIGN(16); + _bss_end = .; - _evdata = .; - . = ALIGN(4096); - _edata = .; - } =0 - _data_vsize = _evdata - _data; - _data_size = _edata - _data; + } . = ALIGN(4096); - _rodata = .; .rela : { *(.rela.text*) @@ -107,16 +102,10 @@ SECTIONS . = ALIGN(4096); .rela.plt : { *(.rela.plt) } . = ALIGN(4096); - .rodata : { - *(.rodata*) - _evrodata = .; - . = ALIGN(4096); - _erodata = .; - } =0 - _rodata_vsize = _evrodata - _rodata; - _rodata_size = _erodata - _rodata; - _image_end = .; - _alldata_size = _image_end - _reloc; + .rodata : { *(.rodata*) } + . = ALIGN(512); + _edata = .; + _data_size = _edata - _data; . = ALIGN(4096); .dynsym : { *(.dynsym) } @@ -124,20 +113,10 @@ SECTIONS .dynstr : { *(.dynstr) } . = ALIGN(4096); .note.gnu.build-id : { *(.note.gnu.build-id) } - . = ALIGN(4096); - .hash : { *(.hash) } - . = ALIGN(4096); - .gnu.hash : { *(.gnu.hash) } - . = ALIGN(4096); - .eh_frame : { *(.eh_frame) } - .eh_frame_hdr : { *(.eh_frame_hdr) } - . = ALIGN(4096); - .gcc_except_table : { *(.gcc_except_table*) } - /DISCARD/ : + .ignored.reloc : { *(.rela.reloc) *(.note.GNU-stack) } .comment 0 : { *(.comment) } } - diff --git a/gnuefi/elf_riscv64_efi_local.lds b/gnuefi/elf_riscv64_efi_local.lds new file mode 100644 index 0000000..c6c9df9 --- /dev/null +++ b/gnuefi/elf_riscv64_efi_local.lds @@ -0,0 +1,143 @@ +/* SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause */ + +OUTPUT_FORMAT("elf64-littleriscv", "elf64-littleriscv", "elf64-littleriscv") +OUTPUT_ARCH(riscv) +ENTRY(_start) +SECTIONS +{ + .text 0 : { + *(.text.head) + . = ALIGN(4096); + _text = .; + *(.text) + *(.text.*) + *(.gnu.linkonce.t.*) + *(.plt) + . = ALIGN(16); + _evtext = .; + . = ALIGN(4096); + _etext = .; + } =0 + _text_vsize = _evtext - _text; + _text_size = _etext - _text; + . = ALIGN(4096); + _reloc = .; + .reloc : { + *(.reloc) + _evreloc = .; + . = ALIGN(4096); + _ereloc = .; + } =0 + _reloc_vsize = _evreloc - _reloc; + _reloc_size = _ereloc - _reloc; + . = ALIGN(4096); + _data = .; + .dynamic : { *(.dynamic) } + . = ALIGN(4096); + .data : + { + *(.sdata) + *(.data) + *(.data1) + *(.data.*) + *(.got.plt) + *(.got) + + /* + * Note that these aren't the using the GNU "CONSTRUCTOR" output section + * command, so they don't start with a size. Because of p2align and the + * end/END definitions, and the fact that they're mergeable, they can also + * have NULLs which aren't guaranteed to be at the end. + */ + . = ALIGN(16); + __init_array_start = .; + *(SORT(.init_array.*)) + *(.init_array) + __init_array_end = .; + . = ALIGN(16); + __CTOR_LIST__ = .; + *(SORT(.ctors.*)) + *(.ctors) + __CTOR_END__ = .; + . = ALIGN(16); + __DTOR_LIST__ = .; + *(SORT(.dtors.*)) + *(.dtors) + __DTOR_END__ = .; + . = ALIGN(16); + __fini_array_start = .; + *(SORT(.fini_array.*)) + *(.fini_array) + __fini_array_end = .; + + /* the EFI loader doesn't seem to like a .bss section, so we stick + it all into .data: */ + . = ALIGN(16); + _bss = .; + *(.sbss) + *(.scommon) + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + . = ALIGN(16); + _bss_end = .; + _evdata = .; + . = ALIGN(4096); + _edata = .; + } =0 + _data_vsize = _evdata - _data; + _data_size = _edata - _data; + + . = ALIGN(4096); + _rodata = .; + .rela : + { + *(.rela.text*) + *(.rela.data*) + *(.rela.got) + *(.rela.dyn) + *(.rela.stab) + *(.rela.init_array*) + *(.rela.fini_array*) + *(.rela.ctors*) + *(.rela.dtors*) + + } + . = ALIGN(4096); + .rela.plt : { *(.rela.plt) } + . = ALIGN(4096); + .rodata : { + *(.rodata*) + _evrodata = .; + . = ALIGN(4096); + _erodata = .; + } =0 + _rodata_vsize = _evrodata - _rodata; + _rodata_size = _erodata - _rodata; + _image_end = .; + _alldata_size = _image_end - _reloc; + + . = ALIGN(4096); + .dynsym : { *(.dynsym) } + . = ALIGN(4096); + .dynstr : { *(.dynstr) } + . = ALIGN(4096); + .note.gnu.build-id : { *(.note.gnu.build-id) } + . = ALIGN(4096); + .hash : { *(.hash) } + . = ALIGN(4096); + .gnu.hash : { *(.gnu.hash) } + . = ALIGN(4096); + .eh_frame : { *(.eh_frame) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + . = ALIGN(4096); + .gcc_except_table : { *(.gcc_except_table*) } + /DISCARD/ : + { + *(.rela.reloc) + *(.note.GNU-stack) + } + .comment 0 : { *(.comment) } +} +