When linking to create xen-syms, add --gc-sections to garbage collect unused stuff. Relies on CONFIG_CC_SPLIT_SECTIONS
We need to add KEEP() to the linker script in assorted places to retain appropriate data - especially the arrays created therein. Something is off though. In a test where memory_add() is unreachable, it is still included. I'm not sure, but I am wondering if it's the alternatives somehow keeping a reference to it. Signed-off-by: Jason Andryuk <[email protected]> --- With --print-gc-sections on defconfig: 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/arch/x86/Makefile | 3 +++ xen/arch/x86/xen.lds.S | 38 +++++++++++++++++++------------------- xen/include/xen/xen.lds.h | 18 +++++++++--------- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile index 300cc67407..934c79411a 100644 --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -137,18 +137,21 @@ $(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) \ + --gc-sections \ $(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) \ + --gc-sections \ $(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) \ + --gc-sections \ $(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 527872a6db..e3ad58f688 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -76,7 +76,7 @@ SECTIONS _start = .; DECL_SECTION(.text) { _stext = .; /* Text and read-only data */ - *(.text.header) + KEEP(*(.text.header)) . = ALIGN(PAGE_SIZE); _stextentry = .; @@ -98,7 +98,7 @@ SECTIONS #endif *(.text.__x86_indirect_thunk_*) - *(.fixup) + KEEP(*(.fixup)) *(.gnu.warning) _etext = .; /* End of text section */ } PHDR(text) = 0x9090 @@ -116,12 +116,12 @@ SECTIONS . = ALIGN(8); /* Exception table */ __start___ex_table = .; - *(.ex_table) + KEEP(*(.ex_table)) __stop___ex_table = .; /* Pre-exception table */ __start___pre_ex_table = .; - *(.ex_table.pre) + KEEP(*(.ex_table.pre)) __stop___pre_ex_table = .; . = ALIGN(PAGE_SIZE); @@ -212,7 +212,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); @@ -225,8 +225,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) @@ -234,13 +234,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) @@ -248,10 +248,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): @@ -260,21 +260,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) @@ -316,7 +316,7 @@ SECTIONS *(.data.read_mostly) . = ALIGN(8); __start_schedulers_array = .; - *(.data.schedulers) + KEEP(*(.data.schedulers)) __end_schedulers_array = .; HYPFS_PARAM diff --git a/xen/include/xen/xen.lds.h b/xen/include/xen/xen.lds.h index f54fb2d152..9a1eb23c73 100644 --- a/xen/include/xen/xen.lds.h +++ b/xen/include/xen/xen.lds.h @@ -144,32 +144,32 @@ . = 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 @@ -177,7 +177,7 @@ #define HYPFS_PARAM \ . = ALIGN(POINTER_ALIGN); \ __paramhypfs_start = .; \ - *(.data.paramhypfs) \ + KEEP(*(.data.paramhypfs)) \ __paramhypfs_end = .; #else #define HYPFS_PARAM @@ -187,7 +187,7 @@ #define LOCK_PROFILE_DATA \ . = ALIGN(POINTER_ALIGN); \ __lock_profile_start = .; \ - *(.lockprofile.data) \ + KEEP(*(.lockprofile.data))\ __lock_profile_end = .; #else #define LOCK_PROFILE_DATA @@ -207,7 +207,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.51.1
