From bc4a16aeddc8ecba69c92b6fec62d97bddecf3fb Mon Sep 17 00:00:00 2001 From: Elena Zannoni Date: Mon, 21 Oct 2002 18:42:40 +0000 Subject: [PATCH] 2002-10-21 Elena Zannoni * solib-svr4.c (svr4_fetch_objfile_link_map): New function. * solib-svr4.h (svr4_fetch_objfile_link_map): Export. --- gdb/ChangeLog | 5 ++++ gdb/solib-svr4.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index eaf09e6860..738246d66f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2002-10-21 Elena Zannoni + + * solib-svr4.c (svr4_fetch_objfile_link_map): New function. + * solib-svr4.h (svr4_fetch_objfile_link_map): Export. + 2002-10-21 Elena Zannoni * symtab.h (address_class): Rename diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 3f98a1eb43..78161e0d24 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -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