|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] RFC: xen/x86: Enable --gc-sections
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 <jason.andryuk@xxxxxxx>
---
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |