Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/rtld/module.c

    r5035ba05 r6adb775f  
    3737#include <adt/list.h>
    3838#include <elf/elf_load.h>
     39#include <errno.h>
    3940#include <fcntl.h>
    4041#include <loader/pcb.h>
     
    6263        module_process_pre_arch(m);
    6364
    64         /* jmp_rel table */
    65         if (m->dyn.jmp_rel != NULL) {
    66                 DPRINTF("jmp_rel table\n");
    67                 if (m->dyn.plt_rel == DT_REL) {
    68                         DPRINTF("jmp_rel table type DT_REL\n");
     65        if (m->dyn.plt_rel == DT_REL) {
     66                DPRINTF("table type DT_REL\n");
     67                if (m->dyn.rel != NULL) {
     68                        DPRINTF("non-empty\n");
     69                        rel_table_process(m, m->dyn.rel, m->dyn.rel_sz);
     70                }
     71                /* FIXME: this seems wrong */
     72                if (m->dyn.jmp_rel != NULL) {
     73                DPRINTF("table type jmp-rel\n");
     74                        DPRINTF("non-empty\n");
    6975                        rel_table_process(m, m->dyn.jmp_rel, m->dyn.plt_rel_sz);
    70                 } else {
    71                         assert(m->dyn.plt_rel == DT_RELA);
    72                         DPRINTF("jmp_rel table type DT_RELA\n");
    73                         rela_table_process(m, m->dyn.jmp_rel, m->dyn.plt_rel_sz);
    74                 }
    75         }
    76 
    77         /* rel table */
    78         if (m->dyn.rel != NULL) {
    79                 DPRINTF("rel table\n");
    80                 rel_table_process(m, m->dyn.rel, m->dyn.rel_sz);
    81         }
    82 
    83         /* rela table */
    84         if (m->dyn.rela != NULL) {
    85                 DPRINTF("rela table\n");
    86                 rela_table_process(m, m->dyn.rela, m->dyn.rela_sz);
     76                }
     77        } else { /* (m->dyn.plt_rel == DT_RELA) */
     78                DPRINTF("table type DT_RELA\n");
     79                if (m->dyn.rela != NULL) {
     80                        DPRINTF("non-empty\n");
     81                        rela_table_process(m, m->dyn.rela, m->dyn.rela_sz);
     82                }
    8783        }
    8884
     
    117113                }
    118114        }
    119 
     115       
    120116        return NULL; /* Not found */
    121117}
     
    127123 * Currently this trivially tries to load '/<name>'.
    128124 */
    129 module_t *module_load(rtld_t *rtld, const char *name, mlflags_t flags)
     125module_t *module_load(rtld_t *rtld, const char *name)
    130126{
    131127        elf_finfo_t info;
     
    133129        module_t *m;
    134130        int rc;
    135 
     131       
    136132        m = calloc(1, sizeof(module_t));
    137         if (!m) {
     133        if (m == NULL) {
    138134                printf("malloc failed\n");
    139135                exit(1);
     
    141137
    142138        m->rtld = rtld;
    143         if ((flags & mlf_local) != 0)
    144                 m->local = true;
     139        m->id = rtld_get_next_id(rtld);
    145140
    146141        if (str_size(name) > NAME_BUF_SIZE - 2) {
     
    182177        list_append(&m->modules_link, &rtld->modules);
    183178
     179        /* Copy TLS info */
     180        m->tdata = info.tls.tdata;
     181        m->tdata_size = info.tls.tdata_size;
     182        m->tbss_size = info.tls.tbss_size;
     183
     184        printf("tdata at %p size %zu, tbss size %zu\n",
     185            m->tdata, m->tdata_size, m->tbss_size);
     186
    184187        return m;
    185188}
     
    187190/** Load all modules on which m (transitively) depends.
    188191 */
    189 void module_load_deps(module_t *m, mlflags_t flags)
     192void module_load_deps(module_t *m)
    190193{
    191194        elf_dyn_t *dp;
     
    232235                        dm = module_find(m->rtld, dep_name);
    233236                        if (!dm) {
    234                                 dm = module_load(m->rtld, dep_name, flags);
    235                                 module_load_deps(dm, flags);
     237                                dm = module_load(m->rtld, dep_name);
     238                                module_load_deps(dm);
    236239                        }
    237240
     
    241244                ++dp;
    242245        }
     246}
     247
     248/** Find module structure by ID. */
     249module_t *module_by_id(rtld_t *rtld, unsigned long id)
     250{
     251        list_foreach(rtld->modules, modules_link, module_t, m) {
     252                if (m->id == id)
     253                        return m;
     254        }
     255
     256        return NULL;
    243257}
    244258
     
    260274}
    261275
     276void modules_process_tls(rtld_t *rtld)
     277{
     278        list_foreach(rtld->modules, modules_link, module_t, m) {
     279                m->ioffs = rtld->tls_size;
     280                rtld->tls_size += m->tdata_size + m->tbss_size;
     281        }
     282}
     283
    262284/** Clear BFS tags of all modules.
    263285 */
Note: See TracChangeset for help on using the changeset viewer.