-/* Copyright (C) 2013 Free Software Foundation, Inc.
+/* Copyright (C) 2013-2017 Free Software Foundation, Inc.
This file is part of GDB.
static struct lm_info *
solib_aix_new_lm_info (struct lm_info *info)
{
- struct lm_info *result = xmalloc (sizeof (struct lm_info));
+ struct lm_info *result = XNEW (struct lm_info);
memcpy (result, info, sizeof (struct lm_info));
result->filename = xstrdup (info->filename);
{
struct solib_aix_inferior_data *data;
- data = inferior_data (inf, solib_aix_inferior_data_handle);
+ data = ((struct solib_aix_inferior_data *)
+ inferior_data (inf, solib_aix_inferior_data_handle));
if (data == NULL)
{
- data = XZALLOC (struct solib_aix_inferior_data);
+ data = XCNEW (struct solib_aix_inferior_data);
set_inferior_data (inf, solib_aix_inferior_data_handle, data);
}
void *user_data,
VEC (gdb_xml_value_s) *attributes)
{
- VEC (lm_info_p) **list = user_data;
- struct lm_info *item = XZALLOC (struct lm_info);
+ VEC (lm_info_p) **list = (VEC (lm_info_p) **) user_data;
+ struct lm_info *item = XCNEW (struct lm_info);
struct gdb_xml_value *attr;
attr = xml_find_attribute (attributes, "name");
- item->filename = xstrdup (attr->value);
+ item->filename = xstrdup ((const char *) attr->value);
attr = xml_find_attribute (attributes, "member");
if (attr != NULL)
- item->member_name = xstrdup (attr->value);
+ item->member_name = xstrdup ((const char *) attr->value);
attr = xml_find_attribute (attributes, "text_addr");
item->text_addr = * (ULONGEST *) attr->value;
const struct gdb_xml_element *element,
void *user_data, VEC (gdb_xml_value_s) *attributes)
{
- char *version = xml_find_attribute (attributes, "version")->value;
+ char *version = (char *) xml_find_attribute (attributes, "version")->value;
if (strcmp (version, "1.0") != 0)
gdb_xml_error (parser,
static void
solib_aix_free_library_list (void *p)
{
- VEC (lm_info_p) **result = p;
+ VEC (lm_info_p) **result = (VEC (lm_info_p) **) p;
struct lm_info *info;
int ix;
solib_aix_relocate_section_addresses (struct so_list *so,
struct target_section *sec)
{
- bfd *abfd = sec->bfd;
struct bfd_section *bfd_sect = sec->the_bfd_section;
+ bfd *abfd = bfd_sect->owner;
const char *section_name = bfd_section_name (abfd, bfd_sect);
struct lm_info *info = so->lm_info;
{
struct section_offsets *offsets;
bfd *abfd = objfile->obfd;
- int i;
- offsets = XCALLOC (objfile->num_sections, struct section_offsets);
+ offsets = XCNEWVEC (struct section_offsets, objfile->num_sections);
/* .text */
}
}
-/* Implement the "special_symbol_handling" target_so_ops method. */
-
-static void
-solib_aix_special_symbol_handling (void)
-{
- /* Nothing needed. */
-}
-
/* Implement the "current_sos" target_so_ops method. */
static struct so_list *
to the main executable, not a shared library. */
for (ix = 1; VEC_iterate (lm_info_p, library_list, ix, info); ix++)
{
- struct so_list *new_solib = XZALLOC (struct so_list);
+ struct so_list *new_solib = XCNEW (struct so_list);
char *so_name;
if (info->member_name == NULL)
/* Implement the "bfd_open" target_so_ops method. */
-static bfd *
+static gdb_bfd_ref_ptr
solib_aix_bfd_open (char *pathname)
{
/* The pathname is actually a synthetic filename with the following
to the solib's lm_info here? */
const int path_len = strlen (pathname);
char *sep;
- char *filename;
int filename_len;
- char *member_name;
- bfd *archive_bfd, *object_bfd;
- struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
+ int found_file;
+ char *found_pathname;
if (pathname[path_len - 1] != ')')
return solib_bfd_open (pathname);
}
filename_len = sep - pathname;
- filename = xstrprintf ("%.*s", filename_len, pathname);
- make_cleanup (xfree, filename);
- member_name = xstrprintf ("%.*s", path_len - filename_len - 2, sep + 1);
- make_cleanup (xfree, member_name);
-
- archive_bfd = gdb_bfd_open (filename, gnutarget, -1);
+ std::string filename (string_printf ("%.*s", filename_len, pathname));
+ std::string member_name (string_printf ("%.*s", path_len - filename_len - 2,
+ sep + 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.c_str (), &found_file);
+ if (found_pathname == NULL)
+ perror_with_name (pathname);
+ gdb_bfd_ref_ptr archive_bfd (solib_bfd_fopen (found_pathname, found_file));
if (archive_bfd == NULL)
{
warning (_("Could not open `%s' as an executable file: %s"),
- filename, bfd_errmsg (bfd_get_error ()));
- do_cleanups (cleanup);
+ filename.c_str (), bfd_errmsg (bfd_get_error ()));
return NULL;
}
- if (bfd_check_format (archive_bfd, bfd_object))
- {
- do_cleanups (cleanup);
- return archive_bfd;
- }
+ if (bfd_check_format (archive_bfd.get (), bfd_object))
+ return archive_bfd;
- if (! bfd_check_format (archive_bfd, bfd_archive))
+ if (! bfd_check_format (archive_bfd.get (), bfd_archive))
{
warning (_("\"%s\": not in executable format: %s."),
- filename, bfd_errmsg (bfd_get_error ()));
- gdb_bfd_unref (archive_bfd);
- do_cleanups (cleanup);
+ filename.c_str (), bfd_errmsg (bfd_get_error ()));
return NULL;
}
- object_bfd = gdb_bfd_openr_next_archived_file (archive_bfd, NULL);
+ gdb_bfd_ref_ptr object_bfd
+ (gdb_bfd_openr_next_archived_file (archive_bfd.get (), NULL));
while (object_bfd != NULL)
{
- bfd *next;
-
- if (strcmp (member_name, object_bfd->filename) == 0)
+ if (member_name == object_bfd->filename)
break;
- next = gdb_bfd_openr_next_archived_file (archive_bfd, object_bfd);
- gdb_bfd_unref (object_bfd);
- object_bfd = next;
+ object_bfd = gdb_bfd_openr_next_archived_file (archive_bfd.get (),
+ object_bfd.get ());
}
if (object_bfd == NULL)
{
- warning (_("\"%s\": member \"%s\" missing."), filename, member_name);
- gdb_bfd_unref (archive_bfd);
- do_cleanups (cleanup);
+ warning (_("\"%s\": member \"%s\" missing."), filename.c_str (),
+ member_name.c_str ());
return NULL;
}
- if (! bfd_check_format (object_bfd, bfd_object))
+ if (! bfd_check_format (object_bfd.get (), bfd_object))
{
warning (_("%s(%s): not in object format: %s."),
- filename, member_name, bfd_errmsg (bfd_get_error ()));
- gdb_bfd_unref (archive_bfd);
- gdb_bfd_unref (object_bfd);
- do_cleanups (cleanup);
+ filename.c_str (), member_name.c_str (),
+ bfd_errmsg (bfd_get_error ()));
return NULL;
}
- gdb_bfd_unref (archive_bfd);
- do_cleanups (cleanup);
+ /* 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.get ()));
+ object_bfd->filename = xstrprintf ("%s%s",
+ bfd_get_filename (archive_bfd.get ()),
+ sep);
+
return object_bfd;
}
if (data_osect == NULL)
error (_("unable to find TOC entry for pc %s "
"(%s has no data section)"),
- core_addr_to_string (pc), pc_osect->objfile->name);
+ core_addr_to_string (pc), objfile_name (pc_osect->objfile));
result = (obj_section_addr (data_osect)
+ xcoff_get_toc_offset (pc_osect->objfile));
solib_aix_so_ops.clear_solib = solib_aix_clear_solib;
solib_aix_so_ops.solib_create_inferior_hook
= solib_aix_solib_create_inferior_hook;
- solib_aix_so_ops.special_symbol_handling
- = solib_aix_special_symbol_handling;
solib_aix_so_ops.current_sos = solib_aix_current_sos;
solib_aix_so_ops.open_symbol_file_object
= solib_aix_open_symbol_file_object;