[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Minios-devel] [UNIKRAFT PATCH v3 4/7] plat/xen: Add preinit_array and init_array sections (x86, ARM)
Hello Simon,
This patch looks fine
On 05/22/2018 02:20 PM, Simon Kuenzer
wrote:
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)
Reviewed-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx>
Thanks & Regards
Sharan Santhanam
|
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|