/* Definitions for targets which report shared library events.
- Copyright (C) 2007-2019 Free Software Foundation, Inc.
+ Copyright (C) 2007-2020 Free Software Foundation, Inc.
This file is part of GDB.
#include "symtab.h"
#include "symfile.h"
#include "target.h"
-#include "gdbsupport/vec.h"
#include "solib-target.h"
#include <vector>
/* The cached offsets for each section of this shared library,
determined from SEGMENT_BASES, or SECTION_BASES. */
- section_offsets *offsets = NULL;
+ section_offsets offsets;
};
typedef std::vector<std::unique_ptr<lm_info_target>> lm_info_vector;
/* Build the offset table only once per object file. We can not do
it any earlier, since we need to open the file first. */
- if (li->offsets == NULL)
+ if (li->offsets.empty ())
{
int num_sections = gdb_bfd_count_sections (so->abfd);
- li->offsets
- = ((struct section_offsets *)
- xzalloc (SIZEOF_N_SECTION_OFFSETS (num_sections)));
+ li->offsets.assign (num_sections, 0);
if (!li->section_bases.empty ())
{
gdb_assert (so->addr_low <= so->addr_high);
found_range = 1;
}
- li->offsets->offsets[i] = li->section_bases[bases_index];
+ li->offsets[i] = li->section_bases[bases_index];
bases_index++;
}
if (!found_range)
}
else if (!li->segment_bases.empty ())
{
- struct symfile_segment_data *data;
+ symfile_segment_data_up data
+ = get_symfile_segment_data (so->abfd);
- data = get_symfile_segment_data (so->abfd);
if (data == NULL)
warning (_("\
Could not relocate shared library \"%s\": no segments"), so->so_name);
ULONGEST orig_delta;
int i;
- if (!symfile_map_offsets_to_segments (so->abfd, data, li->offsets,
+ if (!symfile_map_offsets_to_segments (so->abfd, data.get (),
+ li->offsets,
li->segment_bases.size (),
li->segment_bases.data ()))
warning (_("\
"info sharedlibrary". Report any consecutive segments
which were relocated as a single unit. */
gdb_assert (li->segment_bases.size () > 0);
- orig_delta = li->segment_bases[0] - data->segment_bases[0];
+ orig_delta = li->segment_bases[0] - data->segments[0].base;
- for (i = 1; i < data->num_segments; i++)
+ for (i = 1; i < data->segments.size (); i++)
{
/* If we have run out of offsets, assume all
remaining segments have the same offset. */
/* If this segment does not have the same offset, do
not include it in the library's range. */
- if (li->segment_bases[i] - data->segment_bases[i]
+ if (li->segment_bases[i] - data->segments[i].base
!= orig_delta)
break;
}
so->addr_low = li->segment_bases[0];
- so->addr_high = (data->segment_bases[i - 1]
- + data->segment_sizes[i - 1]
+ so->addr_high = (data->segments[i - 1].base
+ + data->segments[i - 1].size
+ orig_delta);
gdb_assert (so->addr_low <= so->addr_high);
-
- free_symfile_segment_data (data);
}
}
}
- offset = li->offsets->offsets[gdb_bfd_section_index
- (sec->the_bfd_section->owner,
- sec->the_bfd_section)];
+ offset = li->offsets[gdb_bfd_section_index (sec->the_bfd_section->owner,
+ sec->the_bfd_section)];
sec->addr += offset;
sec->endaddr += offset;
}
struct target_so_ops solib_target_so_ops;
+void _initialize_solib_target ();
void
-_initialize_solib_target (void)
+_initialize_solib_target ()
{
solib_target_so_ops.relocate_section_addresses
= solib_target_relocate_section_addresses;