[all-commits] [llvm/llvm-project] 0991d3: [ELF] Don't resolve relocations referencing SHN_AB...

Fangrui Song via All-commits all-commits at lists.llvm.org
Thu Jan 25 17:28:14 PST 2024


  Branch: refs/heads/release/18.x
  Home:   https://github.com/llvm/llvm-project
  Commit: 0991d3c7b53dd11981bd4f7d512b7f044c74e8f8
      https://github.com/llvm/llvm-project/commit/0991d3c7b53dd11981bd4f7d512b7f044c74e8f8
  Author: Fangrui Song <i at maskray.me>
  Date:   2024-01-25 (Thu, 25 Jan 2024)

  Changed paths:
    M lld/ELF/InputSection.cpp
    M lld/test/ELF/dead-reloc-in-nonalloc.s

  Log Message:
  -----------
  [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)




More information about the All-commits mailing list