llvm-project/lld/ELF
Fangrui Song b06426da76 [ELF] Add -Bsymbolic-non-weak-functions
This option is a subset of -Bsymbolic-functions. It applies to STB_GLOBAL
STT_FUNC definitions.

The address of a vague linkage function (STB_WEAK STT_FUNC, e.g. an inline
function, a template instantiation) seen by a -Bsymbolic-functions linked
shared object may be different from the address seen from outside the shared
object. Such cases are uncommon. (ELF/Mach-O programs may use
`-fvisibility-inlines-hidden` to break such pointer equality.  On Windows,
correct dllexport and dllimport are needed to make pointer equality work.
Windows link.exe enables /OPT:ICF by default so different inline functions may
have the same address.)

```
// a.cc -> a.o -> a.so (-Bsymbolic-functions)
inline void f() {}
void *g() { return (void *)&f; }

// b.cc -> b.o -> exe
// The address is different!
inline void f() {}
```

-Bsymbolic-non-weak-functions is a safer (C++ conforming) subset of
-Bsymbolic-functions, which can make such programs work.

Implementations usually emit a vague linkage definition in a COMDAT group.  We
could detect the group (with more code) but I feel that we should just check
STB_WEAK for simplicity. A weak definition will thus serve as an escape hatch
for rare cases when users want interposition on definitions.

GNU ld feature request: https://sourceware.org/bugzilla/show_bug.cgi?id=27871

Longer write-up: https://maskray.me/blog/2021-05-16-elf-interposition-and-bsymbolic

If Linux distributions migrate to protected non-vague-linkage external linkage
functions by default, the linker option can still be handy because it allows
rapid experiment without recompilation. Protected function addresses currently
have deep issues in GNU ld.

Reviewed By: peter.smith

