[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v3 4/7] plat/xen: Add preinit_array and init_array sections (x86, ARM)
Adds preinit_array and init_array sections with the linker script. Those sections are populated by the compiler/linker with function pointer arrays. Such functions are typically part of initializing the language runtime (e.g., C++) and have to be called early during bootstrapping. However, they can also be used by Unikraft libraries for early initializations (functions with constructor attribute). Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> --- plat/xen/arm/link32.ld | 43 +++++++++++++++++++------------------------ plat/xen/memory.c | 10 +++++----- plat/xen/x86/link64.ld | 17 +++++++++++++++++ 3 files changed, 41 insertions(+), 29 deletions(-) diff --git a/plat/xen/arm/link32.ld b/plat/xen/arm/link32.ld index 77184c0..4508e05 100644 --- a/plat/xen/arm/link32.ld +++ b/plat/xen/arm/link32.ld @@ -47,37 +47,32 @@ SECTIONS _etext = .; /* End of text section */ + /* Read-only data */ _rodata = .; - .rodata : { *(.rodata) *(.rodata.*) } + .rodata : + { + *(.rodata) + *(.rodata.*) + } . = ALIGN(4096); _erodata = .; - /* newlib initialization functions */ - . = ALIGN(32 / 8); - PROVIDE (__preinit_array_start = .); - .preinit_array : { *(.preinit_array) } - PROVIDE (__preinit_array_end = .); - PROVIDE (__init_array_start = .); - .init_array : { *(.init_array) } - PROVIDE (__init_array_end = .); - PROVIDE (__fini_array_start = .); - .fini_array : { *(.fini_array) } - PROVIDE (__fini_array_end = .); - - .ctors : { - __CTOR_LIST__ = .; - *(.ctors) - CONSTRUCTORS - LONG(0) - __CTOR_END__ = .; + _ctors = .; + .preinit_array : { + . = ALIGN(0x8); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); } - .dtors : { - __DTOR_LIST__ = .; - *(.dtors) - LONG(0) - __DTOR_END__ = .; + .init_array : { + . = ALIGN(0x8); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); } + _ectors = .; .data : { /* Data */ _data = .; diff --git a/plat/xen/memory.c b/plat/xen/memory.c index c40ea3d..df56616 100644 --- a/plat/xen/memory.c +++ b/plat/xen/memory.c @@ -50,7 +50,7 @@ int ukplat_memregion_count(void) int ukplat_memregion_get(int i, struct ukplat_memregion_desc *m) { - extern char _text, _etext, _data, _edata, _rodata, _erodata, _end, __bss_start; + extern char _text, _etext, _data, _edata, _rodata, _erodata, _ctors, _ectors, _end, __bss_start; UK_ASSERT(m); @@ -73,13 +73,13 @@ int ukplat_memregion_get(int i, struct ukplat_memregion_desc *m) m->name = "rodata"; #endif break; - case 2: /* ctors, dtors */ - m->base = &_erodata; - m->len = (size_t) &_data - (size_t) &_erodata; + case 2: /* ctors */ + m->base = &_ctors; + m->len = (size_t) &_ectors - (size_t) &_ctors; m->flags = (UKPLAT_MEMRF_RESERVED | UKPLAT_MEMRF_READABLE); #if UKPLAT_MEMRNAME - m->name = "ctors+dtors"; + m->name = "ctors"; #endif break; case 3: /* data */ diff --git a/plat/xen/x86/link64.ld b/plat/xen/x86/link64.ld index dd092aa..5391dbd 100644 --- a/plat/xen/x86/link64.ld +++ b/plat/xen/x86/link64.ld @@ -47,6 +47,23 @@ SECTIONS . = ALIGN(4096); _erodata = .; + _ctors = .; + .preinit_array : { + . = ALIGN(0x8); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } + + .init_array : { + . = ALIGN(0x8); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } + _ectors = .; + _data = .; .data : { /* Data */ *(.data) -- 2.7.4 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |