[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.