2002-10-21 Elena Zannoni <ezannoni@redhat.com>
* solib-svr4.c (svr4_fetch_objfile_link_map): New function. * solib-svr4.h (svr4_fetch_objfile_link_map): Export.
This commit is contained in:
parent
631cb423b2
commit
bc4a16aedd
2 changed files with 76 additions and 0 deletions
|
@ -1,3 +1,8 @@
|
|||
2002-10-21 Elena Zannoni <ezannoni@redhat.com>
|
||||
|
||||
* solib-svr4.c (svr4_fetch_objfile_link_map): New function.
|
||||
* solib-svr4.h (svr4_fetch_objfile_link_map): Export.
|
||||
|
||||
2002-10-21 Elena Zannoni <ezannoni@redhat.com>
|
||||
|
||||
* symtab.h (address_class): Rename
|
||||
|
|
|
@ -762,6 +762,77 @@ svr4_current_sos (void)
|
|||
return head;
|
||||
}
|
||||
|
||||
/* Get the address of the link_map for a given OBJFILE. Loop through
|
||||
the link maps, and return the address of the one corresponding to
|
||||
the given objfile. Note that this function takes into account that
|
||||
objfile can be the main executable, not just a shared library. The
|
||||
main executable has always an empty name field in the linkmap. */
|
||||
|
||||
CORE_ADDR
|
||||
svr4_fetch_objfile_link_map (struct objfile *objfile)
|
||||
{
|
||||
CORE_ADDR lm;
|
||||
|
||||
if ((debug_base = locate_base ()) == 0)
|
||||
return 0; /* failed somehow... */
|
||||
|
||||
/* Position ourselves on the first link map. */
|
||||
lm = first_link_map_member ();
|
||||
while (lm)
|
||||
{
|
||||
/* Get info on the layout of the r_debug and link_map structures. */
|
||||
struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS ();
|
||||
int errcode;
|
||||
char *buffer;
|
||||
struct lm_info objfile_lm_info;
|
||||
struct cleanup *old_chain;
|
||||
CORE_ADDR name_address;
|
||||
char *l_name_buf = xmalloc (lmo->l_name_size);
|
||||
old_chain = make_cleanup (xfree, l_name_buf);
|
||||
|
||||
/* Set up the buffer to contain the portion of the link_map
|
||||
structure that gdb cares about. Note that this is not the
|
||||
whole link_map structure. */
|
||||
objfile_lm_info.lm = xmalloc (lmo->link_map_size);
|
||||
make_cleanup (xfree, objfile_lm_info.lm);
|
||||
memset (objfile_lm_info.lm, 0, lmo->link_map_size);
|
||||
|
||||
/* Read the link map into our internal structure. */
|
||||
read_memory (lm, objfile_lm_info.lm, lmo->link_map_size);
|
||||
|
||||
/* Read address of name from target memory to GDB. */
|
||||
read_memory (lm + lmo->l_name_offset, l_name_buf, lmo->l_name_size);
|
||||
|
||||
/* Extract this object's name. */
|
||||
name_address = extract_address (l_name_buf,
|
||||
lmo->l_name_size);
|
||||
target_read_string (name_address, &buffer,
|
||||
SO_NAME_MAX_PATH_SIZE - 1, &errcode);
|
||||
make_cleanup (xfree, buffer);
|
||||
if (errcode != 0)
|
||||
{
|
||||
warning ("svr4_fetch_objfile_link_map: Can't read pathname for load map: %s\n",
|
||||
safe_strerror (errcode));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Is this the linkmap for the file we want? */
|
||||
/* If the file is not a shared library and has no name,
|
||||
we are sure it is the main executable, so we return that. */
|
||||
if ((buffer && strcmp (buffer, objfile->name) == 0)
|
||||
|| (!(objfile->flags & OBJF_SHARED) && (strcmp (buffer, "") == 0)))
|
||||
{
|
||||
do_cleanups (old_chain);
|
||||
return lm;
|
||||
}
|
||||
}
|
||||
/* Not the file we wanted, continue checking. */
|
||||
lm = extract_address (objfile_lm_info.lm + lmo->l_next_offset,
|
||||
lmo->l_next_size);
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* On some systems, the only way to recognize the link map entry for
|
||||
the main executable file is by looking at its name. Return
|
||||
|
|
Loading…
Reference in a new issue