NetBSD/libexec/ld.elf_so
joerg a7f7db4a1a Remove old assert that only two segments exist. The rest of the code has
been changed to cope with more and at least Go actively creates them.
Adjust the mapping size computation to use the maximum and not depend on
PT_LOAD segments to be in order.
2017-06-23 15:29:21 +00:00
..
arch Replace last use of r_type. 2017-06-21 12:34:01 +00:00
debug.c
debug.h Fix DEBUG build. 2013-08-03 13:17:05 +00:00
diagassert.c This version of __diagssert13 is dead. 2012-03-16 11:44:54 +00:00
expand.c Trailing whitespace 2013-05-06 08:02:20 +00:00
headers.c Remove old assert that only two segments exist. The rest of the code has 2017-06-23 15:29:21 +00:00
ld.elf_so.1 Add an explicit note about the search path used by dlopen(3). 2015-07-03 10:19:29 +00:00
load.c need <sys/stat.h> 2017-01-10 21:08:48 +00:00
Makefile Replace COMBREL with just-in-time check in _rtld_relocate_nonplt_objects. 2017-06-19 11:57:01 +00:00
map_object.c Replace COMBREL with just-in-time check in _rtld_relocate_nonplt_objects. 2017-06-19 11:57:01 +00:00
paths.c we don't need <sys/mbuf.h> 2016-01-24 01:56:04 +00:00
README.TLS Add some clarifications 2011-03-10 17:38:30 +00:00
reloc.c PR port-macppc/47464 - Old binutils generated bogus zero-sized COPY 2017-04-27 08:37:15 +00:00
rtld.c Call _rtld_debug_state before running the global initialisers, so give 2017-06-08 18:24:39 +00:00
rtld.h Replace COMBREL with just-in-time check in _rtld_relocate_nonplt_objects. 2017-06-19 11:57:01 +00:00
rtldenv.h Trailing whitespace 2013-05-06 08:02:20 +00:00
search.c Trailing whitespace 2013-05-06 08:02:20 +00:00
symbol.c Replace COMBREL with just-in-time check in _rtld_relocate_nonplt_objects. 2017-06-19 11:57:01 +00:00
symbols.map Instead of using a function to resolve symbols that should be supplied by 2016-12-01 14:29:15 +00:00
symver.c convert to SIMPLEQ like the rest of the queues. 2013-05-09 15:38:14 +00:00
sysident.h Actually, descsz should not contain the padding. The note still needs to 2016-02-09 10:20:03 +00:00
tls.c fix powerpc TLS problems by removing the hacks for PPC EABI. 2014-12-14 23:49:17 +00:00
TODO Add TLS support infrastructure. For dynamic binaries, ld.elf_so exports 2011-03-09 23:10:05 +00:00
xmalloc.c don't free cp before we copy it! 2013-01-24 17:57:29 +00:00
xprintf.c Replace use of errlist with a single concatenated version and an offset 2010-12-16 22:52:32 +00:00

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.