Changes in uspace/lib/c/generic/rtld/module.c [6adb775f:5035ba05] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/rtld/module.c
r6adb775f r5035ba05 37 37 #include <adt/list.h> 38 38 #include <elf/elf_load.h> 39 #include <errno.h>40 39 #include <fcntl.h> 41 40 #include <loader/pcb.h> … … 63 62 module_process_pre_arch(m); 64 63 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"); 75 69 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); 83 87 } 84 88 … … 113 117 } 114 118 } 115 119 116 120 return NULL; /* Not found */ 117 121 } … … 123 127 * Currently this trivially tries to load '/<name>'. 124 128 */ 125 module_t *module_load(rtld_t *rtld, const char *name )129 module_t *module_load(rtld_t *rtld, const char *name, mlflags_t flags) 126 130 { 127 131 elf_finfo_t info; … … 129 133 module_t *m; 130 134 int rc; 131 135 132 136 m = calloc(1, sizeof(module_t)); 133 if ( m == NULL) {137 if (!m) { 134 138 printf("malloc failed\n"); 135 139 exit(1); … … 137 141 138 142 m->rtld = rtld; 139 m->id = rtld_get_next_id(rtld); 143 if ((flags & mlf_local) != 0) 144 m->local = true; 140 145 141 146 if (str_size(name) > NAME_BUF_SIZE - 2) { … … 177 182 list_append(&m->modules_link, &rtld->modules); 178 183 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 187 184 return m; 188 185 } … … 190 187 /** Load all modules on which m (transitively) depends. 191 188 */ 192 void module_load_deps(module_t *m )189 void module_load_deps(module_t *m, mlflags_t flags) 193 190 { 194 191 elf_dyn_t *dp; … … 235 232 dm = module_find(m->rtld, dep_name); 236 233 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); 239 236 } 240 237 … … 244 241 ++dp; 245 242 } 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;257 243 } 258 244 … … 274 260 } 275 261 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 284 262 /** Clear BFS tags of all modules. 285 263 */
Note:
See TracChangeset
for help on using the changeset viewer.