[lld] [ELF] Orphan placement: remove hasInputSections condition (PR #93761)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 1 00:01:29 PDT 2024
MaskRay wrote:
> > > Basically, the linker now takes into account sections defined in a linker script when placing orphans, right?
> > > Yes.
>
> My concerns are for cases like:
>
> ```
> > cat test.s
> .section ".text1","ax","progbits"; nop;
> .section ".text2","ax","progbits"; nop;
> .section ".rodata","a","progbits"; .long 0;
> .section ".orphan","a","progbits"; .long 0;
> > cat test.t
> PHDRS { text PT_LOAD; rodata PT_LOAD; }
> SECTIONS {
> .text1 : { *(.text1) } : text
> #.other : { foo = .; *(.other) }
> .other : { LONG(0); *(.other) }
> .text2 : { *(.text2) }
> .rodata : { *(.rodata) } : rodata
> }
> > llvm-mc -filetype=obj test.s -o test.o
> > ld.lld -shared test.o -T test.t -o test.so
> > llvm-readelf -l test.so
> ...
> LOAD 0x001000 0x0000000000000000 0x0000000000000000 0x000056 0x000056 R E 0x1000
> LOAD 0x001056 0x0000000000000056 0x0000000000000056 0x00007a 0x00007a RW 0x1000
>
> Section to Segment mapping:
> Segment Sections...
> 00 .text1 .text .other .orphan .dynsym .gnu.hash .hash .dynstr .text2
> 01 .rodata .dynamic
> ...
> ```
>
> Of course, this example is oversimplified, but I see something similar in our projects.
>
> For this sample, GNU linkers and current `lld` place `.orphan` and the synthetic sections after `.rodata`, while the patched `lld` puts them in the middle of an executable segment. The problem is that output sections without input sections are usually unaware of their flags, as they normally inherit them from their input sections. With the new placement rules, such faint sections are used as anchors for orphans, moving them to unsuitable locations.
Thanks for the example. This and #92987 convince me that we should do #94099 (when there are multiple most similar sections, select the last one if its rank <= orphan's rank).
With #94099, this patch will not cause a test change and your `.orphan` example will have no behavior change.
I think this patch is still controversial. #94099 is probably a clear improvement.
https://github.com/llvm/llvm-project/pull/93761
More information about the llvm-commits
mailing list