From nobody Sat May 18 10:57:16 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=none dis=none) header.from=arm.com Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1649660632043387.8192707582924; Mon, 11 Apr 2022 00:03:52 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.302693.516405 (Exim 4.92) (envelope-from ) id 1ndo4w-0006K4-7h; Mon, 11 Apr 2022 07:03:14 +0000 Received: by outflank-mailman (output) from mailman id 302693.516405; Mon, 11 Apr 2022 07:03:14 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1ndo4w-0006Jx-4C; Mon, 11 Apr 2022 07:03:14 +0000 Received: by outflank-mailman (input) for mailman id 302693; Mon, 11 Apr 2022 07:03:13 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1ndo4u-00063x-Ud for xen-devel@lists.xenproject.org; Mon, 11 Apr 2022 07:03:12 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id 73509227-b965-11ec-8fbc-03012f2f19d4; Mon, 11 Apr 2022 09:03:12 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 897391FB; Mon, 11 Apr 2022 00:03:11 -0700 (PDT) Received: from e129167.arm.com (unknown [10.57.8.177]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DB4BC3F73B; Mon, 11 Apr 2022 00:03:08 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 73509227-b965-11ec-8fbc-03012f2f19d4 From: Michal Orzel To: xen-devel@lists.xenproject.org Cc: Stefano Stabellini , Julien Grall , Bertrand Marquis , Volodymyr Babchuk , Andrew Cooper , George Dunlap , Jan Beulich , Wei Liu , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Subject: [PATCH v5 1/2] xen: Introduce a header to store common linker scripts content Date: Mon, 11 Apr 2022 09:02:59 +0200 Message-Id: <20220411070300.77380-2-michal.orzel@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220411070300.77380-1-michal.orzel@arm.com> References: <20220411070300.77380-1-michal.orzel@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1649660633949100005 Content-Type: text/plain; charset="utf-8" Both x86 and arm linker scripts share quite a lot of common content. It is difficult to keep syncing them up, thus introduce a new header in include/xen called xen.lds.h to store the internals mutual to all the linker scripts. Include this header in linker scripts for x86 and arm. This patch serves as an intermediate step before populating xen.lds.h and making use of its content in the linker scripts later on. Signed-off-by: Michal Orzel Acked-by: Jan Beulich Acked-by: Julien Grall --- Changes since v4: -rebased Changes since v2,v3: -none Changes since v1: -rename header to xen.lds.h to be coherent with Linux kernel -include empty header in linker scripts --- xen/arch/arm/xen.lds.S | 1 + xen/arch/x86/xen.lds.S | 1 + xen/include/xen/xen.lds.h | 8 ++++++++ 3 files changed, 10 insertions(+) create mode 100644 xen/include/xen/xen.lds.h diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S index ad7f966f0e..d20e5e94e4 100644 --- a/xen/arch/arm/xen.lds.S +++ b/xen/arch/arm/xen.lds.S @@ -4,6 +4,7 @@ =20 #include #include +#include #include #undef ENTRY #undef ALIGN diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index 6926e88e54..1fcd8ab7c5 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -3,6 +3,7 @@ =20 #include #include +#include #include #undef ENTRY #undef ALIGN diff --git a/xen/include/xen/xen.lds.h b/xen/include/xen/xen.lds.h new file mode 100644 index 0000000000..dd292fa7dc --- /dev/null +++ b/xen/include/xen/xen.lds.h @@ -0,0 +1,8 @@ +#ifndef __XEN_LDS_H__ +#define __XEN_LDS_H__ + +/* + * Common macros to be used in architecture specific linker scripts. + */ + +#endif /* __XEN_LDS_H__ */ --=20 2.25.1 From nobody Sat May 18 10:57:16 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=none dis=none) header.from=arm.com Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1649660630849295.12868319073925; Mon, 11 Apr 2022 00:03:50 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.302694.516416 (Exim 4.92) (envelope-from ) id 1ndo50-0006bO-G8; Mon, 11 Apr 2022 07:03:18 +0000 Received: by outflank-mailman (output) from mailman id 302694.516416; Mon, 11 Apr 2022 07:03:18 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1ndo50-0006bH-CA; Mon, 11 Apr 2022 07:03:18 +0000 Received: by outflank-mailman (input) for mailman id 302694; Mon, 11 Apr 2022 07:03:16 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1ndo4y-00063x-JF for xen-devel@lists.xenproject.org; Mon, 11 Apr 2022 07:03:16 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-flk1.inumbo.com (Halon) with ESMTP id 752c16ab-b965-11ec-8fbc-03012f2f19d4; Mon, 11 Apr 2022 09:03:15 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 8D9921FB; Mon, 11 Apr 2022 00:03:14 -0700 (PDT) Received: from e129167.arm.com (unknown [10.57.8.177]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id EC2A63F73B; Mon, 11 Apr 2022 00:03:11 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 752c16ab-b965-11ec-8fbc-03012f2f19d4 From: Michal Orzel To: xen-devel@lists.xenproject.org Cc: Stefano Stabellini , Julien Grall , Bertrand Marquis , Volodymyr Babchuk , Andrew Cooper , George Dunlap , Jan Beulich , Wei Liu , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Subject: [PATCH v5 2/2] xen: Populate xen.lds.h and make use of its macros Date: Mon, 11 Apr 2022 09:03:00 +0200 Message-Id: <20220411070300.77380-3-michal.orzel@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220411070300.77380-1-michal.orzel@arm.com> References: <20220411070300.77380-1-michal.orzel@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1649660631983100003 Content-Type: text/plain; charset="utf-8" Populate header file xen.lds.h with the first portion of macros storing constructs common to x86 and arm linker scripts. Replace the original constructs with these helpers. No functional improvements to x86 linker script. Making use of common macros improves arm linker script with: - explicit list of debug sections that otherwise are seen as "orphans" by the linker. This will allow to fix issues after enabling linker option --orphan-handling one day, - extended list of discarded section to include: .discard, destructors related sections, .fini_array which can reference .text.exit, - sections not related to debugging that are placed by ld.lld. Even though we do not support linking with LLD on Arm, these sections do not cause problem to GNU ld, As we are replacing hardcoded boundary specified as an argument to ALIGN function with POINTER_ALIGN, this changes the alignment in HYPFS_PARAM construct for arm32 from 8 to 4. It is fine as there are no 64bit values used in struct param_hypfs. Please note that this patch does not aim to perform the full sync up between the linker scripts. It creates a base for further work. Signed-off-by: Michal Orzel Reviewed-by: Jan Beulich Reviewed-by: Julien Grall --- Changes since v4: -update commit msg with a note about changed alignment for HYPFS_PARAM on a= rm32 Changes since v3: -use POINTER_ALIGN in debug sections when needed -modify comment about ELF_DETAILS_SECTIONS Changes since v2: -refactor commit msg -move constructs together with surrounding ifdefery -list constructs other than *_SECTIONS in alphabetical order -add comment about EFI vs EFI support Changes since v1: -merge x86 and arm changes into single patch -do not propagate issues by generalizing CTORS -extract sections not related to debugging into separate macro -get rid of _SECTION suffix in favor of using more meaningful suffixes --- xen/arch/arm/xen.lds.S | 44 +++---------- xen/arch/x86/xen.lds.S | 96 +++------------------------- xen/include/xen/xen.lds.h | 129 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 122 deletions(-) diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S index d20e5e94e4..1e986e211f 100644 --- a/xen/arch/arm/xen.lds.S +++ b/xen/arch/arm/xen.lds.S @@ -69,12 +69,7 @@ SECTIONS *(.proc.info) __proc_info_end =3D .; =20 -#ifdef CONFIG_HAS_VPCI - . =3D ALIGN(POINTER_ALIGN); - __start_vpci_array =3D .; - *(SORT(.data.vpci.*)) - __end_vpci_array =3D .; -#endif + VPCI_ARRAY } :text =20 #if defined(BUILD_ID) @@ -110,12 +105,7 @@ SECTIONS *(.data.schedulers) __end_schedulers_array =3D .; =20 -#ifdef CONFIG_HYPFS - . =3D ALIGN(8); - __paramhypfs_start =3D .; - *(.data.paramhypfs) - __paramhypfs_end =3D .; -#endif + HYPFS_PARAM =20 *(.data .data.*) CONSTRUCTORS @@ -179,12 +169,7 @@ SECTIONS *(.altinstructions) __alt_instructions_end =3D .; =20 -#ifdef CONFIG_DEBUG_LOCK_PROFILE - . =3D ALIGN(POINTER_ALIGN); - __lock_profile_start =3D .; - *(.lockprofile.data) - __lock_profile_end =3D .; -#endif + LOCK_PROFILE_DATA =20 *(.init.data) *(.init.data.rel) @@ -223,22 +208,13 @@ SECTIONS /* Section for the device tree blob (if any). */ .dtb : { *(.dtb) } :text =20 - /* Sections to be discarded */ - /DISCARD/ : { - *(.exit.text) - *(.exit.data) - *(.exitcall.exit) - *(.eh_frame) - } - - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } + DWARF2_DEBUG_SECTIONS + + DISCARD_SECTIONS + + STABS_DEBUG_SECTIONS + + ELF_DETAILS_SECTIONS } =20 /* diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index 1fcd8ab7c5..68501c7186 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -14,13 +14,6 @@ #undef __XEN_VIRT_START #define __XEN_VIRT_START __image_base__ #define DECL_SECTION(x) x : -/* - * Use the NOLOAD directive, despite currently ignored by (at least) GNU ld - * for PE output, in order to record that we'd prefer these sections to not - * be loaded into memory. - */ -#define DECL_DEBUG(x, a) #x ALIGN(a) (NOLOAD) : { *(x) } -#define DECL_DEBUG2(x, y, a) #x ALIGN(a) (NOLOAD) : { *(x) *(y) } =20 ENTRY(efi_start) =20 @@ -28,8 +21,6 @@ ENTRY(efi_start) =20 #define FORMAT "elf64-x86-64" #define DECL_SECTION(x) #x : AT(ADDR(#x) - __XEN_VIRT_START) -#define DECL_DEBUG(x, a) #x 0 : { *(x) } -#define DECL_DEBUG2(x, y, a) #x 0 : { *(x) *(y) } =20 ENTRY(start_pa) =20 @@ -160,12 +151,7 @@ SECTIONS *(.note.gnu.build-id) __note_gnu_build_id_end =3D .; #endif -#ifdef CONFIG_HAS_VPCI - . =3D ALIGN(POINTER_ALIGN); - __start_vpci_array =3D .; - *(SORT(.data.vpci.*)) - __end_vpci_array =3D .; -#endif + VPCI_ARRAY } PHDR(text) =20 #if defined(CONFIG_PVH_GUEST) && !defined(EFI) @@ -279,12 +265,7 @@ SECTIONS *(.altinstructions) __alt_instructions_end =3D .; =20 -#ifdef CONFIG_DEBUG_LOCK_PROFILE - . =3D ALIGN(POINTER_ALIGN); - __lock_profile_start =3D .; - *(.lockprofile.data) - __lock_profile_end =3D .; -#endif + LOCK_PROFILE_DATA =20 . =3D ALIGN(8); __ctors_start =3D .; @@ -336,12 +317,7 @@ SECTIONS *(.data.schedulers) __end_schedulers_array =3D .; =20 -#ifdef CONFIG_HYPFS - . =3D ALIGN(8); - __paramhypfs_start =3D .; - *(.data.paramhypfs) - __paramhypfs_end =3D .; -#endif + HYPFS_PARAM } PHDR(text) =20 DECL_SECTION(.data) { @@ -388,33 +364,7 @@ SECTIONS efi =3D .; #endif =20 - /* - * Explicitly list debug sections, first of all to avoid these sections = being - * viewed as "orphan" by the linker. - * - * For the PE output this is further necessary so that they don't end up= at - * VA 0, which is below image base and thus invalid. Note that we're pa= st - * _end here, so if these sections get loaded they'll be discarded at ru= ntime - * anyway. - */ - DECL_DEBUG(.debug_abbrev, 1) - DECL_DEBUG2(.debug_info, .gnu.linkonce.wi.*, 1) - DECL_DEBUG(.debug_types, 1) - DECL_DEBUG(.debug_str, 1) - DECL_DEBUG2(.debug_line, .debug_line.*, 1) - DECL_DEBUG(.debug_line_str, 1) - DECL_DEBUG(.debug_names, 4) - DECL_DEBUG(.debug_frame, 4) - DECL_DEBUG(.debug_loc, 1) - DECL_DEBUG(.debug_loclists, 4) - DECL_DEBUG(.debug_macinfo, 1) - DECL_DEBUG(.debug_macro, 1) - DECL_DEBUG(.debug_ranges, 8) - DECL_DEBUG(.debug_rnglists, 4) - DECL_DEBUG(.debug_addr, 8) - DECL_DEBUG(.debug_aranges, 1) - DECL_DEBUG(.debug_pubnames, 1) - DECL_DEBUG(.debug_pubtypes, 1) + DWARF2_DEBUG_SECTIONS =20 #ifdef EFI /* Trick the linker into setting the image size to no less than 16Mb. */ @@ -428,42 +378,12 @@ SECTIONS hv_hcall_page =3D ABSOLUTE(HV_HCALL_PAGE - XEN_VIRT_START + __XEN_VIRT_S= TART); #endif =20 - /* Sections to be discarded */ - /DISCARD/ : { - *(.text.exit) - *(.exit.text) - *(.exit.data) - *(.exitcall.exit) - *(.discard) - *(.discard.*) - *(.eh_frame) - *(.dtors) - *(.dtors.*) - *(.fini_array) - *(.fini_array.*) -#ifdef EFI - *(.comment) - *(.comment.*) - *(.note.*) -#endif - } + DISCARD_SECTIONS =20 #ifndef EFI - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) *(.comment.*) } - /* - * LLVM ld also wants .symtab, .strtab, and .shstrtab placed. These look= to - * be benign to GNU ld, so we can have them here unconditionally. - */ - .symtab 0 : { *(.symtab) } - .strtab 0 : { *(.strtab) } - .shstrtab 0 : { *(.shstrtab) } + STABS_DEBUG_SECTIONS + + ELF_DETAILS_SECTIONS #endif } =20 diff --git a/xen/include/xen/xen.lds.h b/xen/include/xen/xen.lds.h index dd292fa7dc..fc47bb1ccc 100644 --- a/xen/include/xen/xen.lds.h +++ b/xen/include/xen/xen.lds.h @@ -5,4 +5,133 @@ * Common macros to be used in architecture specific linker scripts. */ =20 +/* + * To avoid any confusion, please note that the EFI macro does not corresp= ond + * to EFI support and is used when linking a native EFI (i.e. PE/COFF) bin= ary, + * hence its usage in this header. + */ + +/* Macros to declare debug sections. */ +#ifdef EFI +/* + * Use the NOLOAD directive, despite currently ignored by (at least) GNU ld + * for PE output, in order to record that we'd prefer these sections to not + * be loaded into memory. + */ +#define DECL_DEBUG(x, a) #x ALIGN(a) (NOLOAD) : { *(x) } +#define DECL_DEBUG2(x, y, a) #x ALIGN(a) (NOLOAD) : { *(x) *(y) } +#else +#define DECL_DEBUG(x, a) #x 0 : { *(x) } +#define DECL_DEBUG2(x, y, a) #x 0 : { *(x) *(y) } +#endif + +/* + * DWARF2+ debug sections. + * Explicitly list debug sections, first of all to avoid these sections be= ing + * viewed as "orphan" by the linker. + * + * For the PE output this is further necessary so that they don't end up at + * VA 0, which is below image base and thus invalid. Note that this macro = is + * to be used after _end, so if these sections get loaded they'll be disca= rded + * at runtime anyway. + */ +#define DWARF2_DEBUG_SECTIONS \ + DECL_DEBUG(.debug_abbrev, 1) \ + DECL_DEBUG2(.debug_info, .gnu.linkonce.wi.*, 1) \ + DECL_DEBUG(.debug_types, 1) \ + DECL_DEBUG(.debug_str, 1) \ + DECL_DEBUG2(.debug_line, .debug_line.*, 1) \ + DECL_DEBUG(.debug_line_str, 1) \ + DECL_DEBUG(.debug_names, 4) \ + DECL_DEBUG(.debug_frame, 4) \ + DECL_DEBUG(.debug_loc, 1) \ + DECL_DEBUG(.debug_loclists, 4) \ + DECL_DEBUG(.debug_macinfo, 1) \ + DECL_DEBUG(.debug_macro, 1) \ + DECL_DEBUG(.debug_ranges, POINTER_ALIGN) \ + DECL_DEBUG(.debug_rnglists, 4) \ + DECL_DEBUG(.debug_addr, POINTER_ALIGN) \ + DECL_DEBUG(.debug_aranges, 1) \ + DECL_DEBUG(.debug_pubnames, 1) \ + DECL_DEBUG(.debug_pubtypes, 1) + +/* Stabs debug sections. */ +#define STABS_DEBUG_SECTIONS \ + .stab 0 : { *(.stab) } \ + .stabstr 0 : { *(.stabstr) } \ + .stab.excl 0 : { *(.stab.excl) } \ + .stab.exclstr 0 : { *(.stab.exclstr) } \ + .stab.index 0 : { *(.stab.index) } \ + .stab.indexstr 0 : { *(.stab.indexstr) } + +/* + * ELF sections. + * + * LLVM ld also wants .symtab, .strtab, and .shstrtab placed. These look to + * be benign to GNU ld, so we can have them here unconditionally. + */ +#define ELF_DETAILS_SECTIONS \ + .comment 0 : { *(.comment) *(.comment.*) } \ + .symtab 0 : { *(.symtab) } \ + .strtab 0 : { *(.strtab) } \ + .shstrtab 0 : { *(.shstrtab) } + +#ifdef EFI +#define DISCARD_EFI_SECTIONS \ + *(.comment) \ + *(.comment.*) \ + *(.note.*) +#else +#define DISCARD_EFI_SECTIONS +#endif + +/* Sections to be discarded. */ +#define DISCARD_SECTIONS \ + /DISCARD/ : { \ + *(.text.exit) \ + *(.exit.text) \ + *(.exit.data) \ + *(.exitcall.exit) \ + *(.discard) \ + *(.discard.*) \ + *(.eh_frame) \ + *(.dtors) \ + *(.dtors.*) \ + *(.fini_array) \ + *(.fini_array.*) \ + DISCARD_EFI_SECTIONS \ + } + +/* List of constructs other than *_SECTIONS in alphabetical order. */ + +#ifdef CONFIG_HYPFS +#define HYPFS_PARAM \ + . =3D ALIGN(POINTER_ALIGN); \ + __paramhypfs_start =3D .; \ + *(.data.paramhypfs) \ + __paramhypfs_end =3D .; +#else +#define HYPFS_PARAM +#endif + +#ifdef CONFIG_DEBUG_LOCK_PROFILE +#define LOCK_PROFILE_DATA \ + . =3D ALIGN(POINTER_ALIGN); \ + __lock_profile_start =3D .; \ + *(.lockprofile.data) \ + __lock_profile_end =3D .; +#else +#define LOCK_PROFILE_DATA +#endif + +#ifdef CONFIG_HAS_VPCI +#define VPCI_ARRAY \ + . =3D ALIGN(POINTER_ALIGN); \ + __start_vpci_array =3D .; \ + *(SORT(.data.vpci.*)) \ + __end_vpci_array =3D .; +#else +#define VPCI_ARRAY +#endif + #endif /* __XEN_LDS_H__ */ --=20 2.25.1