Fix set sysroot command on AIX

set sysroot command on AIX has no effect if a program depends on shared
library archives (.a).  Fixed by using solib_find and solib_bfd_fopen
instead of gdb_bfd_open in solib_aix_bfd_open.

gdb/
2016-10-14  Sangamesh Mallayya  <sangamesh.swamy@in.ibm.com>
	    Ulrich Weigand  <uweigand@de.ibm.com>

	* solib-aix.c (solib_aix_bfd_open): Call solib_find so that sysroot
	path is set properly if program has a dependency on .a archive and
	sysroot is set via set sysroot command.

Signed-off-by: Ulrich Weigand <ulrich.weigand@de.ibm.com>
This commit is contained in:
Ulrich Weigand 2016-10-14 15:04:04 +02:00
parent ab2c2251da
commit 754c39c2f3
2 changed files with 22 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2016-10-14 Sangamesh Mallayya <sangamesh.swamy@in.ibm.com>
Ulrich Weigand <uweigand@de.ibm.com>
* solib-aix.c (solib_aix_bfd_open): Call solib_find so that sysroot
path is set properly if program has a dependency on .a archive and
sysroot is set via set sysroot command.
2016-10-14 Markus Metzger <markus.t.metzger@intel.com>
* nat/linux-btrace.c: Remove leftover comment.

View File

@ -648,6 +648,8 @@ solib_aix_bfd_open (char *pathname)
char *member_name;
bfd *archive_bfd, *object_bfd;
struct cleanup *cleanup;
int found_file;
char *found_pathname;
if (pathname[path_len - 1] != ')')
return solib_bfd_open (pathname);
@ -669,7 +671,13 @@ solib_aix_bfd_open (char *pathname)
member_name = xstrprintf ("%.*s", path_len - filename_len - 2, sep + 1);
make_cleanup (xfree, member_name);
archive_bfd = gdb_bfd_open (filename, gnutarget, -1);
/* Calling solib_find makes certain that sysroot path is set properly
if program has a dependency on .a archive and sysroot is set via
set sysroot command. */
found_pathname = solib_find (filename, &found_file);
if (found_pathname == NULL)
perror_with_name (pathname);
archive_bfd = solib_bfd_fopen (found_pathname, found_file);
if (archive_bfd == NULL)
{
warning (_("Could not open `%s' as an executable file: %s"),
@ -724,12 +732,13 @@ solib_aix_bfd_open (char *pathname)
return NULL;
}
/* Override the returned bfd's name with our synthetic name in order
to allow commands listing all shared libraries to display that
synthetic name. Otherwise, we would only be displaying the name
of the archive member object. */
/* Override the returned bfd's name with the name returned from solib_find
along with appended parenthesized member name in order to allow commands
listing all shared libraries to display. Otherwise, we would only be
displaying the name of the archive member object. */
xfree (bfd_get_filename (object_bfd));
object_bfd->filename = xstrdup (pathname);
object_bfd->filename = xstrprintf ("%s%s",
bfd_get_filename (archive_bfd), sep);
gdb_bfd_unref (archive_bfd);
do_cleanups (cleanup);