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