Changeset e2f26002 in mainline


Ignore:
Timestamp:
2016-05-17T17:15:13Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d2bb25e7
Parents:
bab0f42
Message:

symbol_get_addr() must treat thread-local variables differently than normal variables.

Files:
9 edited

Legend:

Unmodified
Added
Removed
  • abi/include/abi/elf.h

    rbab0f42 re2f26002  
    157157#define STT_SECTION  3
    158158#define STT_FILE     4
     159#define STT_TLS      6
    159160#define STT_LOPROC   13
    160161#define STT_HIPROC   15
  • uspace/app/dltest/dltest.c

    rbab0f42 re2f26002  
    581581
    582582        printf("Got %d, expected %d... ", val, dl_private_fib_var_val);
    583         if (val != dl_private_var_val) {
     583        if (val != dl_private_fib_var_val) {
    584584                printf("FAILED\n");
    585585                return false;
  • uspace/lib/c/arch/ia32/src/tls.c

    rbab0f42 re2f26002  
    6969    *___tls_get_addr(tls_index *ti)
    7070{
    71         size_t tls_size;
    7271        uint8_t *tls;
    73 
    74         /* Calculate size of TLS block */
    75         tls_size = tls_get_size();
    76 
    77         /* The TLS block is just before TCB */
    78         tls = (uint8_t *)__tcb_get() - tls_size;
    7972
    8073#ifdef CONFIG_RTLD
    8174        if (runtime_env != NULL) {
    82                 return rtld_tls_get_addr(runtime_env, tls, ti->ti_module,
     75                return rtld_tls_get_addr(runtime_env, ti->ti_module,
    8376                    ti->ti_offset);
    8477        }
    8578#endif
     79        /* Get address of static TLS block */
     80        tls = tls_get();
    8681        return tls + ti->ti_offset;
    8782}
  • uspace/lib/c/generic/rtld/rtld.c

    rbab0f42 re2f26002  
    187187}
    188188
    189 void *rtld_tls_get_addr(rtld_t *rtld, void *tls, unsigned long mod_id,
     189void *rtld_tls_get_addr(rtld_t *rtld, unsigned long mod_id,
    190190    unsigned long offset)
    191191{
    192192        module_t *m;
     193        uint8_t *tls;
    193194
    194195        m = module_by_id(rtld, mod_id);
    195196        assert(m != NULL);
    196197
     198        if (!link_used(&m->imodules_link)) {
     199                printf("module '%s' is not initial. aborting.\n",
     200                    m->dyn.soname);
     201                abort();
     202        }
     203
     204        tls = tls_get();
    197205        return tls + m->ioffs + offset;
    198206}
  • uspace/lib/c/generic/rtld/symbol.c

    rbab0f42 re2f26002  
    251251void *symbol_get_addr(elf_symbol_t *sym, module_t *m)
    252252{
    253         if (sym->st_shndx == SHN_ABS) {
     253        if (ELF_ST_TYPE(sym->st_info) == STT_TLS) {
     254                return rtld_tls_get_addr(m->rtld, m->id, sym->st_value);
     255        } else if (sym->st_shndx == SHN_ABS) {
    254256                /* Do not add bias to absolute symbols */
    255257                return (void *) sym->st_value;
  • uspace/lib/c/generic/tls.c

    rbab0f42 re2f26002  
    5252#endif
    5353        return &_tbss_end - &_tdata_start;
     54}
     55
     56/** Get address of static TLS block */
     57void *tls_get(void)
     58{
     59#ifdef CONFIG_TLS_VARIANT_1
     60        return (uint8_t *)__tcb_get() + sizeof(tcb_t);
     61#else /* CONFIG_TLS_VARIANT_2 */
     62        return (uint8_t *)__tcb_get() - tls_get_size();
     63#endif
    5464}
    5565
  • uspace/lib/c/include/rtld/rtld.h

    rbab0f42 re2f26002  
    5050extern tcb_t *rtld_tls_make(rtld_t *);
    5151extern unsigned long rtld_get_next_id(rtld_t *);
    52 extern void *rtld_tls_get_addr(rtld_t *, void *, unsigned long, unsigned long);
     52extern void *rtld_tls_get_addr(rtld_t *, unsigned long, unsigned long);
    5353
    5454#endif
  • uspace/lib/c/include/tls.h

    rbab0f42 re2f26002  
    5353extern void tls_free_arch(tcb_t *, size_t);
    5454extern size_t tls_get_size(void);
     55extern void *tls_get(void);
    5556
    5657#ifdef CONFIG_TLS_VARIANT_1
  • uspace/lib/dltest/libdltest.h

    rbab0f42 re2f26002  
    4343        dl_private_var_val = 220022,
    4444        dl_public_var_val = 330033,
    45         dl_private_fib_var_val = 220022,
    46         dl_public_fib_var_val = 330033
     45        dl_private_fib_var_val = 440044,
     46        dl_public_fib_var_val = 550055
    4747};
    4848
Note: See TracChangeset for help on using the changeset viewer.