[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

 


Rackspace

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