Changeset f570cdf in mainline for uspace/lib/c/arch
- Timestamp:
- 2016-05-24T15:32:57Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c170438
- Parents:
- dcc150cb (diff), 0a981e3 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- uspace/lib/c/arch/ia32
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/arch/ia32/_link.ld.in
rdcc150cb rf570cdf 12 12 #endif 13 13 data PT_LOAD FLAGS(6); 14 tls PT_TLS; 14 15 #if defined(SHLIB) || defined(DLEXE) 15 16 dynamic PT_DYNAMIC; … … 95 96 #endif 96 97 98 .tdata : { 97 99 #ifndef DLEXE 98 .tdata : {99 100 _tdata_start = .; 101 #endif 100 102 *(.tdata); 101 103 *(.gnu.linkonce.tb.*); 104 #ifndef DLEXE 102 105 _tdata_end = .; 106 #endif 107 } :data :tls 108 .tbss : { 109 #ifndef DLEXE 103 110 _tbss_start = .; 111 #endif 104 112 *(.tbss); 113 #ifndef DLEXE 105 114 _tbss_end = .; 106 } :data 115 #endif 116 } :data :tls 107 117 108 _tls_alignment = ALIGNOF(.tdata); 118 #ifndef DLEXE 119 _tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); 109 120 #endif 110 121 -
uspace/lib/c/arch/ia32/include/libarch/rtld/elf_dyn.h
rdcc150cb rf570cdf 36 36 #define LIBC_ia32_RTLD_ELF_DYN_H_ 37 37 38 /* 38 /* 39 39 * ia32 dynamic relocation types 40 40 */ … … 47 47 #define R_386_RELATIVE 8 48 48 49 #define R_386_TLS_TPOFF 14 49 50 #define R_386_TLS_DTPMOD32 35 51 #define R_386_TLS_DTPOFF32 36 50 52 51 53 #endif -
uspace/lib/c/arch/ia32/include/libarch/tls.h
rdcc150cb rf570cdf 43 43 void *self; 44 44 void *fibril_data; 45 void **dtv; 45 46 } tcb_t; 46 47 -
uspace/lib/c/arch/ia32/src/rtld/reloc.c
rdcc150cb rf570cdf 101 101 sym_def = symbol_def_find(str_tab + sym->st_name, 102 102 m, ssf_none, &dest); 103 //DPRINTF("dest name: '%s'\n", dest->dyn.soname);103 DPRINTF("dest name: '%s'\n", dest->dyn.soname); 104 104 // DPRINTF("dest bias: 0x%x\n", dest->bias); 105 105 if (sym_def) { 106 106 sym_addr = (uint32_t) 107 symbol_get_addr(sym_def, dest );107 symbol_get_addr(sym_def, dest, NULL); 108 108 // DPRINTF("symbol definition found, addr=0x%x\n", sym_addr); 109 109 } else { … … 115 115 sym_addr = 0; 116 116 sym_def = NULL; 117 118 /* 119 * DTPMOD with null st_name should return the index 120 * of the current module. 121 */ 122 dest = m; 117 123 } 118 124 … … 148 154 if (sym_def) { 149 155 sym_addr = (uint32_t) 150 symbol_get_addr(sym_def, dest );156 symbol_get_addr(sym_def, dest, NULL); 151 157 } else { 152 158 printf("Source definition of '%s' not found.\n", … … 171 177 break; 172 178 179 case R_386_TLS_TPOFF: 180 DPRINTF("fixup R_386_TLS_TPOFF\n"); 181 *r_ptr = (dest->ioffs + sym_def->st_value) - dest->rtld->tls_size; 182 break; 183 184 case R_386_TLS_DTPOFF32: 185 DPRINTF("fixup R_386_TLS_DTPOFF32\n"); 186 *r_ptr = sym_def->st_value; 187 break; 188 173 189 case R_386_TLS_DTPMOD32: 174 /* 175 * We can ignore this as long as the only module 176 * with TLS variables is libc.so. 177 */ 178 DPRINTF("Ignoring R_386_TLS_DTPMOD32\n"); 190 DPRINTF("fixup R_386_TLS_DTPMOD32\n"); 191 *r_ptr = dest->id; 179 192 break; 180 193 -
uspace/lib/c/arch/ia32/src/tls.c
rdcc150cb rf570cdf 1 1 /* 2 2 * Copyright (c) 2006 Ondrej Palkovsky 3 * Copyright (c) 2016 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 39 40 #include <align.h> 40 41 42 #ifdef CONFIG_RTLD 43 #include <rtld/rtld.h> 44 #endif 45 41 46 tcb_t *tls_alloc_arch(void **data, size_t size) 42 47 { … … 64 69 *___tls_get_addr(tls_index *ti) 65 70 { 66 size_t tls_size;67 71 uint8_t *tls; 68 72 69 /* Calculate size of TLS block */ 70 tls_size = ALIGN_UP(&_tbss_end - &_tdata_start, &_tls_alignment); 71 72 /* The TLS block is just before TCB */ 73 tls = (uint8_t *)__tcb_get() - tls_size; 74 73 #ifdef CONFIG_RTLD 74 if (runtime_env != NULL) { 75 return rtld_tls_get_addr(runtime_env, __tcb_get(), 76 ti->ti_module, ti->ti_offset); 77 } 78 #endif 79 /* Get address of static TLS block */ 80 tls = tls_get(); 75 81 return tls + ti->ti_offset; 76 82 }
Note:
See TracChangeset
for help on using the changeset viewer.