Differential Revision: https://reviews.llvm.org/D102570
2021-07-29 14:46:53 -07:00
..
Arch [lld][AMDGPU] Handle R_AMDGPU_REL16 relocation. 2021-07-13 20:41:11 +01:00
AArch64ErrataFix.cpp [ELF] Move the outSecOff addend from relocAlloc/relocNonAlloc/... to InputSectionBase::relocate 2020-08-11 08:06:38 -07:00
AArch64ErrataFix.h [LLD][ELF] Optimize linker script filename glob pattern matching NFC 2020-09-16 10:26:11 +01:00
ARMErrataFix.cpp [LLD][ELF][ARM] Fix case of patched unrelocated BLX 2021-06-30 14:07:35 +01:00
ARMErrataFix.h [LLD][ELF] Optimize linker script filename glob pattern matching NFC 2020-09-16 10:26:11 +01:00
CMakeLists.txt [CMake] Make `intrinsics_gen` dependency unconditional. 2020-07-17 16:43:17 -07:00
CallGraphSort.cpp [COFF] Port CallGraphSort to COFF from ELF 2020-07-30 15:21:44 -07:00
CallGraphSort.h
Config.h [ELF] Add -Bsymbolic-non-weak-functions 2021-07-29 14:46:53 -07:00
DWARF.cpp [lib/Object] - Generalize the RelocationResolver API. 2020-11-20 10:32:49 +03:00
DWARF.h [ELF] --gdb-index: skip SHF_GROUP .debug_info 2020-08-13 09:11:01 -07:00
Driver.cpp [ELF] Add -Bsymbolic-non-weak-functions 2021-07-29 14:46:53 -07:00
Driver.h [LLD] Rename lld port driver entry function to a consistent name 2020-12-18 12:18:37 +05:30
DriverUtils.cpp [OptTable] Rename PrintHelp to printHelp 2021-06-24 14:47:03 -07:00
EhFrame.cpp ELF: Teach the linker about the 'B' augmentation string character. 2021-01-05 19:51:11 -08:00
EhFrame.h [ELF] --icf: don't fold text sections with LSDA 2020-08-05 09:16:28 -07:00
ICF.cpp [LLD][ELF] Improve ICF for relocations to ineligible sections via "aliases" 2020-10-15 12:43:14 +01:00
ICF.h
InputFiles.cpp [LTO] Add SelectionKind to IRSymtab and use it in ld.lld/LLVMgold 2021-07-20 13:22:00 -07:00
InputFiles.h [LLD] Adding support for RELA for CG Profile. 2021-07-13 13:56:30 -07:00
InputSection.cpp [ELF] Simplify getAArch64UndefinedRelativeWeakVA. NFC 2021-06-10 13:30:16 -07:00
InputSection.h [ELF] Don't consider SHF_ALLOC ".debug*" sections debug sections 2020-11-12 09:59:43 -08:00
LTO.cpp [WPD][ELF] Allow whole program devirtualization for version script localized symbols 2021-03-09 22:33:47 -08:00
LTO.h [Coding style change] Rename variables so that they start with a lowercase letter 2019-07-10 05:00:37 +00:00
LinkerScript.cpp [ELF] Preserve section order within an INSERT AFTER command 2021-06-30 11:35:50 -07:00
LinkerScript.h [ELF] Preserve section order within an INSERT AFTER command 2021-06-30 11:35:50 -07:00
MapFile.cpp [lld][ELF] Add additional time trace categories 2020-11-10 10:28:46 +00:00
MapFile.h [ELF] Add --print-archive-stats= 2020-04-29 18:04:37 -07:00
MarkLive.cpp Revert "[ELF] --gc-sections: allow GC on reserved sections in a group" 2021-07-27 16:34:32 -07:00
MarkLive.h
Options.td [ELF] Add -Bsymbolic-non-weak-functions 2021-07-29 14:46:53 -07:00
OutputSections.cpp [ELF] Check the Elf_Rel addends for dynamic relocations 2021-07-09 10:41:40 +01:00
OutputSections.h [ELF] Check the Elf_Rel addends for dynamic relocations 2021-07-09 10:41:40 +01:00
README.md
Relocations.cpp [ELF][AArch64] Write addends for TLSDESC relocations with -z rel 2021-07-09 10:41:41 +01:00
Relocations.h [ELF] Support .rela.eh_frame with unordered r_offset values 2021-04-29 08:51:09 -07:00
ScriptLexer.cpp [ELF] Optimize ScriptLexer::getLineNumber by caching the previous line number and offset 2021-06-22 15:35:24 -07:00
ScriptLexer.h [ELF] Optimize ScriptLexer::getLineNumber by caching the previous line number and offset 2021-06-22 15:35:24 -07:00
ScriptParser.cpp [ELF] Support quoted symbols in symbol assignments 2021-07-25 16:26:37 -07:00
ScriptParser.h [ELF] Improve --export-dynamic-symbol performance by checking whether wildcard is really used 2020-06-17 17:12:10 -07:00
SymbolTable.cpp [ELF] --wrap: don't clear sym->isUsedInRegularObj if real->isUsedInRegularObj; set wrap's initial binding to sym's 2021-04-17 00:29:51 -07:00
SymbolTable.h [ELF] Replace SymbolTable::forEachSymbol with iterator_range symbols() 2019-11-26 09:09:32 -08:00
Symbols.cpp [ELF] Add -Bsymbolic-non-weak-functions 2021-07-29 14:46:53 -07:00
Symbols.h [LTO] Prevent devirtualization for symbols dynamically exported 2021-01-27 15:54:13 -08:00
SyntheticSections.cpp [ELF] Add -Bsymbolic-non-weak-functions 2021-07-29 14:46:53 -07:00
SyntheticSections.h [ELF][AArch64] Write addends for TLSDESC relocations with -z rel 2021-07-09 10:41:41 +01:00
Target.cpp [ELF] Check the Elf_Rel addends for dynamic relocations 2021-07-09 10:41:40 +01:00
Target.h [lld][X86] Restore gotEntrySize. 2021-05-17 00:13:00 +01:00
Thunks.cpp [ELF] Refactor DynamicReloc to fix incorrect relocation addends 2021-07-09 10:41:40 +01:00
Thunks.h [lld] Add missing includes (NFC) 2021-06-03 18:55:18 +02:00
Writer.cpp [ELF] Align the first section of a PT_TLS even if its type is SHT_NOBITS 2021-07-29 15:14:00 +01:00
Writer.h Revert "Revert r370635, it caused PR43241." 2019-09-06 15:57:24 +00:00

README.md

See docs/NewLLD.rst