Ignore:
File:
1 edited

Legend:

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

    r6adb775f r5035ba05  
    3737#include <adt/list.h>
    3838#include <elf/elf_load.h>
    39 #include <errno.h>
    4039#include <fcntl.h>
    4140#include <loader/pcb.h>
     
    6362        module_process_pre_arch(m);
    6463
    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");
     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");
    7569                        rel_table_process(m, m->dyn.jmp_rel, m->dyn.plt_rel_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                 }
     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);
    8387        }
    8488
     
    113117                }
    114118        }
    115        
     119
    116120        return NULL; /* Not found */
    117121}
     
    123127 * Currently this trivially tries to load '/<name>'.
    124128 */
    125 module_t *module_load(rtld_t *rtld, const char *name)
     129module_t *module_load(rtld_t *rtld, const char *name, mlflags_t flags)
    126130{
    127131        elf_finfo_t info;
     
    129133        module_t *m;
    130134        int rc;
    131        
     135
    132136        m = calloc(1, sizeof(module_t));
    133         if (m == NULL) {
     137        if (!m) {
    134138                printf("malloc failed\n");
    135139                exit(1);
     
    137141
    138142        m->rtld = rtld;
    139         m->id = rtld_get_next_id(rtld);
     143        if ((flags & mlf_local) != 0)
     144                m->local = true;
    140145
    141146        if (str_size(name) > NAME_BUF_SIZE - 2) {
     
    177182        list_append(&m->modules_link, &rtld->modules);
    178183
    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 
    187184        return m;
    188185}
     
    190187/** Load all modules on which m (transitively) depends.
    191188 */
    192 void module_load_deps(module_t *m)
     189void module_load_deps(module_t *m, mlflags_t flags)
    193190{
    194191        elf_dyn_t *dp;
     
    235232                        dm = module_find(m->rtld, dep_name);
    236233                        if (!dm) {
    237                                 dm = module_load(m->rtld, dep_name);
    238                                 module_load_deps(dm);
     234                                dm = module_load(m->rtld, dep_name, flags);
     235                                module_load_deps(dm, flags);
    239236                        }
    240237
     
    244241                ++dp;
    245242        }
    246 }
    247 
    248 /** Find module structure by ID. */
    249 module_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;
    257243}
    258244
     
    274260}
    275261
    276 void 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 
    284262/** Clear BFS tags of all modules.
    285263 */
Note: See TracChangeset for help on using the changeset viewer.