[ELF] Add -z dead-reloc-in-nonalloc=<section_glob>=<value>
authorFangrui Song <maskray@google.com>
Wed, 8 Jul 2020 17:10:43 +0000 (10:10 -0700)
committerFangrui Song <maskray@google.com>
Wed, 8 Jul 2020 17:15:16 +0000 (10:15 -0700)
commit4ce56b8122219f7b79d75d33184e3ec890a6e222
tree9dc9df07481d45142d9051200ad020e9c3915e19
parent9520b6c8ab63061e1734deef8614eaa60f704dc9
[ELF] Add -z dead-reloc-in-nonalloc=<section_glob>=<value>

... to customize the tombstone value we use for an absolute relocation
referencing a discarded symbol. This can be used as a workaround when
some debug processing tool has trouble with current -1 tombstone value
(https://bugs.chromium.org/p/chromium/issues/detail?id=1102223#c11 )

For example, to get the current built-in rules (not considering the .debug_line special case for ICF):

```
-z dead-reloc-in-nonalloc='.debug_*=0xffffffffffffffff'
-z dead-reloc-in-nonalloc=.debug_loc=0xfffffffffffffffe
-z dead-reloc-in-nonalloc=.debug_ranges=0xfffffffffffffffe
```

To get GNU ld (as of binutils 2.35)'s behavior:

```
-z dead-reloc-in-nonalloc='*=0'
-z dead-reloc-in-nonalloc=.debug_ranges=1
```

This option has other use cases. For example, if we want to check
whether a non-SHF_ALLOC section has dead relocations.
With this patch, we can run a regular LLD and run another with a special
-z dead-reloc-in-nonalloc=, then compare their output.

Reviewed By: thakis

Differential Revision: https://reviews.llvm.org/D83264
lld/ELF/Config.h
lld/ELF/Driver.cpp
lld/ELF/InputSection.cpp
lld/docs/ld.lld.1
lld/test/ELF/dead-reloc-in-nonalloc.s [new file with mode: 0644]
lld/test/ELF/debug-dead-reloc.s