Changeset 29405ac in mainline for uspace/lib/c


Ignore:
Timestamp:
2016-05-16T18:10:00Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bab0f42
Parents:
0dc9a474
Message:

DTPMOD relocations with null symbol name should return the current module index. Implement TPOFF relocations. dltest -n to not run dlfcn tests. Now dltest -n works like a charm. Place TLS images in descending order for variant II just to be safe. Propagate TLS alignment info.

Location:
uspace/lib/c
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/arch/ia32/include/libarch/rtld/elf_dyn.h

    r0dc9a474 r29405ac  
    3636#define LIBC_ia32_RTLD_ELF_DYN_H_
    3737
    38 /* 
     38/*
    3939 * ia32 dynamic relocation types
    4040 */
     
    4747#define R_386_RELATIVE  8
    4848
     49#define R_386_TLS_TPOFF    14
    4950#define R_386_TLS_DTPMOD32 35
     51#define R_386_TLS_DTPOFF32 36
    5052
    5153#endif
  • uspace/lib/c/arch/ia32/src/rtld/reloc.c

    r0dc9a474 r29405ac  
    115115                        sym_addr = 0;
    116116                        sym_def = NULL;
     117
     118                        /*
     119                         * DTPMOD with null st_name should return the index
     120                         * of the current module.
     121                         */
     122                        dest = m;
    117123                }
    118124
     
    171177                        break;
    172178
    173 //              case R_386_TLS_DTPOFF32:
    174 //                      *r_ptr = sym_def->st_value;
    175 //                      break;
     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;
    176188
    177189                case R_386_TLS_DTPMOD32:
     190                        DPRINTF("fixup R_386_TLS_DTPMOD32\n");
    178191                        *r_ptr = dest->id;
    179192                        break;
  • uspace/lib/c/generic/elf/elf_mod.c

    r0dc9a474 r29405ac  
    260260        info->tdata_size = hdr->p_filesz;
    261261        info->tbss_size = hdr->p_memsz - hdr->p_filesz;
     262        info->tls_align = hdr->p_align;
    262263}
    263264
  • uspace/lib/c/generic/rtld/module.c

    r0dc9a474 r29405ac  
    189189        m->tdata_size = info.tls.tdata_size;
    190190        m->tbss_size = info.tls.tbss_size;
     191        m->tls_align = info.tls.tls_align;
    191192
    192193        printf("tdata at %p size %zu, tbss size %zu\n",
     
    284285void modules_process_tls(rtld_t *rtld)
    285286{
     287#ifdef CONFIG_TLS_VARIANT_1
    286288        list_foreach(rtld->modules, modules_link, module_t, m) {
    287289                m->ioffs = rtld->tls_size;
    288290                rtld->tls_size += m->tdata_size + m->tbss_size;
    289291        }
     292#else /* CONFIG_TLS_VARIANT_2 */
     293        size_t offs;
     294
     295        list_foreach(rtld->modules, modules_link, module_t, m) {
     296                rtld->tls_size += m->tdata_size + m->tbss_size;
     297        }
     298
     299        offs = 0;
     300        list_foreach(rtld->modules, modules_link, module_t, m) {
     301                offs += m->tdata_size + m->tbss_size;
     302                m->ioffs = rtld->tls_size - offs;
     303        }
     304#endif
    290305}
    291306
  • uspace/lib/c/generic/rtld/rtld.c

    r0dc9a474 r29405ac  
    9595        prog->tdata_size = p_info->tls.tdata_size;
    9696        prog->tbss_size = p_info->tls.tbss_size;
     97        prog->tls_align = p_info->tls.tls_align;
    9798
    9899        printf("prog tdata at %p size %zu, tbss size %zu\n",
     
    116117        module_load_deps(prog, 0);
    117118
     119        /* Compute static TLS size */
     120        modules_process_tls(env);
     121
    118122        /*
    119123         * Now relocate/link all modules together.
     
    124128        modules_process_relocs(env, prog);
    125129
    126         modules_process_tls(env);
    127 
    128130        *rre = env;
    129131        return EOK;
     
    149151         */
    150152
     153#ifdef CONFIG_TLS_VARIANT_1
     154        /*
     155         * Ascending addresses
     156         */
    151157        offset = 0;
    152158        list_foreach(rtld->modules, modules_link, module_t, m) {
     
    157163                offset += m->tbss_size;
    158164        }
     165#else /* CONFIG_TLS_VARIANT_2 */
     166        /*
     167         * Descending addresses
     168         */
     169        offset = 0;
     170        list_foreach(rtld->modules, modules_link, module_t, m) {
     171                assert(offset + m->tdata_size + m->tbss_size <= rtld->tls_size);
     172                offset += m->tbss_size;
     173                memset(data + rtld->tls_size - offset, 0, m->tbss_size);
     174                offset += m->tdata_size;
     175                memcpy(data + rtld->tls_size - offset, m->tdata, m->tdata_size);
     176        }
     177#endif
    159178
    160179        return tcb;
  • uspace/lib/c/include/elf/elf_mod.h

    r0dc9a474 r29405ac  
    6666        /** Size of tbss section */
    6767        size_t tbss_size;
     68        /** Alignment of TLS initialization image */
     69        size_t tls_align;
    6870} elf_tls_info_t;
    6971
  • uspace/lib/c/include/types/rtld/module.h

    r0dc9a474 r29405ac  
    5959        /** tbss size */
    6060        size_t tbss_size;
     61        /** TLS alignment */
     62        size_t tls_align;
    6163
    6264        size_t ioffs;
Note: See TracChangeset for help on using the changeset viewer.