version 1.6, 2002/07/22 01:20:50 |
version 1.7, 2002/07/31 04:42:01 |
|
|
return BKPT_KEEP_CONT; |
return BKPT_KEEP_CONT; |
} |
} |
|
|
|
/* Is the ABI really so daft that it doesn't include the linking offset? */ |
|
struct xlink_map { |
|
struct link_map lm; |
|
Elf_Addr a; |
|
}; |
|
|
/* |
/* |
* Called after execution started so that we can load any dynamic symbols. |
* Called after execution started so that we can load any dynamic symbols. |
*/ |
*/ |
|
|
elf_update(struct pstate *ps) |
elf_update(struct pstate *ps) |
{ |
{ |
#ifndef __NetBSD__ |
#ifndef __NetBSD__ |
struct elf_object_v1 eobj; |
struct xlink_map xlm; |
|
#define lm xlm.lm |
struct r_debug rdeb; |
struct r_debug rdeb; |
reg addr; |
reg addr; |
Elf_Dyn dyn; |
Elf_Dyn dyn; |
|
|
char fname[MAXPATHLEN]; |
char fname[MAXPATHLEN]; |
int i; |
int i; |
|
|
if (process_read(ps, addr, &eobj, sizeof(eobj)) < 0) { |
if (process_read(ps, addr, &xlm, sizeof(xlm)) < 0) { |
warnx("Can't read symbols..."); |
warnx("Can't read symbols..."); |
return; |
return; |
} |
} |
|
|
addr = (Elf_Addr)eobj.next; |
addr = (Elf_Addr)lm.l_next; |
|
|
if (eobj.load_name == NULL || eobj.load_name == (char *)-1) |
if (lm.l_name == NULL || lm.l_name == (char *)-1) |
continue; |
continue; |
if (process_read(ps, (Elf_Addr)eobj.load_name, fname, |
if (process_read(ps, (Elf_Addr)lm.l_name, fname, |
sizeof(fname)) < 0) { |
sizeof(fname)) < 0) { |
warnx("Can't read symbols..."); |
warnx("Can't read symbols..."); |
return; |
return; |
|
|
if (i == MAXPATHLEN) |
if (i == MAXPATHLEN) |
continue; |
continue; |
|
|
if (st_open(ps, fname, eobj.load_offs) == NULL) |
if (st_open(ps, fname, xlm.a) == NULL) |
warn("symbol loading failed"); |
warn("symbol loading failed"); |
} |
} |
#endif |
#endif |