diff options
Diffstat (limited to 'gdb/solib-svr4.c')
-rw-r--r-- | gdb/solib-svr4.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 3f98a1e..78161e0 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 |