Skip to content

build system: section garbage collection

Denys Vlasenko lkml 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest3 patches 1 replyIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/3build system: section garbage collection - rename sectionsDocumentation/mutex-design.txt arch/alpha/kernel/head.S arch/alpha/kernel/init_task.c +140 more+352 -3521 reply
2/3build system: section garbage collection - modpost fixscripts/mod/file2alias.c scripts/mod/modpost.c scripts/mod/modpost.h+98 -270 replies
3/3build system: section garbage collection - main partMakefile arch/alpha/boot/bootloader.lds arch/alpha/kernel/vmlinux.lds.S +42 more+342 -1140 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [PATCH 0/3] build system: section garbage collection

Hi Sam,

Quoted 8 lines · Sam Ravnborg
Quoted 6 lines · Denys Vlasenko

Build system: section garbage collection for vmlinux

Newer gcc and binutils can do dead code and data removal at link time. It is achieved using combination of -ffunction-sections -fdata-sections options for gcc and --gc-sections for ld.

Quoted 6 lines

...
Hi Denys.

We are now well pass the merge window and I like this patchset to show up in -mm. But I'm lacking time myself and wondered if you can send an updated version based on the latest -git tree from Linus?

Got around to do this.

1.fixname:
Rename all special sections with names like .text.xxxx, .data.xxxx and .rodata.xxxx to .xxxx.text/data/rodata. This makes it possible to not mix up these sections with gcc-generated ones
when gcc -ffunction-sections -fdata-sections is used. .bss.xxxx cannot be treated this way, because for section names linke .xxxx.bss gcc won't create section with correct attribute. Thus .bss.xxxxx sections are renamed .bss.k.xxxxx.

2.modpost
Update scripts/mod/* machinery to correctly handle the case when we have more than 64k sections.

3.gc
The meat of the patchset is here.
Introduce config option DISCARD_UNUSED_SECTIONS.
If it is selected:
Pass -ffunction-sections -fdata-sections to gcc and --gc-sections --print-gc-sections to ld.
Use arch/$(SRCARCH)/kernel/modules.lds.S linker script for linking *.ko files.
Generate linker map files for vmlinux and modules.
Add *(.text.*), *(.data.*) wildcards to linker scripts to accomodate new kinds of sections generated by gcc.
Add KEEP(<sections>) directives to sections which must not be discarded. Fix arch/frv/Makefile to use DISCARD_UNUSED_SECTIONS instead of what seems to be a vestigial custom solution.

Patches are against yesterday's Linus git tree and should be applied in order. They should not have any effect at all if DISCARD_UNUSED_SECTIONS is off. DISCARD_UNUSED_SECTIONS is marked DANGEROUS for now.
It is likely to not work on arches other than x86 (modules.lds needs to be added for each arch).

Compile and run tested on 32-bit x86 (running this kernel now).

--
vda