Lines 96-103
Link Here
|
96 |
static void init_rtld(caddr_t, Elf_Auxinfo **); |
96 |
static void init_rtld(caddr_t, Elf_Auxinfo **); |
97 |
static void initlist_add_neededs(Needed_Entry *, Objlist *); |
97 |
static void initlist_add_neededs(Needed_Entry *, Objlist *); |
98 |
static void initlist_add_objects(Obj_Entry *, Obj_Entry *, Objlist *); |
98 |
static void initlist_add_objects(Obj_Entry *, Obj_Entry *, Objlist *); |
99 |
static void linkmap_add(Obj_Entry *); |
99 |
static void linkmap_add_obj(Obj_Entry *); |
100 |
static void linkmap_delete(Obj_Entry *); |
100 |
static void linkmap_add_map(struct link_map *); |
|
|
101 |
static void linkmap_delete_obj(Obj_Entry *); |
102 |
static void linkmap_delete_map(struct link_map *); |
101 |
static void load_filtees(Obj_Entry *, int flags, RtldLockState *); |
103 |
static void load_filtees(Obj_Entry *, int flags, RtldLockState *); |
102 |
static void unload_filtees(Obj_Entry *); |
104 |
static void unload_filtees(Obj_Entry *); |
103 |
static int load_needed_objects(Obj_Entry *, int); |
105 |
static int load_needed_objects(Obj_Entry *, int); |
Lines 533-540
Link Here
|
533 |
obj_main->path, obj_main->valid_hash_sysv, obj_main->valid_hash_gnu, |
535 |
obj_main->path, obj_main->valid_hash_sysv, obj_main->valid_hash_gnu, |
534 |
obj_main->dynsymcount); |
536 |
obj_main->dynsymcount); |
535 |
|
537 |
|
536 |
linkmap_add(obj_main); |
538 |
linkmap_add_obj(obj_main); |
537 |
linkmap_add(&obj_rtld); |
539 |
linkmap_add_obj(&obj_rtld); |
538 |
|
540 |
|
539 |
/* Link the main program into the list of objects. */ |
541 |
/* Link the main program into the list of objects. */ |
540 |
TAILQ_INSERT_HEAD(&obj_list, obj_main, next); |
542 |
TAILQ_INSERT_HEAD(&obj_list, obj_main, next); |
Lines 2282-2288
Link Here
|
2282 |
TAILQ_INSERT_TAIL(&obj_list, obj, next); |
2284 |
TAILQ_INSERT_TAIL(&obj_list, obj, next); |
2283 |
obj_count++; |
2285 |
obj_count++; |
2284 |
obj_loads++; |
2286 |
obj_loads++; |
2285 |
linkmap_add(obj); /* for GDB & dlinfo() */ |
2287 |
linkmap_add_obj(obj); /* for GDB & dlinfo() */ |
2286 |
max_stack_flags |= obj->stack_flags; |
2288 |
max_stack_flags |= obj->stack_flags; |
2287 |
|
2289 |
|
2288 |
dbg(" %p .. %p: %s", obj->mapbase, |
2290 |
dbg(" %p .. %p: %s", obj->mapbase, |
Lines 3622-3640
Link Here
|
3622 |
} |
3624 |
} |
3623 |
|
3625 |
|
3624 |
static void |
3626 |
static void |
3625 |
linkmap_add(Obj_Entry *obj) |
3627 |
linkmap_add_obj(Obj_Entry *obj) |
3626 |
{ |
3628 |
{ |
3627 |
struct link_map *l = &obj->linkmap; |
3629 |
struct link_map *l = &obj->linkmap; |
3628 |
struct link_map *prev; |
|
|
3629 |
|
3630 |
|
3630 |
obj->linkmap.l_name = obj->path; |
3631 |
l->l_name = obj->path; |
3631 |
obj->linkmap.l_addr = obj->mapbase; |
3632 |
l->l_addr = obj->mapbase; |
3632 |
obj->linkmap.l_ld = obj->dynamic; |
3633 |
l->l_ld = obj->dynamic; |
3633 |
#ifdef __mips__ |
3634 |
#ifdef __mips__ |
3634 |
/* GDB needs load offset on MIPS to use the symbols */ |
3635 |
/* GDB needs load offset on MIPS to use the symbols */ |
3635 |
obj->linkmap.l_offs = obj->relocbase; |
3636 |
l->l_offs = obj->relocbase; |
3636 |
#endif |
3637 |
#endif |
3637 |
|
3638 |
|
|
|
3639 |
linkmap_add_map(l); |
3640 |
} |
3641 |
|
3642 |
static void |
3643 |
linkmap_add_map(struct link_map *l) |
3644 |
{ |
3645 |
struct link_map *prev; |
3646 |
|
3638 |
if (r_debug.r_map == NULL) { |
3647 |
if (r_debug.r_map == NULL) { |
3639 |
r_debug.r_map = l; |
3648 |
r_debug.r_map = l; |
3640 |
return; |
3649 |
return; |
Lines 3658-3667
Link Here
|
3658 |
} |
3667 |
} |
3659 |
|
3668 |
|
3660 |
static void |
3669 |
static void |
3661 |
linkmap_delete(Obj_Entry *obj) |
3670 |
linkmap_delete_obj(Obj_Entry *obj) |
3662 |
{ |
3671 |
{ |
3663 |
struct link_map *l = &obj->linkmap; |
3672 |
linkmap_delete_map(&obj->linkmap); |
|
|
3673 |
} |
3664 |
|
3674 |
|
|
|
3675 |
static void |
3676 |
linkmap_delete_map(struct link_map *l) |
3677 |
{ |
3665 |
if (l->l_prev == NULL) { |
3678 |
if (l->l_prev == NULL) { |
3666 |
if ((r_debug.r_map = l->l_next) != NULL) |
3679 |
if ((r_debug.r_map = l->l_next) != NULL) |
3667 |
l->l_next->l_prev = NULL; |
3680 |
l->l_next->l_prev = NULL; |
Lines 4300-4306
Link Here
|
4300 |
dbg("unloading \"%s\"", obj->path); |
4313 |
dbg("unloading \"%s\"", obj->path); |
4301 |
unload_filtees(root); |
4314 |
unload_filtees(root); |
4302 |
munmap(obj->mapbase, obj->mapsize); |
4315 |
munmap(obj->mapbase, obj->mapsize); |
4303 |
linkmap_delete(obj); |
4316 |
linkmap_delete_obj(obj); |
4304 |
TAILQ_REMOVE(&obj_list, obj, next); |
4317 |
TAILQ_REMOVE(&obj_list, obj, next); |
4305 |
obj_count--; |
4318 |
obj_count--; |
4306 |
obj_free(obj); |
4319 |
obj_free(obj); |
Lines 5039-5044
Link Here
|
5039 |
int _thread_autoinit_dummy_decl = 1; |
5052 |
int _thread_autoinit_dummy_decl = 1; |
5040 |
|
5053 |
|
5041 |
/* |
5054 |
/* |
|
|
5055 |
* Support for an alternative loader |
5056 |
*/ |
5057 |
|
5058 |
void |
5059 |
r_debug_add(struct link_map *m) |
5060 |
{ |
5061 |
RtldLockState lockstate; |
5062 |
wlock_acquire(rtld_bind_lock, &lockstate); |
5063 |
GDB_STATE(RT_ADD,NULL); |
5064 |
linkmap_add_map(m); |
5065 |
GDB_STATE(RT_CONSISTENT, m) |
5066 |
lock_release(rtld_bind_lock, &lockstate); |
5067 |
} |
5068 |
|
5069 |
void |
5070 |
r_debug_delete(struct link_map *m) |
5071 |
{ |
5072 |
RtldLockState lockstate; |
5073 |
wlock_acquire(rtld_bind_lock, &lockstate); |
5074 |
GDB_STATE(RT_DELETE, m); |
5075 |
linkmap_delete_map(m); |
5076 |
GDB_STATE(RT_CONSISTENT, NULL); |
5077 |
lock_release(rtld_bind_lock, &lockstate); |
5078 |
} |
5079 |
|
5080 |
int |
5081 |
r_debug_iterate(int wr, int (*callback)(struct link_map *, void *), void *param) |
5082 |
{ |
5083 |
struct link_map *m; |
5084 |
int error = 0; |
5085 |
RtldLockState lockstate; |
5086 |
|
5087 |
if (wr) { |
5088 |
wlock_acquire(rtld_bind_lock, &lockstate); |
5089 |
} else { |
5090 |
rlock_acquire(rtld_bind_lock, &lockstate); |
5091 |
} |
5092 |
|
5093 |
/* |
5094 |
* Iterate while callback returns zero |
5095 |
*/ |
5096 |
for (m = r_debug.r_map; |
5097 |
m != NULL && (error = callback(m, param)) == 0; |
5098 |
m = m->l_next) |
5099 |
; |
5100 |
|
5101 |
lock_release(rtld_bind_lock, &lockstate); |
5102 |
|
5103 |
return error; |
5104 |
} |
5105 |
|
5106 |
/* |
5042 |
* No unresolved symbols for rtld. |
5107 |
* No unresolved symbols for rtld. |
5043 |
*/ |
5108 |
*/ |
5044 |
void |
5109 |
void |