Changeset 2c4e1cc in mainline
- Timestamp:
- 2018-04-04T17:01:18Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5754c31e
- Parents:
- 1433ecda
- git-author:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-04-03 16:54:34)
- git-committer:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-04-04 17:01:18)
- Files:
-
- 1 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
r1433ecda r2c4e1cc 464 464 tools/gdb-*.tar.gz 465 465 tools/sycek/ 466 tools/downloads/ -
uspace/lib/c/Makefile
r1433ecda r2c4e1cc 77 77 generic/dnsr.c \ 78 78 generic/dlfcn.c \ 79 generic/elf/elf.c \ 79 80 generic/elf/elf_load.c \ 80 81 generic/elf/elf_mod.c \ -
uspace/lib/c/arch/abs32le/_link.ld.in
r1433ecda r2c4e1cc 8 8 text PT_LOAD FILEHDR PHDRS FLAGS(5); 9 9 data PT_LOAD FLAGS(6); 10 tls PT_TLS; 10 11 } 11 12 … … 40 41 41 42 .tdata : { 42 _tdata_start = .;43 43 *(.tdata); 44 *(.tdata.*); 45 *(.gnu.linkonce.td.*); 46 } :data :tls 47 48 .tbss : { 49 *(.tbss); 50 *(.tbss.*); 44 51 *(.gnu.linkonce.tb.*); 45 _tdata_end = .; 46 _tbss_start = .; 47 *(.tbss); 48 _tbss_end = .; 49 } :data 50 51 _tls_alignment = ALIGNOF(.tdata); 52 } :data :tls 52 53 53 54 .sbss : { -
uspace/lib/c/arch/amd64/_link.ld.in
r1433ecda r2c4e1cc 8 8 text PT_LOAD FILEHDR PHDRS FLAGS(5); 9 9 data PT_LOAD FLAGS(6); 10 tls PT_TLS; 10 11 debug PT_NOTE; 11 12 } … … 45 46 46 47 .tdata : { 47 _tdata_start = .;48 48 *(.tdata); 49 _tdata_end = .; 50 _tbss_start = .; 49 *(.tdata.*); 50 *(.gnu.linkonce.td.*); 51 } :data :tls 52 53 .tbss : { 51 54 *(.tbss); 52 _tbss_end = .; 53 } :data 54 55 _tls_alignment = ALIGNOF(.tdata); 55 *(.tbss.*); 56 *(.gnu.linkonce.tb.*); 57 } :data :tls 56 58 57 59 .bss : { -
uspace/lib/c/arch/arm32/_link.ld.in
r1433ecda r2c4e1cc 8 8 text PT_LOAD FILEHDR PHDRS FLAGS(5); 9 9 data PT_LOAD FLAGS(6); 10 tls PT_TLS; 10 11 } 11 12 … … 45 46 46 47 .tdata : { 47 _tdata_start = .;48 48 *(.tdata); 49 _tdata_end = .; 50 _tbss_start = .; 49 *(.tdata.*); 50 *(.gnu.linkonce.td.*); 51 } :data :tls 52 53 .tbss : { 51 54 *(.tbss); 52 _tbss_end = .; 53 } :data 54 55 _tls_alignment = ALIGNOF(.tdata); 55 *(.tbss.*); 56 *(.gnu.linkonce.tb.*); 57 } :data :tls 56 58 57 59 .bss : { -
uspace/lib/c/arch/ia32/_link.ld.in
r1433ecda r2c4e1cc 99 99 100 100 .tdata : { 101 _tdata_start = .;102 101 *(.tdata); 103 *(.gnu.linkonce.tb.*); 104 _tdata_end = .; 105 } :data :tls 106 .tbss : { 107 _tbss_start = .; 108 *(.tbss); 109 _tbss_end = .; 102 *(.tdata.*); 103 *(.gnu.linkonce.td.*); 110 104 } :data :tls 111 105 112 _tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); 106 .tbss : { 107 *(.tbss); 108 *(.tbss.*); 109 *(.gnu.linkonce.tb.*); 110 } :data :tls 113 111 114 112 .bss : { -
uspace/lib/c/arch/ia64/_link.ld.in
r1433ecda r2c4e1cc 8 8 text PT_LOAD FILEHDR PHDRS FLAGS(5); 9 9 data PT_LOAD FLAGS(6); 10 tls PT_TLS; 10 11 } 11 12 … … 54 55 55 56 .tdata : { 56 _tdata_start = .;57 57 *(.tdata); 58 _tdata_end = .; 59 _tbss_start = .; 58 *(.tdata.*); 59 *(.gnu.linkonce.td.*); 60 } :data :tls 61 62 .tbss : { 60 63 *(.tbss); 61 _tbss_end = .; 62 } :data 63 64 _tls_alignment = ALIGNOF(.tdata); 64 *(.tbss.*); 65 *(.gnu.linkonce.tb.*); 66 } :data :tls 65 67 66 68 .bss : { -
uspace/lib/c/arch/mips32/_link.ld.in
r1433ecda r2c4e1cc 8 8 text PT_LOAD FILEHDR PHDRS FLAGS(5); 9 9 data PT_LOAD FLAGS(6); 10 tls PT_TLS; 10 11 } 11 12 … … 49 50 50 51 .tdata : { 51 _tdata_start = .;52 52 *(.tdata); 53 _tdata_end = .; 54 } :data 53 *(.tdata.*); 54 *(.gnu.linkonce.td.*); 55 } :data :tls 55 56 56 57 .tbss : { 57 _tbss_start = .;58 58 *(.tbss); 59 _tbss_end = .; 60 } :data 61 62 _tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); 59 *(.tbss.*); 60 *(.gnu.linkonce.tb.*); 61 } :data :tls 63 62 64 63 .sbss : { -
uspace/lib/c/arch/ppc32/_link.ld.in
r1433ecda r2c4e1cc 8 8 text PT_LOAD FILEHDR PHDRS FLAGS(5); 9 9 data PT_LOAD FLAGS(6); 10 tls PT_TLS; 10 11 debug PT_NOTE; 11 12 } … … 45 46 46 47 .tdata : { 47 _tdata_start = .;48 48 *(.tdata); 49 _tdata_end = .; 50 _tbss_start = .; 49 *(.tdata.*); 50 *(.gnu.linkonce.td.*); 51 } :data :tls 52 53 .tbss : { 51 54 *(.tbss); 52 _tbss_end = .; 53 } :data 54 55 _tls_alignment = ALIGNOF(.tdata); 55 *(.tbss.*); 56 *(.gnu.linkonce.tb.*); 57 } :data :tls 56 58 57 59 .bss : { -
uspace/lib/c/arch/riscv64/_link.ld.in
r1433ecda r2c4e1cc 8 8 text PT_LOAD FILEHDR PHDRS FLAGS(5); 9 9 data PT_LOAD FLAGS(6); 10 tls PT_TLS; 10 11 debug PT_NOTE; 11 12 } … … 43 44 44 45 .tdata : { 45 _tdata_start = .;46 46 *(.tdata); 47 *(.tdata.*); 48 *(.gnu.linkonce.td.*); 49 } :data :tls 50 51 .tbss : { 52 *(.tbss); 53 *(.tbss.*); 47 54 *(.gnu.linkonce.tb.*); 48 _tdata_end = .; 49 _tbss_start = .; 50 *(.tbss); 51 _tbss_end = .; 52 } :data 53 54 _tls_alignment = ALIGNOF(.tdata); 55 } :data :tls 55 56 56 57 .sbss : { -
uspace/lib/c/arch/sparc64/_link.ld.in
r1433ecda r2c4e1cc 8 8 text PT_LOAD FILEHDR PHDRS FLAGS(5); 9 9 data PT_LOAD FLAGS(6); 10 tls PT_TLS; 10 11 debug PT_NOTE; 11 12 } … … 50 51 51 52 .tdata : { 52 _tdata_start = .;53 53 *(.tdata); 54 _tdata_end = .; 55 _tbss_start = .; 54 *(.tdata.*); 55 *(.gnu.linkonce.td.*); 56 } :data :tls 57 58 .tbss : { 56 59 *(.tbss); 57 _tbss_end = .; 58 } :data 59 60 _tls_alignment = ALIGNOF(.tdata); 60 *(.tbss.*); 61 *(.gnu.linkonce.tb.*); 62 } :data :tls 61 63 62 64 .bss : { -
uspace/lib/c/generic/rtld/module.c
r1433ecda r2c4e1cc 70 70 module->local = true; 71 71 72 module->tdata = &_tdata_start; 73 module->tdata_size = &_tdata_end - &_tdata_start; 74 module->tbss_size = &_tbss_end - &_tbss_start; 75 module->tls_align = (uintptr_t)&_tls_alignment; 72 const elf_segment_header_t *tls = 73 elf_get_phdr(__executable_start, PT_TLS); 74 uintptr_t bias = elf_get_bias(__executable_start); 75 76 module->tdata = (void *) (tls->p_vaddr + bias); 77 module->tdata_size = tls->p_filesz; 78 module->tbss_size = tls->p_memsz - tls->p_filesz; 79 module->tls_align = tls->p_align; 76 80 77 81 list_append(&module->modules_link, &rtld->modules); -
uspace/lib/c/generic/tls.c
r1433ecda r2c4e1cc 41 41 #include <stdlib.h> 42 42 #include <str.h> 43 #include <elf/elf.h> 43 44 44 45 #ifdef CONFIG_RTLD … … 52 53 return runtime_env->tls_size; 53 54 #endif 54 return &_tbss_end - &_tdata_start; 55 56 const elf_segment_header_t *tls = 57 elf_get_phdr(__executable_start, PT_TLS); 58 return tls->p_memsz; 55 59 } 56 60 … … 73 77 void *data; 74 78 tcb_t *tcb; 75 size_t tls_size = &_tbss_end - &_tdata_start;76 79 77 80 #ifdef CONFIG_RTLD … … 80 83 #endif 81 84 82 tcb = tls_alloc_arch(&data, tls_size); 83 if (!tcb) 85 const elf_segment_header_t *tls = 86 elf_get_phdr(__executable_start, PT_TLS); 87 if (tls == NULL) 84 88 return NULL; 89 90 uintptr_t bias = elf_get_bias(__executable_start); 91 92 tcb = tls_alloc_arch(&data, tls->p_memsz); 85 93 86 94 /* 87 95 * Copy thread local data from the initialization image. 88 96 */ 89 memcpy(data, &_tdata_start, &_tdata_end - &_tdata_start);97 memcpy(data, (void *)(tls->p_vaddr + bias), tls->p_filesz); 90 98 /* 91 99 * Zero out the thread local uninitialized data. 92 100 */ 93 memset(data + (&_tbss_start - &_tdata_start), 0, 94 &_tbss_end - &_tbss_start); 101 memset(data + tls->p_filesz, 0, tls->p_memsz - tls->p_filesz); 95 102 96 103 return tcb; … … 151 158 tcb_t *tcb; 152 159 153 size = ALIGN_UP(size, &_tls_alignment); 154 *data = memalign((uintptr_t) &_tls_alignment, sizeof(tcb_t) + size); 160 uintptr_t align = elf_get_phdr(__executable_start, PT_TLS)->p_align; 161 162 size = ALIGN_UP(size, align); 163 *data = memalign(align, sizeof(tcb_t) + size); 155 164 if (*data == NULL) 156 165 return NULL; … … 171 180 void tls_free_variant_2(tcb_t *tcb, size_t size) 172 181 { 173 size = ALIGN_UP(size, &_tls_alignment); 182 uintptr_t align = elf_get_phdr(__executable_start, PT_TLS)->p_align; 183 size = ALIGN_UP(size, align); 174 184 void *start = ((void *) tcb) - size; 175 185 free(start); -
uspace/lib/c/include/elf/elf.h
r1433ecda r2c4e1cc 41 41 #include <libarch/elf.h> 42 42 43 extern const uint8_t __executable_start[]; 44 45 extern const elf_segment_header_t *elf_get_phdr(const void *, unsigned); 46 extern uintptr_t elf_get_bias(const void *); 47 43 48 #endif 44 49 -
uspace/lib/c/include/tls.h
r1433ecda r2c4e1cc 43 43 #define DTV_GN(dtv) (((uintptr_t *)(dtv))[0]) 44 44 45 /*46 * Symbols defined in the respective linker script.47 */48 extern char _tls_alignment;49 extern char _tdata_start;50 extern char _tdata_end;51 extern char _tbss_start;52 extern char _tbss_end;53 54 45 extern tcb_t *tls_make(void); 55 46 extern tcb_t *tls_alloc_arch(void **, size_t);
Note:
See TracChangeset
for help on using the changeset viewer.