From e4f7b8c818485e2f02fa7f7e0255973b062eeeda Mon Sep 17 00:00:00 2001 From: Michael Snyder Date: Tue, 21 Nov 2000 01:09:54 +0000 Subject: [PATCH] 2000-11-20 Michael Snyder * solist.h: Declare new function solib_open. * solib.c (solib_open): New function. Abstracts some of the code from solib_map_sections, for finding the binary solib file. (solib_map_sections): Call solib_open. * solib-svr4.c (enable_break): Call solib_open. --- gdb/ChangeLog | 8 ++++ gdb/solib-svr4.c | 21 ++++---- gdb/solib.c | 122 ++++++++++++++++++++++++++++++++--------------- gdb/solist.h | 3 ++ 4 files changed, 103 insertions(+), 51 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3b8fceb6f60..491bc53a55c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2000-11-20 Michael Snyder + + * solist.h: Declare new function solib_open. + * solib.c (solib_open): New function. Abstracts some of the + code from solib_map_sections, for finding the binary solib file. + (solib_map_sections): Call solib_open. + * solib-svr4.c (enable_break): Call solib_open. + 2000-11-20 J.T. Conklin * gdbserver/low-nbsd.c (fetch_inferior_registers, diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index bbe90a6c959..f7c7a78c66f 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -287,7 +287,6 @@ IGNORE_FIRST_LINK_MAP_ENTRY (struct so_list *so) #endif /* !SVR4_SHARED_LIBS */ - static CORE_ADDR debug_base; /* Base of dynamic linker structures */ static CORE_ADDR breakpoint_addr; /* Address where end bkpt is set */ @@ -295,16 +294,6 @@ static CORE_ADDR breakpoint_addr; /* Address where end bkpt is set */ static int match_main (char *); -/* If non-zero, this is a prefix that will be added to the front of the name - shared libraries with an absolute filename for loading. */ -static char *solib_absolute_prefix = NULL; - -/* If non-empty, this is a search path for loading non-absolute shared library - symbol files. This takes precedence over the environment variables PATH - and LD_LIBRARY_PATH. */ -static char *solib_search_path = NULL; - - #ifndef SVR4_SHARED_LIBS /* Allocate the runtime common object file. */ @@ -1269,7 +1258,9 @@ enable_break (void) unsigned int interp_sect_size; char *buf; CORE_ADDR load_addr; - bfd *tmp_bfd; + bfd *tmp_bfd = NULL; + int tmp_fd = -1; + char *tmp_pathname = NULL; CORE_ADDR sym_addr = 0; /* Read the contents of the .interp section into a local buffer; @@ -1287,7 +1278,11 @@ enable_break (void) to find any magic formula to find it for Solaris (appears to be trivial on GNU/Linux). Therefore, we have to try an alternate mechanism to find the dynamic linker's base address. */ - tmp_bfd = bfd_openr (buf, gnutarget); + + tmp_fd = solib_open (buf, &tmp_pathname); + if (tmp_fd >= 0) + tmp_bfd = bfd_fdopenr (tmp_pathname, gnutarget, tmp_fd); + if (tmp_bfd == NULL) goto bkpt_at_symbol; diff --git a/gdb/solib.c b/gdb/solib.c index 7da15b93702..5c982e2a90d 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -64,6 +64,85 @@ static char *solib_absolute_prefix = NULL; and LD_LIBRARY_PATH. */ static char *solib_search_path = NULL; +/* + + GLOBAL FUNCTION + + solib_open -- Find a shared library file and open it. + + SYNOPSIS + + int solib_open (char *in_patname, char **found_pathname); + + DESCRIPTION + + Global variable SOLIB_ABSOLUTE_PREFIX is used as a prefix directory + to search for shared libraries if they have an absolute path. + + Global variable SOLIB_SEARCH_PATH is used as a prefix directory + (or set of directories, as in LD_LIBRARY_PATH) to search for all + shared libraries if not found in SOLIB_ABSOLUTE_PREFIX. + + Search order: + * If path is absolute, look in SOLIB_ABSOLUTE_PREFIX. + * If path is absolute, look for it literally (unmodified). + * Look in SOLIB_SEARCH_PATH. + * Look in inferior's $PATH. + * Look in inferior's $LD_LIBRARY_PATH. + + RETURNS + + file handle for opened solib, or -1 for failure. */ + +int +solib_open (char *in_pathname, char **found_pathname) +{ + int found_file = -1; + char *temp_pathname = NULL; + + if (solib_absolute_prefix != NULL && + ROOTED_P (in_pathname)) + { + int prefix_len = strlen (solib_absolute_prefix); + + /* Remove trailing slashes from absolute prefix. */ + while (prefix_len > 0 && SLASH_P (solib_absolute_prefix[prefix_len - 1])) + prefix_len--; + + /* Cat the prefixed pathname together. */ + temp_pathname = alloca (prefix_len + strlen (in_pathname) + 1); + strncpy (temp_pathname, solib_absolute_prefix, prefix_len); + temp_pathname[prefix_len] = '\0'; + strcat (temp_pathname, in_pathname); + + /* Now see if we can open it. */ + found_file = open (temp_pathname, O_RDONLY, 0); + } + + /* If not found, next search the solib_search_path (if any). */ + if (found_file < 0 && solib_search_path != NULL) + found_file = openp (solib_search_path, + 1, in_pathname, O_RDONLY, 0, &temp_pathname); + + /* If not found, next search the inferior's $PATH environment variable. */ + if (found_file < 0 && solib_search_path != NULL) + found_file = openp (get_in_environ (inferior_environ, "PATH"), + 1, in_pathname, O_RDONLY, 0, &temp_pathname); + + /* If not found, next search the inferior's $LD_LIBRARY_PATH + environment variable. */ + if (found_file < 0 && solib_search_path != NULL) + found_file = openp (get_in_environ (inferior_environ, "LD_LIBRARY_PATH"), + 1, in_pathname, O_RDONLY, 0, &temp_pathname); + + /* Done. If not found, tough luck. Return found_file and + (optionally) found_pathname. */ + if (found_pathname != NULL) + *found_pathname = strsave (temp_pathname); + return found_file; +} + + /* LOCAL FUNCTION @@ -104,49 +183,15 @@ solib_map_sections (PTR arg) filename = tilde_expand (so->so_name); - if (solib_absolute_prefix && ROOTED_P (filename)) - /* Prefix shared libraries with absolute filenames with - SOLIB_ABSOLUTE_PREFIX. */ - { - char *pfxed_fn; - int pfx_len; - - pfx_len = strlen (solib_absolute_prefix); - - /* Remove trailing slashes. */ - while (pfx_len > 0 && SLASH_P (solib_absolute_prefix[pfx_len - 1])) - pfx_len--; - - pfxed_fn = xmalloc (pfx_len + strlen (filename) + 1); - strcpy (pfxed_fn, solib_absolute_prefix); - strcat (pfxed_fn, filename); - free (filename); - - filename = pfxed_fn; - } - old_chain = make_cleanup (free, filename); + scratch_chan = solib_open (filename, &scratch_pathname); - scratch_chan = -1; - - if (solib_search_path) - scratch_chan = openp (solib_search_path, - 1, filename, O_RDONLY, 0, &scratch_pathname); - if (scratch_chan < 0) - scratch_chan = openp (get_in_environ (inferior_environ, "PATH"), - 1, filename, O_RDONLY, 0, &scratch_pathname); - if (scratch_chan < 0) - { - scratch_chan = openp (get_in_environ - (inferior_environ, "LD_LIBRARY_PATH"), - 1, filename, O_RDONLY, 0, &scratch_pathname); - } if (scratch_chan < 0) { perror_with_name (filename); } - /* Leave scratch_pathname allocated. abfd->name will point to it. */ + /* Leave scratch_pathname allocated. abfd->name will point to it. */ abfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan); if (!abfd) { @@ -154,12 +199,13 @@ solib_map_sections (PTR arg) error ("Could not open `%s' as an executable file: %s", scratch_pathname, bfd_errmsg (bfd_get_error ())); } + /* Leave bfd open, core_xfer_memory and "info files" need it. */ so->abfd = abfd; abfd->cacheable = true; - /* copy full path name into so_name, so that later symbol_file_add can find - it */ + /* copy full path name into so_name, so that later symbol_file_add + can find it */ if (strlen (scratch_pathname) >= SO_NAME_MAX_PATH_SIZE) error ("Full path name length of shared library exceeds SO_NAME_MAX_PATH_SIZE in so_list structure."); strcpy (so->so_name, scratch_pathname); diff --git a/gdb/solist.h b/gdb/solist.h index e55190dc8ac..29252505ada 100644 --- a/gdb/solist.h +++ b/gdb/solist.h @@ -93,6 +93,9 @@ struct target_so_ops void free_so (struct so_list *so); +/* Find solib binary file and open it. */ +extern int solib_open (char *in_pathname, char **found_pathname); + /* FIXME: gdbarch needs to control this variable */ extern struct target_so_ops *current_target_so_ops; -- 2.30.2