[ELF] Don't resolve relocations referencing SHN_ABS to tombstone in non-SHF_ALLOC...
authorFangrui Song <i@maskray.me>
Wed, 24 Jan 2024 16:53:36 +0000 (08:53 -0800)
committerTom Stellard <tstellar@redhat.com>
Fri, 26 Jan 2024 01:27:37 +0000 (17:27 -0800)
commit0991d3c7b53dd11981bd4f7d512b7f044c74e8f8
tree96ac1223f6071a65642ee51eb3caf7c831791809
parent453ff4b7333d4cfef8593fdf54de831d32321e44
[ELF] Don't resolve relocations referencing SHN_ABS to tombstone in non-SHF_ALLOC sections (#79238)

A SHN_ABS symbol has never been considered for
InputSection::relocateNonAlloc.
Before #74686, the code did made it work in the absence of `-z
dead-reloc-in-nonalloc=`.
There is now a report about such SHN_ABS uses

(https://github.com/llvm/llvm-project/pull/74686#issuecomment-1904101711)
and I think it makes sense for non-SHF_ALLOC to support SHN_ABS, like
SHF_ALLOC sections do.

```
// clang -g
__attribute__((weak)) int symbol;
int *foo() { return &symbol; }

0x00000023:   DW_TAG_variable [2]   (0x0000000c)
                ...
                DW_AT_location [DW_FORM_exprloc]        (DW_OP_addrx 0x0)

```

.debug_addr references `symbol`, which can be redefined by a symbol
assignment or --defsym to become a SHN_ABS symbol.

The problem is that `!sym.getOutputSection()` cannot discern SHN_ABS
from a symbol whose section has been discarded. Since commit
1981b1b6b92f7579a30c9ed32dbdf3bc749c1b40, a symbol relative to a
discarded section is changed to `Undefined`, so the `SHN_ABS` check
become trivial.

We currently apply tombstone for a relocation referencing
`SharedSymbol`. This patch does not change the behavior.

(cherry picked from commit 8abf8d124ae346016c56209de7f57b85671d4367)
lld/ELF/InputSection.cpp
lld/test/ELF/dead-reloc-in-nonalloc.s