View | Details | Raw Unified | Return to bug 186435 | Differences between
and this patch

Collapse All | Expand All

(-)libexec/rtld-elf/Symbol.map (+3 lines)
Lines 15-20 Link Here
15
    dlinfo;
15
    dlinfo;
16
    dl_iterate_phdr;
16
    dl_iterate_phdr;
17
    r_debug_state;
17
    r_debug_state;
18
    r_debug_add;
19
    r_debug_delete;
20
    r_debug_iterate;
18
    __tls_get_addr;
21
    __tls_get_addr;
19
};
22
};
20
23
(-)libexec/rtld-elf/rtld.c (-14 / +79 lines)
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

Return to bug 186435