[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