NetBSD/libexec/ld.elf_so
riastradh 07fb20a384 ld.elf_so(1): Omit needless membar_enter.
The use of membar_enter is to separate atomic r/m/w on a lock from
the body of the critical section so two different critical sections
happen in order:

		body of previous critical section;

	exit critical section:
		membar_exit();
		atomic_r/m/w(lock stuff);

	enter critical section:
		atomic_r/m/w(lock stuff);
		membar_enter();

		body of next critical section;

_rtld_shared_enter does this, but it _also_ issued an extraneous
membar_enter before the atomic_r/m/w part, which doesn't impose any
semantically important order but may cost some performance.
2021-06-16 21:53:51 +00:00
..
arch Don't or the got object in, just assign it. Fixes cc -mabi=64 hello.c -lcrypto 2021-03-06 20:11:08 +00:00
Makefile Specify NOLIBCSANITIZER for the ELF loader 2020-02-09 09:11:59 +00:00
README.TLS Fix typos 2018-12-01 13:01:57 +00:00
TODO
compat.c Move compatibility for pre-2.0 ELF binaries into separate file. 2018-10-17 23:36:58 +00:00
debug.c
debug.h
diagassert.c
expand.c
headers.c Fix debug build 2020-05-16 16:43:15 +00:00
ld.elf_so.1 $ORIGIN support is now enabled. 2019-04-15 10:17:01 +00:00
load.c Upgrade the SVR4 RTLD r_debug protocol to version 1 2020-09-21 16:08:57 +00:00
map_object.c PT_GNU_RELRO segments are arranged such that their vaddr + memsz ends 2020-03-04 01:21:17 +00:00
paths.c
reloc.c Implement DT_GNU_HASH 2020-02-29 04:24:33 +00:00
rtld.c ld.elf_so(1): Omit needless membar_enter. 2021-06-16 21:53:51 +00:00
rtld.h Upgrade the SVR4 RTLD r_debug protocol to version 1 2020-09-21 16:08:57 +00:00
rtldenv.h
search.c Mark _rtld_invalid_paths static as ldd can end up with two copies 2020-04-22 23:54:32 +00:00
symbol.c Fix vax and mips build 2020-02-29 18:45:20 +00:00
symbols.map Rename __atomic_fork to __locked_fork and give it &errno as argument. 2020-04-19 01:06:15 +00:00
symver.c
sysident.h Actually, descsz should not contain the padding. The note still needs to 2016-02-09 10:20:03 +00:00
tls.c Use alignof and not size_t for platforms with non-natural base 2019-11-05 22:22:42 +00:00
xmalloc.c
xprintf.c pretend we know about %# and %j... 2021-03-06 20:09:39 +00:00

README.TLS

Steps for adding TLS support for a new platform:

(1) Declare TLS variant in machine/types.h by defining either
__HAVE_TLS_VARIANT_I or __HAVE_TLS_VARIANT_II.

(2) _lwp_makecontext has to set the reserved register or kernel transfer
variable in uc_mcontext to the provided value of 'private'. See
src/lib/libc/arch/$PLATFORM/gen/_lwp.c.

This is not possible on the VAX as there is no free space in ucontext_t.
This requires either a special version of _lwp_create or versioning
everything using ucontext_t. Debug support depends on getting the data from
ucontext_t, so the second option is possibly required.

(3) _lwp_setprivate(2) has to update the same register as
_lwp_makecontext uses for the private area pointer. Normally
cpu_lwp_setprivate is provided by MD to reflect the kernel view and
enabled by defining __HAVE_CPU_LWP_SETPRIVATE in machine/types.h.
cpu_setmcontext is responsible for keeping the MI l_private field
synchronised by calling lwp_setprivate as needed.

cpu_switchto has to update the mapping.

_lwp_setprivate is used for the initial thread, all other threads
created by libpthread use _lwp_makecontext for this purpose.

(4) Provide __tls_get_addr and possible other MD functions for dynamic
TLS offset computation. If such alternative entry points exist (currently
only i386), also add a weak reference to 0 in src/lib/libc/tls/tls.c.

The generic implementation can be found in tls.c and is used with
__HAVE_COMMON___TLS_GET_ADDR. It depends on __lwp_getprivate_fast
(see below).

(5) Implement the necessary relocation records in mdreloc.c.  There are
typically three relocation types found in dynamic binaries:

(a) R_TYPE(TLS_DTPOFF): Offset inside the module.  The common TLS code
ensures that the DTV vector points to offset 0 inside the module TLS block.
This is normally def->st_value + rela->r_addend.

(b) R_TYPE(TLS_DTPMOD): Module index.

(c) R_TYPE(TLS_TPOFF): Static TLS offset.  The code has to check whether
the static TLS offset for this module has been allocated
(defobj->tls_done) and otherwise call _rtld_tls_offset_allocate().  This
may fail if no static space is available and the object has been pulled
in via dlopen(3).

For TLS Variant I, this is typically:

def->st_value + rela->r_addend + defobj->tlsoffset + sizeof(struct tls_tcb)

e.g. the relocation doesn't include the fixed TCB.

For TLS Variant II, this is typically:

def->st_value - defobj->tlsoffset + rela->r_addend

e.g. starting offset is counting down from the TCB.

(6) Implement __lwp_getprivate_fast() in machine/mcontext.h and set
__HAVE___LWP_GETPRIVATE_FAST in machine/types.h.

(7) Test using src/tests/lib/libc/tls.  Make sure with "objdump -R" that
t_tls_dynamic has two TPOFF relocations and h_tls_dlopen.so.1 and
libh_tls_dynamic.so.1 have both two DTPMOD and DTPOFF relocations.