Changeset 2c4e1cc in mainline


Ignore:
Timestamp:
2018-04-04T17:01:18Z (6 years ago)
Author:
Jiří Zárevúcky <jiri.zarevucky@…>
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)
Message:

Define TLS consistently in linker scripts, and remove nonstandard symbols.

Read the program header to find TLS instead.

Files:
1 added
15 edited

Legend:

Unmodified
Added
Removed
  • .gitignore

    r1433ecda r2c4e1cc  
    464464tools/gdb-*.tar.gz
    465465tools/sycek/
     466tools/downloads/
  • uspace/lib/c/Makefile

    r1433ecda r2c4e1cc  
    7777        generic/dnsr.c \
    7878        generic/dlfcn.c \
     79        generic/elf/elf.c \
    7980        generic/elf/elf_load.c \
    8081        generic/elf/elf_mod.c \
  • uspace/lib/c/arch/abs32le/_link.ld.in

    r1433ecda r2c4e1cc  
    88        text PT_LOAD FILEHDR PHDRS FLAGS(5);
    99        data PT_LOAD FLAGS(6);
     10        tls PT_TLS;
    1011}
    1112
     
    4041
    4142        .tdata : {
    42                 _tdata_start = .;
    4343                *(.tdata);
     44                *(.tdata.*);
     45                *(.gnu.linkonce.td.*);
     46        } :data :tls
     47
     48        .tbss : {
     49                *(.tbss);
     50                *(.tbss.*);
    4451                *(.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
    5253
    5354        .sbss : {
  • uspace/lib/c/arch/amd64/_link.ld.in

    r1433ecda r2c4e1cc  
    88        text PT_LOAD FILEHDR PHDRS FLAGS(5);
    99        data PT_LOAD FLAGS(6);
     10        tls PT_TLS;
    1011        debug PT_NOTE;
    1112}
     
    4546
    4647        .tdata : {
    47                 _tdata_start = .;
    4848                *(.tdata);
    49                 _tdata_end = .;
    50                 _tbss_start = .;
     49                *(.tdata.*);
     50                *(.gnu.linkonce.td.*);
     51        } :data :tls
     52
     53        .tbss : {
    5154                *(.tbss);
    52                 _tbss_end = .;
    53         } :data
    54 
    55         _tls_alignment = ALIGNOF(.tdata);
     55                *(.tbss.*);
     56                *(.gnu.linkonce.tb.*);
     57        } :data :tls
    5658
    5759        .bss : {
  • uspace/lib/c/arch/arm32/_link.ld.in

    r1433ecda r2c4e1cc  
    88        text PT_LOAD FILEHDR PHDRS FLAGS(5);
    99        data PT_LOAD FLAGS(6);
     10        tls PT_TLS;
    1011}
    1112
     
    4546
    4647        .tdata : {
    47                 _tdata_start = .;
    4848                *(.tdata);
    49                 _tdata_end = .;
    50                 _tbss_start = .;
     49                *(.tdata.*);
     50                *(.gnu.linkonce.td.*);
     51        } :data :tls
     52
     53        .tbss : {
    5154                *(.tbss);
    52                 _tbss_end = .;
    53         } :data
    54 
    55         _tls_alignment = ALIGNOF(.tdata);
     55                *(.tbss.*);
     56                *(.gnu.linkonce.tb.*);
     57        } :data :tls
    5658
    5759        .bss : {
  • uspace/lib/c/arch/ia32/_link.ld.in

    r1433ecda r2c4e1cc  
    9999
    100100        .tdata : {
    101                 _tdata_start = .;
    102101                *(.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.*);
    110104        } :data :tls
    111105
    112         _tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss));
     106        .tbss : {
     107                *(.tbss);
     108                *(.tbss.*);
     109                *(.gnu.linkonce.tb.*);
     110        } :data :tls
    113111
    114112        .bss : {
  • uspace/lib/c/arch/ia64/_link.ld.in

    r1433ecda r2c4e1cc  
    88        text PT_LOAD FILEHDR PHDRS FLAGS(5);
    99        data PT_LOAD FLAGS(6);
     10        tls PT_TLS;
    1011}
    1112
     
    5455
    5556        .tdata : {
    56                 _tdata_start = .;
    5757                *(.tdata);
    58                 _tdata_end = .;
    59                 _tbss_start = .;
     58                *(.tdata.*);
     59                *(.gnu.linkonce.td.*);
     60        } :data :tls
     61
     62        .tbss : {
    6063                *(.tbss);
    61                 _tbss_end = .;
    62         } :data
    63 
    64         _tls_alignment = ALIGNOF(.tdata);
     64                *(.tbss.*);
     65                *(.gnu.linkonce.tb.*);
     66        } :data :tls
    6567
    6668        .bss : {
  • uspace/lib/c/arch/mips32/_link.ld.in

    r1433ecda r2c4e1cc  
    88        text PT_LOAD FILEHDR PHDRS FLAGS(5);
    99        data PT_LOAD FLAGS(6);
     10        tls PT_TLS;
    1011}
    1112
     
    4950
    5051        .tdata : {
    51                 _tdata_start = .;
    5252                *(.tdata);
    53                 _tdata_end = .;
    54         } :data
     53                *(.tdata.*);
     54                *(.gnu.linkonce.td.*);
     55        } :data :tls
    5556
    5657        .tbss : {
    57                 _tbss_start = .;
    5858                *(.tbss);
    59                 _tbss_end = .;
    60         } :data
    61 
    62         _tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss));
     59                *(.tbss.*);
     60                *(.gnu.linkonce.tb.*);
     61        } :data :tls
    6362
    6463        .sbss : {
  • uspace/lib/c/arch/ppc32/_link.ld.in

    r1433ecda r2c4e1cc  
    88        text PT_LOAD FILEHDR PHDRS FLAGS(5);
    99        data PT_LOAD FLAGS(6);
     10        tls PT_TLS;
    1011        debug PT_NOTE;
    1112}
     
    4546
    4647        .tdata : {
    47                 _tdata_start = .;
    4848                *(.tdata);
    49                 _tdata_end = .;
    50                 _tbss_start = .;
     49                *(.tdata.*);
     50                *(.gnu.linkonce.td.*);
     51        } :data :tls
     52
     53        .tbss : {
    5154                *(.tbss);
    52                 _tbss_end = .;
    53         } :data
    54 
    55         _tls_alignment = ALIGNOF(.tdata);
     55                *(.tbss.*);
     56                *(.gnu.linkonce.tb.*);
     57        } :data :tls
    5658
    5759        .bss : {
  • uspace/lib/c/arch/riscv64/_link.ld.in

    r1433ecda r2c4e1cc  
    88        text PT_LOAD FILEHDR PHDRS FLAGS(5);
    99        data PT_LOAD FLAGS(6);
     10        tls PT_TLS;
    1011        debug PT_NOTE;
    1112}
     
    4344
    4445        .tdata : {
    45                 _tdata_start = .;
    4646                *(.tdata);
     47                *(.tdata.*);
     48                *(.gnu.linkonce.td.*);
     49        } :data :tls
     50
     51        .tbss : {
     52                *(.tbss);
     53                *(.tbss.*);
    4754                *(.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
    5556
    5657        .sbss : {
  • uspace/lib/c/arch/sparc64/_link.ld.in

    r1433ecda r2c4e1cc  
    88        text PT_LOAD FILEHDR PHDRS FLAGS(5);
    99        data PT_LOAD FLAGS(6);
     10        tls PT_TLS;
    1011        debug PT_NOTE;
    1112}
     
    5051
    5152        .tdata : {
    52                 _tdata_start = .;
    5353                *(.tdata);
    54                 _tdata_end = .;
    55                 _tbss_start = .;
     54                *(.tdata.*);
     55                *(.gnu.linkonce.td.*);
     56        } :data :tls
     57
     58        .tbss : {
    5659                *(.tbss);
    57                 _tbss_end = .;
    58         } :data
    59 
    60         _tls_alignment = ALIGNOF(.tdata);
     60                *(.tbss.*);
     61                *(.gnu.linkonce.tb.*);
     62        } :data :tls
    6163
    6264        .bss : {
  • uspace/lib/c/generic/rtld/module.c

    r1433ecda r2c4e1cc  
    7070        module->local = true;
    7171
    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;
    7680
    7781        list_append(&module->modules_link, &rtld->modules);
  • uspace/lib/c/generic/tls.c

    r1433ecda r2c4e1cc  
    4141#include <stdlib.h>
    4242#include <str.h>
     43#include <elf/elf.h>
    4344
    4445#ifdef CONFIG_RTLD
     
    5253                return runtime_env->tls_size;
    5354#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;
    5559}
    5660
     
    7377        void *data;
    7478        tcb_t *tcb;
    75         size_t tls_size = &_tbss_end - &_tdata_start;
    7679
    7780#ifdef CONFIG_RTLD
     
    8083#endif
    8184
    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)
    8488                return NULL;
     89
     90        uintptr_t bias = elf_get_bias(__executable_start);
     91
     92        tcb = tls_alloc_arch(&data, tls->p_memsz);
    8593
    8694        /*
    8795         * Copy thread local data from the initialization image.
    8896         */
    89         memcpy(data, &_tdata_start, &_tdata_end - &_tdata_start);
     97        memcpy(data, (void *)(tls->p_vaddr + bias), tls->p_filesz);
    9098        /*
    9199         * Zero out the thread local uninitialized data.
    92100         */
    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);
    95102
    96103        return tcb;
     
    151158        tcb_t *tcb;
    152159
    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);
    155164        if (*data == NULL)
    156165                return NULL;
     
    171180void tls_free_variant_2(tcb_t *tcb, size_t size)
    172181{
    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);
    174184        void *start = ((void *) tcb) - size;
    175185        free(start);
  • uspace/lib/c/include/elf/elf.h

    r1433ecda r2c4e1cc  
    4141#include <libarch/elf.h>
    4242
     43extern const uint8_t __executable_start[];
     44
     45extern const elf_segment_header_t *elf_get_phdr(const void *, unsigned);
     46extern uintptr_t elf_get_bias(const void *);
     47
    4348#endif
    4449
  • uspace/lib/c/include/tls.h

    r1433ecda r2c4e1cc  
    4343#define DTV_GN(dtv) (((uintptr_t *)(dtv))[0])
    4444
    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 
    5445extern tcb_t *tls_make(void);
    5546extern tcb_t *tls_alloc_arch(void **, size_t);
Note: See TracChangeset for help on using the changeset viewer.