Re: [PATCH 4/4] powerpc: Allow LD_DEAD_CODE_DATA_ELIMINATION to be selected

Christophe LEROY
2018-04-20T13:21:37Z

Le 20/04/2018 à 12:36, Nicholas Piggin a écrit :
> On Fri, 20 Apr 2018 12:01:34 +0200
> Christophe LEROY <christophe.leroy@c-s.fr> wrote:
>
>> Le 20/04/2018 à 09:34, Nicholas Piggin a écrit :
>>> This requires further changes to linker script to KEEP some tables
>>> and wildcard compiler generated sections into the right place. This
>>> includes pp32 modifications from Christophe Leroy.
>>>
>>> When compiling powernv_defconfig with this option:
>>>
>>> text data bss dec filename
>>> 11827621 4810490 1341080 17979191 vmlinux
>>> 11752437 4598858 1338776 17690071 vmlinux.dcde
>>>
>>> Resulting kernel is almost 400kB smaller (and still boots).
>>>
>>> [ppc32 numbers here]

Here a few results, obtained with readelf -l vmlinux | grep LOAD

First val is filesz, second is memsz, for each config you get the size
before and after activation of LD_DCDE, and the difference between the two.

mpc83xx_defconfig:
Before: 0x5ecfe0 0x60b69c
After: 0x5d2fe0 0x5f04a4
Diff: 0x01a000 0x01b4c8

mpc83xx_defconfig without CONFIG_MODULE:
Before: 0x5c1040 0x5e0614
After: 0x55f040 0x57d314
Diff: 0x062000 0x063300

mpc885_ads_defconfig:
Before: 0x36eda4 0x38da04
After: 0x316da4 0x333764
Diff: 0x058000 0x05a2a0

Custom mpc885 config:
Before: 0x719948 0x78bc34
After: 0x6b9948 0x72a99c
Diff: 0x060000 0x061298

Custom mpc8321 config:
Before: 0x70f714 0x7d766c
After: 0x6af714 0x7763ec
Diff: 0x060000 0x061280

>>>
>>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>>> ---
>>> arch/powerpc/Kconfig | 1 +
>>> arch/powerpc/kernel/vmlinux.lds.S | 22 +++++++++++-----------
>>> 2 files changed, 12 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
>>> index c32a181a7cbb..ee6dbe2efc8b 100644
>>> --- a/arch/powerpc/Kconfig
>>> +++ b/arch/powerpc/Kconfig
>>> @@ -205,6 +205,7 @@ config PPC
>>> select HAVE_KPROBES
>>> select HAVE_KPROBES_ON_FTRACE
>>> select HAVE_KRETPROBES
>>> + select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
>>> select HAVE_LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS
>>> select HAVE_MEMBLOCK
>>> select HAVE_MEMBLOCK_NODE_MAP
>>> diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S
>>> index c8af90ff49f0..89381dc959ce 100644
>>> --- a/arch/powerpc/kernel/vmlinux.lds.S
>>> +++ b/arch/powerpc/kernel/vmlinux.lds.S
>>> @@ -89,7 +89,7 @@ SECTIONS
>>> */
>>> .text BLOCK(0) : AT(ADDR(.text) - LOAD_OFFSET) {
>>> #ifdef CONFIG_LD_HEAD_STUB_CATCH
>>> - *(.linker_stub_catch);
>>> + KEEP(*(.linker_stub_catch));
>>> . = . ;
>>> #endif
>>>
>>> @@ -98,7 +98,7 @@ SECTIONS
>>> ALIGN_FUNCTION();
>>> #endif
>>> /* careful! __ftr_alt_* sections need to be close to .text */
>>> - *(.text.hot .text .text.fixup .text.unlikely .fixup __ftr_alt_* .ref.text);
>>> + *(.text.hot .text .text.[0-9a-zA-Z_]* .text.fixup .text.unlikely .fixup __ftr_alt_* .ref.text);
>>
>> Why not use TEXT_MAIN here instead of .text .text.[0-9a-zA-Z_]* ?
>
> It's from my early patch before we added those in the generic linker
> script. Yes your version looks nicer.
>
> Thanks,
> Nick
>