Re: [PATCH 2/2] x86/boot/compressed: Remove unnecessary sections from bzImage

From: Fangrui Song
Date: Mon Feb 24 2020 - 17:51:06 EST


On 2020-02-24, Arvind Sankar wrote:
On Mon, Feb 24, 2020 at 02:17:03PM -0800, Fangrui Song wrote:
On 2020-02-24, Arvind Sankar wrote:
>On Mon, Feb 24, 2020 at 01:28:28PM -0800, Fangrui Song wrote:
>> Hi Michael, please see my other reply on this thread: https://lkml.org/lkml/2020/2/24/47
>>
>> Synthesized sections can be matched as well. For example, SECTIONS { .pltfoo : { *(.plt) }} can rename the output section .plt to .pltfoo
>> It seems that in GNU ld, the synthesized section is associated with the
>> original object file, so it can be written as:
>>
>> SECTIONS { .pltfoo : { a.o(.plt) }}
>>
>> In lld, you need a wildcard to match the synthesized section *(.plt)
>>
>> .rela.dyn is another example.
>>
>
>With the BFD toolchain, file matching doesn't actually seem to work at
>least for .rela.dyn. I've tried playing around with it in the past and
>if you try to use file-matching to capture relocations from a particular
>input file, it just doesn't work sensibly.

I think most things are working in GNU ld...

/* a.x */
SECTIONS {
.rela.pltfoo : { a.o(.rela.plt) } /* *(.rela.plt) with lld */
.rela.dynfoo : { a.o(.rela.data) } /* *(.rela.dyn) with lld */
}

The file matching doesn't do anything sensible. If you split your .data
section out into b.s, and update the linker script so it filters for
b.o(.rela.data), .rela.dynfoo doesn't get created, instead the default
.rela.dyn will contains the .data section relocation. If you keep the
filter as a.o(.rela.data), you get .rela.dynfoo, even though a.o doesn't
actually contain any .rela.data section any more.

I raised the examples to support my viewpoint "synthesized sections can
be matched, as well as input sections."

If there is really a need (rare, not recommended) to rename output
sections only consisting of synthesized sections (e.g. .plt .rela.dyn),
for linker portability, it is better using a wildcard for the input
filename pattern.

As another example, SECTIONS { /DISCARD/ : { *(.rela.*) } } discards synthesized .rela.*


% cat <<e > a.s
.globl foo
foo:
call bar
.data
.quad quz
e
% as a.s -o a.o
% ld.bfd -T a.x a.o -shared -o a.so