From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 97406 invoked by alias); 5 Mar 2015 11:37:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 97253 invoked by uid 89); 5 Mar 2015 11:37:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 05 Mar 2015 11:37:47 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t25BbkAD010194 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 5 Mar 2015 06:37:46 -0500 Received: from blade.nx (ovpn-116-103.ams2.redhat.com [10.36.116.103]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t25Bbj85024769 for ; Thu, 5 Mar 2015 06:37:45 -0500 Received: from blade.nx (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id 97BD0265059 for ; Thu, 5 Mar 2015 11:37:44 +0000 (GMT) From: Gary Benson To: gdb-patches@sourceware.org Subject: [PATCH 1/2] Introduce new function exec_file_find Date: Thu, 05 Mar 2015 11:37:00 -0000 Message-Id: <1425555461-22093-2-git-send-email-gbenson@redhat.com> In-Reply-To: <1425555461-22093-1-git-send-email-gbenson@redhat.com> References: <1425555461-22093-1-git-send-email-gbenson@redhat.com> X-IsSubscribed: yes X-SW-Source: 2015-03/txt/msg00148.txt.bz2 This commit adds a new function, exec_file_find, which computes the full pathname of the main executable in much the same way solib_find does for pathnames of shared libraries. The bulk of the existing solib_find was moved into a new static function solib_find_1, with exec_file_find and solib_find being small wrappers for solib_find_1. gdb/ChangeLog: * solist.h (exec_file_find): New declaration. * solib.c (solib_find_1): New function. (solib_find): Moved most logic into the above. (exec_file_find): New function. --- gdb/ChangeLog | 7 +++ gdb/solib.c | 147 ++++++++++++++++++++++++++++++++++++++------------------ gdb/solist.h | 3 + 3 files changed, 110 insertions(+), 47 deletions(-) diff --git a/gdb/solib.c b/gdb/solib.c index 98d5cfd..fc8be01 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -112,69 +112,47 @@ show_solib_search_path (struct ui_file *file, int from_tty, # define DOS_BASED_FILE_SYSTEM 0 #endif -/* Returns the full pathname of the shared library file, or NULL if - not found. (The pathname is malloc'ed; it needs to be freed by the - caller.) *FD is set to either -1 or an open file handle for the - library. +/* Return the full pathname of a binary file (the main executable + or a shared library file), or NULL if not found. The returned + pathname is malloc'ed and must be freed by the caller. *FD is + set to either -1 or an open file handle for the binary file. Global variable GDB_SYSROOT is used as a prefix directory - to search for shared libraries if they have an absolute path. + to search for binary files 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 GDB_SYSROOT. + shared libraries if not found in GDB_SYSROOT. SOLIB_SEARCH_PATH + is not used when searching for the main executable. Search algorithm: * If there is a gdb_sysroot and path is absolute: * Search for gdb_sysroot/path. * else * Look for it literally (unmodified). - * Look in SOLIB_SEARCH_PATH. - * If available, use target defined search function. + * If IS_SOLIB is non-zero: + * Look in SOLIB_SEARCH_PATH. + * If available, use target defined search function. * If gdb_sysroot is NOT set, perform the following two searches: - * Look in inferior's $PATH. + * If IS_SOLIB is non-zero: + * Look in inferior's $PATH. * Look in inferior's $LD_LIBRARY_PATH. * * The last check avoids doing this search when targetting remote * machines since gdb_sysroot will almost always be set. */ -char * -solib_find (char *in_pathname, int *fd) +static char * +solib_find_1 (char *in_pathname, int *fd, int is_solib) { const struct target_so_ops *ops = solib_ops (target_gdbarch ()); int found_file = -1; char *temp_pathname = NULL; int gdb_sysroot_is_empty; - const char *solib_symbols_extension - = gdbarch_solib_symbols_extension (target_gdbarch ()); const char *fskind = effective_target_file_system_kind (); struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); char *sysroot = NULL; - /* If solib_symbols_extension is set, replace the file's - extension. */ - if (solib_symbols_extension) - { - char *p = in_pathname + strlen (in_pathname); - - while (p > in_pathname && *p != '.') - p--; - - if (*p == '.') - { - char *new_pathname; - - new_pathname = alloca (p - in_pathname + 1 - + strlen (solib_symbols_extension) + 1); - memcpy (new_pathname, in_pathname, p - in_pathname + 1); - strcpy (new_pathname + (p - in_pathname) + 1, - solib_symbols_extension); - - in_pathname = new_pathname; - } - } - gdb_sysroot_is_empty = (gdb_sysroot == NULL || *gdb_sysroot == 0); if (!gdb_sysroot_is_empty) @@ -332,23 +310,26 @@ solib_find (char *in_pathname, int *fd) in_pathname++; } - /* If not found, search the solib_search_path (if any). */ - if (found_file < 0 && solib_search_path != NULL) + /* If not found, and we're looking for a solib, search the + solib_search_path (if any). */ + if (is_solib && found_file < 0 && solib_search_path != NULL) found_file = openp (solib_search_path, OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname, O_RDONLY | O_BINARY, &temp_pathname); - /* If not found, next search the solib_search_path (if any) for the basename - only (ignoring the path). This is to allow reading solibs from a path - that differs from the opened path. */ - if (found_file < 0 && solib_search_path != NULL) + /* If not found, and we're looking for a solib, next search the + solib_search_path (if any) for the basename only (ignoring the + path). This is to allow reading solibs from a path that differs + from the opened path. */ + if (is_solib && found_file < 0 && solib_search_path != NULL) found_file = openp (solib_search_path, OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, target_lbasename (fskind, in_pathname), O_RDONLY | O_BINARY, &temp_pathname); - /* If not found, try to use target supplied solib search method. */ - if (found_file < 0 && ops->find_and_open_solib) + /* If not found, and we're looking for a solib, try to use target + supplied solib search method. */ + if (is_solib && found_file < 0 && ops->find_and_open_solib) found_file = ops->find_and_open_solib (in_pathname, O_RDONLY | O_BINARY, &temp_pathname); @@ -359,9 +340,9 @@ solib_find (char *in_pathname, int *fd) OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname, O_RDONLY | O_BINARY, &temp_pathname); - /* If not found, next search the inferior's $LD_LIBRARY_PATH - environment variable. */ - if (found_file < 0 && gdb_sysroot_is_empty) + /* If not found, and we're looking for a solib, next search the + inferior's $LD_LIBRARY_PATH environment variable. */ + if (is_solib && found_file < 0 && gdb_sysroot_is_empty) found_file = openp (get_in_environ (current_inferior ()->environment, "LD_LIBRARY_PATH"), OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, in_pathname, @@ -371,6 +352,78 @@ solib_find (char *in_pathname, int *fd) return temp_pathname; } +/* Return the full pathname of the main executable, or NULL if not + found. The returned pathname is malloc'ed and must be freed by + the caller. *FD is set to either -1 or an open file handle for + the main executable. + + The search algorithm used is described in solib_find_1's comment + above. */ + +char * +exec_file_find (char *in_pathname, int *fd) +{ + char *result = solib_find_1 (in_pathname, fd, 0); + + if (result == NULL) + { + const char *fskind = effective_target_file_system_kind (); + + if (fskind == file_system_kind_dos_based) + { + char *new_pathname; + + new_pathname = alloca (strlen (in_pathname) + 5); + strcpy (new_pathname, in_pathname); + strcat (new_pathname, ".exe"); + + result = solib_find_1 (new_pathname, fd, 0); + } + } + + return result; +} + +/* Return the full pathname of a shared library file, or NULL if not + found. The returned pathname is malloc'ed and must be freed by + the caller. *FD is set to either -1 or an open file handle for + the shared library. + + The search algorithm used is described in solib_find_1's comment + above. */ + +char * +solib_find (char *in_pathname, int *fd) +{ + const char *solib_symbols_extension + = gdbarch_solib_symbols_extension (target_gdbarch ()); + + /* If solib_symbols_extension is set, replace the file's + extension. */ + if (solib_symbols_extension != NULL) + { + char *p = in_pathname + strlen (in_pathname); + + while (p > in_pathname && *p != '.') + p--; + + if (*p == '.') + { + char *new_pathname; + + new_pathname = alloca (p - in_pathname + 1 + + strlen (solib_symbols_extension) + 1); + memcpy (new_pathname, in_pathname, p - in_pathname + 1); + strcpy (new_pathname + (p - in_pathname) + 1, + solib_symbols_extension); + + in_pathname = new_pathname; + } + } + + return solib_find_1 (in_pathname, fd, 1); +} + /* Open and return a BFD for the shared library PATHNAME. If FD is not -1, it is used as file handle to open the file. Throws an error if the file could not be opened. Handles both local and remote file access. diff --git a/gdb/solist.h b/gdb/solist.h index 148bec1..7021f5c 100644 --- a/gdb/solist.h +++ b/gdb/solist.h @@ -176,6 +176,9 @@ void free_so (struct so_list *so); /* Return address of first so_list entry in master shared object list. */ struct so_list *master_so_list (void); +/* Find main executable binary file. */ +extern char *exec_file_find (char *in_pathname, int *fd); + /* Find shared library binary file. */ extern char *solib_find (char *in_pathname, int *fd); -- 1.7.1