Changeset 29405ac in mainline


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
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/dltest/dltest.c

    r0dc9a474 r29405ac  
    4343
    4444/** libdltest library handle */
    45 void *handle;
    46 
     45static void *handle;
     46
     47/** If true, do not run dlfcn tests */
     48static bool no_dlfcn = false;
    4749
    4850/** Test dlsym() function */
     
    691693#endif
    692694
    693 int main(int argc, char *argv[])
    694 {
    695 
    696         printf("Dynamic linking test\n");
    697 
     695static int test_dlfcn(void)
     696{
    698697        printf("dlopen()... ");
    699698        handle = dlopen("libdltest.so.0", 0);
     
    747746                return 1;
    748747
    749 #ifdef DLTEST_LINKED
    750         if (!test_lnk_dl_get_constant())
    751                 return 1;
    752 
    753         if (!test_lnk_dl_get_private_var())
    754                 return 1;
    755 
    756         if (!test_lnk_dl_get_private_uvar())
    757                 return 1;
    758 
    759         if (!test_lnk_dl_get_public_var())
    760                 return 1;
    761 
    762         if (!test_lnk_dl_get_public_uvar())
    763                 return 1;
    764 
    765         if (!test_lnk_read_public_var())
    766                 return 1;
    767 
    768         if (!test_lnk_read_public_uvar())
    769                 return 1;
    770 
    771         if (!test_lnk_dl_get_private_fib_var())
    772                 return 1;
    773 
    774         if (!test_lnk_dl_get_private_fib_uvar())
    775                 return 1;
    776 
    777         if (!test_lnk_dl_get_public_fib_var())
    778                 return 1;
    779 
    780         if (!test_lnk_dl_get_public_fib_uvar())
    781                 return 1;
    782 
    783         if (!test_lnk_read_public_fib_var())
    784                 return 1;
    785 
    786         if (!test_lnk_read_public_fib_uvar())
    787                 return 1;
    788 #endif
    789748//      printf("dlclose()... ");
    790749//      dlclose(handle);
    791750//      printf("Passed\n");
    792751
     752        return 0;
     753}
     754
     755#ifdef DLTEST_LINKED
     756
     757static int test_lnk(void)
     758{
     759        if (!test_lnk_dl_get_constant())
     760                return 1;
     761
     762        if (!test_lnk_dl_get_private_var())
     763                return 1;
     764
     765        if (!test_lnk_dl_get_private_uvar())
     766                return 1;
     767
     768        if (!test_lnk_dl_get_public_var())
     769                return 1;
     770
     771        if (!test_lnk_dl_get_public_uvar())
     772                return 1;
     773
     774        if (!test_lnk_read_public_var())
     775                return 1;
     776
     777        if (!test_lnk_read_public_uvar())
     778                return 1;
     779
     780        if (!test_lnk_dl_get_private_fib_var())
     781                return 1;
     782
     783        if (!test_lnk_dl_get_private_fib_uvar())
     784                return 1;
     785
     786        if (!test_lnk_dl_get_public_fib_var())
     787                return 1;
     788
     789        if (!test_lnk_dl_get_public_fib_uvar())
     790                return 1;
     791
     792        if (!test_lnk_read_public_fib_var())
     793                return 1;
     794
     795        if (!test_lnk_read_public_fib_uvar())
     796                return 1;
     797
     798        return 0;
     799}
     800
     801#endif
     802
     803static void print_syntax(void)
     804{
     805        fprintf(stderr, "syntax: dltest [-n]\n");
     806        fprintf(stderr, "\t-n Do not run dlfcn tests\n");
     807}
     808
     809int main(int argc, char *argv[])
     810{
     811        printf("Dynamic linking test\n");
     812
     813        if (argc > 1) {
     814                if (argc > 2) {
     815                        print_syntax();
     816                        return 1;
     817                }
     818
     819                if (str_cmp(argv[1], "-n") == 0) {
     820                        no_dlfcn = true;
     821                } else {
     822                        print_syntax();
     823                        return 1;
     824                }
     825        }
     826
     827        if (!no_dlfcn) {
     828                if (test_dlfcn() != 0)
     829                        return 1;
     830        }
     831
     832#ifdef DLTEST_LINKED
     833        if (test_lnk() != 0)
     834                return 1;
     835#endif
     836
    793837        printf("All passed.\n");
    794838        return 0;
  • 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.