Changeset View
Changeset View
Standalone View
Standalone View
libexec/rtld-elf/rtld.c
| Show First 20 Lines • Show All 5,493 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| Obj_Entry *obj; | Obj_Entry *obj; | ||||
| char *tls_block; | char *tls_block; | ||||
| struct dtv *dtv; | struct dtv *dtv; | ||||
| struct tcb *tcb; | struct tcb *tcb; | ||||
| char *addr; | char *addr; | ||||
| size_t i; | size_t i; | ||||
| size_t extra_size, maxalign, post_size, pre_size, tls_block_size; | size_t extra_size, maxalign, post_size, pre_size, tls_block_size; | ||||
| size_t tls_init_align, tls_init_offset; | size_t tls_init_align, tls_init_offset, tls_pad_offset; | ||||
jhb: Not sure if `pad` is quite the right name for this region? But given it's zeroed, that was the… | |||||
jrtc27Unsubmitted Not Done Inline Actionstls_bss_offset? Given generally arises from .tbss. jrtc27: tls_bss_offset? Given generally arises from .tbss. | |||||
| if (oldtcb != NULL && tcbsize == TLS_TCB_SIZE) | if (oldtcb != NULL && tcbsize == TLS_TCB_SIZE) | ||||
| return (oldtcb); | return (oldtcb); | ||||
| assert(tcbsize >= TLS_TCB_SIZE); | assert(tcbsize >= TLS_TCB_SIZE); | ||||
| maxalign = MAX(tcbalign, tls_static_max_align); | maxalign = MAX(tcbalign, tls_static_max_align); | ||||
| tls_init_align = MAX(obj_main->tlsalign, 1); | tls_init_align = MAX(obj_main->tlsalign, 1); | ||||
| ▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | for (obj = globallist_curr(objs); obj != NULL; | ||||
| addr = (char *)tcb + obj->tlsoffset; | addr = (char *)tcb + obj->tlsoffset; | ||||
| if (tls_init_offset > 0) | if (tls_init_offset > 0) | ||||
| memset(addr, 0, tls_init_offset); | memset(addr, 0, tls_init_offset); | ||||
| if (obj->tlsinitsize > 0) { | if (obj->tlsinitsize > 0) { | ||||
| memcpy(addr + tls_init_offset, obj->tlsinit, | memcpy(addr + tls_init_offset, obj->tlsinit, | ||||
| obj->tlsinitsize); | obj->tlsinitsize); | ||||
| } | } | ||||
| if (obj->tlssize > obj->tlsinitsize) { | if (obj->tlssize > obj->tlsinitsize) { | ||||
| memset(addr + tls_init_offset + | tls_pad_offset = tls_init_offset + | ||||
| obj->tlsinitsize, | obj->tlsinitsize; | ||||
| 0, | memset(addr + tls_pad_offset, 0, | ||||
| obj->tlssize - obj->tlsinitsize - | obj->tlssize - tls_pad_offset); | ||||
| tls_init_offset); | |||||
| } | } | ||||
| dtv->dtv_slots[obj->tlsindex - 1].dtvs_tls = addr; | dtv->dtv_slots[obj->tlsindex - 1].dtvs_tls = addr; | ||||
| } | } | ||||
| } | } | ||||
| tcb_list_insert(tcb); | tcb_list_insert(tcb); | ||||
| return (tcb); | return (tcb); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 1,143 Lines • Show Last 20 Lines | |||||
Not sure if pad is quite the right name for this region? But given it's zeroed, that was the best guess I had for it.