Add a new Kconfig CONFIG_GC_SECTIONS to control linking with --gc-sections. --gc-sections witll garbage collect unused sections. Combined with CONFIG_CC_SPLIT_SECTIONS, this will remove unreachable code and data.
Linker scripts need to add KEEP() assorted places to retain appropriate data - especially the arrays created by the linker script. This has some affect, but it is inomplete. In a test where memory_add() is unreachable, it is still included. I'm not sure, but it seems that alternatives keep a relocation reference to it. Only ELF xen is supported. xen.efi fails to link with many undefined references when using --gc-sections. Signed-off-by: Jason Andryuk <[email protected]> --- v1: Add Kconfig select CC_SPLIT_SECTIONS remove KEEP from .fixup Add KEEP to .text.entry.* (Only needed with Jan's "common: honor CONFIG_CC_SPLIT_SECTIONS also for assembly functions" ?) Add ARM, RISC-V and PPC Pipeline passes: https://gitlab.com/xen-project/people/jandryuk-amd/xen/-/pipelines/2205223331 It defaults CONFIG_GC_SECTIONS=y and adds --print-gc-sections With --print-gc-sections on x86 defconfig + GC_SECTIONS=y debug=y: ld: removing unused section '.text.__bitmap_full' in file 'prelink.o' ld: removing unused section '.text.__bitmap_xor' in file 'prelink.o' ld: removing unused section '.text.__bitmap_set' in file 'prelink.o' ld: removing unused section '.text.__bitmap_clear' in file 'prelink.o' ld: removing unused section '.text.bitmap_find_free_region' in file 'prelink.o' ld: removing unused section '.text.bitmap_release_region' in file 'prelink.o' ld: removing unused section '.text.domain_has_ioreq_server' in file 'prelink.o' ld: removing unused section '.text.compat_kexec_op' in file 'prelink.o' ld: removing unused section '.text.in_atomic' in file 'prelink.o' ld: removing unused section '.text.radix_tree_next_hole' in file 'prelink.o' ld: removing unused section '.text.radix_tree_prev_hole' in file 'prelink.o' ld: removing unused section '.text.radix_tree_gang_lookup_slot' in file 'prelink.o' ld: removing unused section '.text._nrspin_trylock' in file 'prelink.o' ld: removing unused section '.text.xen_compile_host' in file 'prelink.o' ld: removing unused section '.text.vscnprintf' in file 'prelink.o' ld: removing unused section '.text.wake_up_one' in file 'prelink.o' ld: removing unused section '.text.xmem_pool_get_used_size' in file 'prelink.o' ld: removing unused section '.text.xmem_pool_get_total_size' in file 'prelink.o' ld: removing unused section '.text.xmem_pool_maxalloc' in file 'prelink.o' ld: removing unused section '.text.xlat_start_info' in file 'prelink.o' ld: removing unused section '.text.elf_sym_by_name' in file 'prelink.o' ld: removing unused section '.text.elf_sym_by_index' in file 'prelink.o' ld: removing unused section '.text.elf_get_ptr' in file 'prelink.o' ld: removing unused section '.text.elf_lookup_addr' in file 'prelink.o' ld: removing unused section '.text.serial_vuart_info' in file 'prelink.o' ld: removing unused section '.text.pci_find_next_cap' in file 'prelink.o' ld: removing unused section '.text.free_hvm_irq_dpci' in file 'prelink.o' ld: removing unused section '.text.mce_barrier_init' in file 'prelink.o' ld: removing unused section '.text.mce_barrier_dec' in file 'prelink.o' ld: removing unused section '.text.mce_barrier' in file 'prelink.o' ld: removing unused section '.text.apei_read_mce' in file 'prelink.o' ld: removing unused section '.text.apei_check_mce' in file 'prelink.o' ld: removing unused section '.text.apei_clear_mce' in file 'prelink.o' ld: removing unused section '.text.efi_halt_system' in file 'prelink.o' ld: removing unused section '.text.get_vvmcs_virtual_safe' in file 'prelink.o' ld: removing unused section '.text.get_vvmcs_real_safe' in file 'prelink.o' ld: removing unused section '.text.set_vvmcs_real' in file 'prelink.o' ld: removing unused section '.text.set_vvmcs_virtual_safe' in file 'prelink.o' ld: removing unused section '.text.set_vvmcs_real_safe' in file 'prelink.o' ld: removing unused section '.text.domain_set_alloc_bitsize' in file 'prelink.o' ld: removing unused section '.text.watchdog_enabled' in file 'prelink.o' ld: removing unused section '.text.unset_nmi_callback' in file 'prelink.o' ld: removing unused section '.text.sha2_256_init' in file 'prelink.o' ld: removing unused section '.text.xxh64_copy_state' in file 'prelink.o' ld: removing unused section '.text.xxh64' in file 'prelink.o' ld: removing unused section '.discard' in file 'prelink.o' ld: removing unused section '.rodata.xen_compile_host.str1.1' in file 'prelink.o' ld: removing unused section '.rodata.elf_lookup_addr.str1.1' in file 'prelink.o' ld: removing unused section '.rodata.apei_read_mce.str1.8' in file 'prelink.o' ld: removing unused section '.rodata.efi_halt_system.str1.8' in file 'prelink.o' ld: removing unused section '.rodata.play_dead.str1.1' in file 'prelink.o' ld: removing unused section '.data.rel.ro.local.fetch_type_names' in file 'prelink.o' --- xen/Makefile | 3 +++ xen/arch/arm/Makefile | 6 +++--- xen/arch/arm/xen.lds.S | 22 +++++++++++----------- xen/arch/ppc/Makefile | 6 +++--- xen/arch/ppc/xen.lds.S | 14 +++++++------- xen/arch/riscv/Makefile | 6 +++--- xen/arch/riscv/xen.lds.S | 14 +++++++------- xen/arch/x86/Makefile | 6 +++--- xen/arch/x86/xen.lds.S | 34 +++++++++++++++++----------------- xen/common/Kconfig | 9 +++++++++ xen/include/xen/xen.lds.h | 20 ++++++++++---------- 11 files changed, 76 insertions(+), 64 deletions(-) diff --git a/xen/Makefile b/xen/Makefile index e6cf287425..aeb5dcf2ee 100644 --- a/xen/Makefile +++ b/xen/Makefile @@ -469,10 +469,13 @@ all-symbols-$(CONFIG_FAST_SYMBOL_LOOKUP) += --sort-by-name include $(srctree)/arch/$(SRCARCH)/arch.mk +XEN_FINAL_LDFLAGS-$(CONFIG_GC_SECTIONS) := --gc-sections + # define new variables to avoid the ones defined in Config.mk export XEN_CFLAGS := $(CFLAGS) export XEN_AFLAGS := $(AFLAGS) export XEN_LDFLAGS := $(LDFLAGS) +export XEN_FINAL_LDFLAGS := $(LDFLAGS) $(XEN_FINAL_LDFLAGS-y) export CFLAGS_UBSAN endif # need-config diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile index 7494a0f926..3ac5ff88cc 100644 --- a/xen/arch/arm/Makefile +++ b/xen/arch/arm/Makefile @@ -87,19 +87,19 @@ endif $(TARGET)-syms: $(objtree)/prelink.o $(obj)/xen.lds $(objtree)/tools/symbols $(all_symbols) --empty > $(dot-target).0.S $(MAKE) $(build)=$(@D) $(dot-target).0.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< \ $(dot-target).0.o -o $(dot-target).0 $(NM) -pa --format=sysv $(dot-target).0 \ | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \ > $(dot-target).1.S $(MAKE) $(build)=$(@D) $(dot-target).1.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< \ $(dot-target).1.o -o $(dot-target).1 $(NM) -pa --format=sysv $(dot-target).1 \ | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \ > $(dot-target).2.S $(MAKE) $(build)=$(@D) $(dot-target).2.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ $(dot-target).2.o -o $@ $(NM) -pa --format=sysv $@ \ | $(objtree)/tools/symbols --all-symbols --xensyms --sysv --sort \ diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S index 2d5f1c516d..178af612a2 100644 --- a/xen/arch/arm/xen.lds.S +++ b/xen/arch/arm/xen.lds.S @@ -63,7 +63,7 @@ SECTIONS . = ALIGN(4); __proc_info_start = .; - *(.proc.info) + KEEP(*(.proc.info)) __proc_info_end = .; } :text @@ -103,7 +103,7 @@ SECTIONS . = ALIGN(8); .arch.info : { _splatform = .; - *(.arch.info) + KEEP(*(.arch.info)) _eplatform = .; } :text @@ -116,7 +116,7 @@ SECTIONS . = ALIGN(8); .teemediator.info : { _steemediator = .; - *(.teemediator.info) + KEEP(*(.teemediator.info)) _eteemediator = .; } :text @@ -127,7 +127,7 @@ SECTIONS *(.init.text) _einittext = .; . = ALIGN(PAGE_SIZE); /* Avoid mapping alt insns executable */ - *(.altinstr_replacement) + KEEP(*(.altinstr_replacement)) } :text . = ALIGN(PAGE_SIZE); __init_data_begin = .; @@ -137,18 +137,18 @@ SECTIONS . = ALIGN(POINTER_ALIGN); __setup_start = .; - *(.init.setup) + KEEP(*(.init.setup)) __setup_end = .; __initcall_start = .; - *(.initcallpresmp.init) + KEEP(*(.initcallpresmp.init)) __presmp_initcall_end = .; - *(.initcall1.init) + KEEP(*(.initcall1.init)) __initcall_end = .; . = ALIGN(4); __alt_instructions = .; - *(.altinstructions) + KEEP(*(.altinstructions)) __alt_instructions_end = .; LOCK_PROFILE_DATA @@ -159,9 +159,9 @@ SECTIONS . = ALIGN(8); __ctors_start = .; - *(.ctors) - *(.init_array) - *(SORT(.init_array.*)) + KEEP(*(.ctors)) + KEEP(*(.init_array)) + KEEP(*(SORT(.init_array.*))) __ctors_end = .; } :text __init_end_efi = .; diff --git a/xen/arch/ppc/Makefile b/xen/arch/ppc/Makefile index e80690d3b8..42db3d6f2c 100644 --- a/xen/arch/ppc/Makefile +++ b/xen/arch/ppc/Makefile @@ -14,19 +14,19 @@ $(TARGET): $(TARGET)-syms $(TARGET)-syms: $(objtree)/prelink.o $(obj)/xen.lds $(objtree)/tools/symbols $(all_symbols) --empty > $(dot-target).0.S $(MAKE) $(build)=$(@D) $(dot-target).0.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< \ $(dot-target).0.o -o $(dot-target).0 $(NM) -pa --format=sysv $(dot-target).0 \ | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \ > $(dot-target).1.S $(MAKE) $(build)=$(@D) $(dot-target).1.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< \ $(dot-target).1.o -o $(dot-target).1 $(NM) -pa --format=sysv $(dot-target).1 \ | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \ > $(dot-target).2.S $(MAKE) $(build)=$(@D) $(dot-target).2.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ $(dot-target).2.o -o $@ $(NM) -pa --format=sysv $@ \ | $(objtree)/tools/symbols --all-symbols --xensyms --sysv --sort \ diff --git a/xen/arch/ppc/xen.lds.S b/xen/arch/ppc/xen.lds.S index d0f2ed43f1..c91df79468 100644 --- a/xen/arch/ppc/xen.lds.S +++ b/xen/arch/ppc/xen.lds.S @@ -24,7 +24,7 @@ SECTIONS DECL_SECTION(.text) { _stext = .; /* Text section */ - *(.text.header) + KEEP(*(.text.header)) . = ALIGN(256); HIDDEN(_stext_exceptions = .); @@ -109,13 +109,13 @@ SECTIONS . = ALIGN(POINTER_ALIGN); __setup_start = .; - *(.init.setup) + KEEP(*(.init.setup)) __setup_end = .; __initcall_start = .; - *(.initcallpresmp.init) + KEEP(*(.initcallpresmp.init)) __presmp_initcall_end = .; - *(.initcall1.init) + KEEP(*(.initcall1.init)) __initcall_end = .; LOCK_PROFILE_DATA @@ -126,9 +126,9 @@ SECTIONS . = ALIGN(8); __ctors_start = .; - *(.ctors) - *(.init_array) - *(SORT(.init_array.*)) + KEEP(*(.ctors)) + KEEP(*(.init_array)) + KEEP(*(SORT(.init_array.*))) __ctors_end = .; } :text diff --git a/xen/arch/riscv/Makefile b/xen/arch/riscv/Makefile index d667234949..0cb0e88a72 100644 --- a/xen/arch/riscv/Makefile +++ b/xen/arch/riscv/Makefile @@ -24,19 +24,19 @@ $(TARGET): $(TARGET)-syms $(TARGET)-syms: $(objtree)/prelink.o $(obj)/xen.lds $(objtree)/tools/symbols $(all_symbols) --empty > $(dot-target).0.S $(MAKE) $(build)=$(@D) $(dot-target).0.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< \ $(dot-target).0.o -o $(dot-target).0 $(NM) -pa --format=sysv $(dot-target).0 \ | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \ > $(dot-target).1.S $(MAKE) $(build)=$(@D) $(dot-target).1.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< \ $(dot-target).1.o -o $(dot-target).1 $(NM) -pa --format=sysv $(dot-target).1 \ | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \ > $(dot-target).2.S $(MAKE) $(build)=$(@D) $(dot-target).2.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ $(dot-target).2.o -o $@ $(NM) -pa --format=sysv $@ \ | $(objtree)/tools/symbols --all-symbols --xensyms --sysv --sort \ diff --git a/xen/arch/riscv/xen.lds.S b/xen/arch/riscv/xen.lds.S index 45d2e053d0..e57db6b914 100644 --- a/xen/arch/riscv/xen.lds.S +++ b/xen/arch/riscv/xen.lds.S @@ -18,7 +18,7 @@ SECTIONS _start = .; .text : { _stext = .; /* Text section */ - *(.text.header) + KEEP(*(.text.header)) *(.text.cold) *(.text.unlikely .text.*_unlikely .text.unlikely.*) @@ -103,13 +103,13 @@ SECTIONS . = ALIGN(POINTER_ALIGN); __setup_start = .; - *(.init.setup) + KEEP(*(.init.setup)) __setup_end = .; __initcall_start = .; - *(.initcallpresmp.init) + KEEP(*(.initcallpresmp.init)) __presmp_initcall_end = .; - *(.initcall1.init) + KEEP(*(.initcall1.init)) __initcall_end = .; LOCK_PROFILE_DATA @@ -120,9 +120,9 @@ SECTIONS . = ALIGN(8); __ctors_start = .; - *(.ctors) - *(.init_array) - *(SORT(.init_array.*)) + KEEP(*(.ctors)) + KEEP(*(.init_array)) + KEEP(*(SORT(.init_array.*))) __ctors_end = .; } :text diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile index 300cc67407..3fd4cf44ab 100644 --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -136,19 +136,19 @@ CFLAGS-$(XEN_BUILD_EFI) += -DXEN_BUILD_EFI $(TARGET)-syms: $(objtree)/prelink.o $(obj)/xen.lds $(objtree)/tools/symbols $(all_symbols) --empty > $(dot-target).0.S $(MAKE) $(build)=$(@D) $(dot-target).0.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ $(dot-target).0.o -o $(dot-target).0 $(NM) -pa --format=sysv $(dot-target).0 \ | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \ > $(dot-target).1.S $(MAKE) $(build)=$(@D) $(dot-target).1.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ $(dot-target).1.o -o $(dot-target).1 $(NM) -pa --format=sysv $(dot-target).1 \ | $(objtree)/tools/symbols $(all_symbols) --sysv --sort $(syms-warn-dup-y) \ > $(dot-target).2.S $(MAKE) $(build)=$(@D) $(dot-target).2.o - $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ + $(LD) $(XEN_FINAL_LDFLAGS) -T $(obj)/xen.lds $< $(build_id_linker) \ $(orphan-handling-y) $(dot-target).2.o -o $@ $(NM) -pa --format=sysv $@ \ | $(objtree)/tools/symbols --all-symbols --xensyms --sysv --sort \ diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index 2aa41306ca..e4135edd28 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -76,12 +76,12 @@ SECTIONS _start = .; DECL_SECTION(.text) { _stext = .; /* Text and read-only data */ - *(.text.header) + KEEP(*(.text.header)) . = ALIGN(PAGE_SIZE); _stextentry = .; *(.text.entry) - *(.text.entry.*) + KEEP(*(.text.entry.*)) . = ALIGN(PAGE_SIZE); _etextentry = .; @@ -116,7 +116,7 @@ SECTIONS . = ALIGN(8); /* Exception table */ __start___ex_table = .; - *(.ex_table) + KEEP(*(.ex_table)) __stop___ex_table = .; . = ALIGN(PAGE_SIZE); @@ -207,7 +207,7 @@ SECTIONS * as binary blobs. The .altinstructions has enough data to get * the address and the length of them to patch the kernel safely. */ - *(.altinstr_replacement) + KEEP(*(.altinstr_replacement)) #ifdef EFI /* EFI wants to merge all of .init.* ELF doesn't. */ . = ALIGN(SMP_CACHE_BYTES); @@ -220,8 +220,8 @@ SECTIONS . = ALIGN(POINTER_ALIGN); __initdata_cf_clobber_start = .; - *(.init.data.cf_clobber) - *(.init.rodata.cf_clobber) + KEEP(*(.init.data.cf_clobber)) + KEEP(*(.init.rodata.cf_clobber)) __initdata_cf_clobber_end = .; *(.init.rodata) @@ -229,13 +229,13 @@ SECTIONS . = ALIGN(POINTER_ALIGN); __setup_start = .; - *(.init.setup) + KEEP(*(.init.setup)) __setup_end = .; __initcall_start = .; - *(.initcallpresmp.init) + KEEP(*(.initcallpresmp.init)) __presmp_initcall_end = .; - *(.initcall1.init) + KEEP(*(.initcall1.init)) __initcall_end = .; *(.init.data) @@ -243,10 +243,10 @@ SECTIONS *(.init.data.rel.*) . = ALIGN(4); __trampoline_rel_start = .; - *(.trampoline_rel) + KEEP(*(.trampoline_rel)) __trampoline_rel_stop = .; __trampoline_seg_start = .; - *(.trampoline_seg) + KEEP(*(.trampoline_seg)) __trampoline_seg_stop = .; /* * struct alt_inst entries. From the header (alternative.h): @@ -255,21 +255,21 @@ SECTIONS */ . = ALIGN(8); __alt_instructions = .; - *(.altinstructions) + KEEP(*(.altinstructions)) __alt_instructions_end = .; . = ALIGN(4); __alt_call_sites_start = .; - *(.alt_call_sites) + KEEP(*(.alt_call_sites)) __alt_call_sites_end = .; LOCK_PROFILE_DATA . = ALIGN(8); __ctors_start = .; - *(SORT_BY_INIT_PRIORITY(.init_array.*)) - *(SORT_BY_INIT_PRIORITY(.ctors.*)) - *(.init_array) - *(.ctors) + KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*))) + KEEP(*(SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP(*(.init_array)) + KEEP(*(.ctors)) __ctors_end = .; } PHDR(text) diff --git a/xen/common/Kconfig b/xen/common/Kconfig index 401d5046f6..7e40a921a7 100644 --- a/xen/common/Kconfig +++ b/xen/common/Kconfig @@ -680,4 +680,13 @@ config PM_STATS Enable collection of performance management statistics to aid in analyzing and tuning power/performance characteristics of the system +config GC_SECTIONS + bool "Garbage Collect Sections" + select CC_SPLIT_SECTIONS + help + During final linking, garbage collect unused sections. This will + reduce the size of the final Xen binary + + Only supported for ELF/Multiboot xen/xen.gz, not EFI xen.efi. + endmenu diff --git a/xen/include/xen/xen.lds.h b/xen/include/xen/xen.lds.h index 2d66d618b3..4703523cb2 100644 --- a/xen/include/xen/xen.lds.h +++ b/xen/include/xen/xen.lds.h @@ -144,46 +144,46 @@ . = ALIGN(POINTER_ALIGN); \ DECL_SECTION(.adev.info) { \ _asdevice = .; \ - *(.adev.info) \ + KEEP(*(.adev.info)) \ _aedevice = .; \ } :text #define BUGFRAMES \ __start_bug_frames_0 = .; \ - *(.bug_frames.0) \ + KEEP(*(.bug_frames.0)) \ __stop_bug_frames_0 = .; \ \ __start_bug_frames_1 = .; \ - *(.bug_frames.1) \ + KEEP(*(.bug_frames.1)) \ __stop_bug_frames_1 = .; \ \ __start_bug_frames_2 = .; \ - *(.bug_frames.2) \ + KEEP(*(.bug_frames.2)) \ __stop_bug_frames_2 = .; \ \ __start_bug_frames_3 = .; \ - *(.bug_frames.3) \ + KEEP(*(.bug_frames.3)) \ __stop_bug_frames_3 = .; #define DT_DEV_INFO \ . = ALIGN(POINTER_ALIGN); \ DECL_SECTION(.dev.info) { \ _sdevice = .; \ - *(.dev.info) \ + KEEP(*(.dev.info)) \ _edevice = .; \ } :text #define SCHEDULER_ARRAY \ . = ALIGN(8); \ __start_schedulers_array = .; \ - *(.data.schedulers) \ + KEEP(*(.data.schedulers)) \ __end_schedulers_array = .; #ifdef CONFIG_HYPFS #define HYPFS_PARAM \ . = ALIGN(POINTER_ALIGN); \ __paramhypfs_start = .; \ - *(.data.paramhypfs) \ + KEEP(*(.data.paramhypfs)) \ __paramhypfs_end = .; #else #define HYPFS_PARAM @@ -193,7 +193,7 @@ #define LOCK_PROFILE_DATA \ . = ALIGN(POINTER_ALIGN); \ __lock_profile_start = .; \ - *(.lockprofile.data) \ + KEEP(*(.lockprofile.data))\ __lock_profile_end = .; #else #define LOCK_PROFILE_DATA @@ -213,7 +213,7 @@ #define VPCI_ARRAY \ . = ALIGN(POINTER_ALIGN); \ __start_vpci_array = .; \ - *(.data.rel.ro.vpci) \ + KEEP(*(.data.rel.ro.vpci))\ __end_vpci_array = .; #else #define VPCI_ARRAY -- 2.52.0
