llvm-project/lld/docs
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
..
ELF [ELF] Add OVERWRITE_SECTIONS command 2021-06-13 12:41:11 -07:00
_static
_templates
llvm-theme
AtomLLD.rst Doc: Links should use https 2020-03-22 22:49:33 +01:00
CMakeLists.txt
Driver.rst
NewLLD.rst Doc: Links should use https 2020-03-22 22:49:33 +01:00
Partitions.rst
README.txt
Readers.rst
ReleaseNotes.rst [ELF] Add -Bsymbolic-non-weak-functions 2021-07-29 14:46:53 -07:00
WebAssembly.rst [lld][WebAssembly] Add new `--import-undefined` option 2021-06-17 11:44:21 -07:00
conf.py Bump the trunk major version to 14 2021-07-27 21:58:25 -07:00
design.rst Doc: Links should use https 2020-03-22 22:49:33 +01:00
development.rst Doc: Links should use https 2020-03-22 22:49:33 +01:00
error_handling_script.rst [lld] Provide a hook to customize undefined symbols error handling 2020-11-09 13:28:48 +01:00
getting_started.rst doc: use the right url to bugzilla 2020-03-22 22:49:40 +01:00
hello.png
index.rst Provide a hook to customize missing library error handling 2020-11-03 11:01:29 +01:00
ld.lld.1 [ELF] Add -Bsymbolic-non-weak-functions 2021-07-29 14:46:53 -07:00
make.bat
missingkeyfunction.rst
open_projects.rst
partitions.dot
partitions.svg
sphinx_intro.rst
windows_support.rst

README.txt

lld Documentation
=================

The lld documentation is written using the Sphinx documentation generator. It is
currently tested with Sphinx 1.1.3.

We currently use the 'nature' theme and a Beaker inspired structure.

See sphinx_intro.rst for more details.