- so->addr_low = segment_bases[0];
- so->addr_high = (data->segment_bases[i - 1]
- + data->segment_sizes[i - 1]
- + orig_delta);
- gdb_assert (so->addr_low <= so->addr_high);
-
- free_symfile_segment_data (data);
+ data = get_symfile_segment_data (so->abfd);
+ if (data == NULL)
+ warning (_("\
+Could not relocate shared library \"%s\": no segments"), so->so_name);
+ else
+ {
+ ULONGEST orig_delta;
+ int i;
+ int num_bases;
+ CORE_ADDR *segment_bases;
+
+ num_bases = VEC_length (CORE_ADDR, so->lm_info->segment_bases);
+ segment_bases = VEC_address (CORE_ADDR,
+ so->lm_info->segment_bases);
+
+ if (!symfile_map_offsets_to_segments (so->abfd, data,
+ so->lm_info->offsets,
+ num_bases, segment_bases))
+ warning (_("\
+Could not relocate shared library \"%s\": bad offsets"), so->so_name);
+
+ /* Find the range of addresses to report for this library in
+ "info sharedlibrary". Report any consecutive segments
+ which were relocated as a single unit. */
+ gdb_assert (num_bases > 0);
+ orig_delta = segment_bases[0] - data->segment_bases[0];
+
+ for (i = 1; i < data->num_segments; i++)
+ {
+ /* If we have run out of offsets, assume all
+ remaining segments have the same offset. */
+ if (i >= num_bases)
+ continue;
+
+ /* If this segment does not have the same offset, do
+ not include it in the library's range. */
+ if (segment_bases[i] - data->segment_bases[i] != orig_delta)
+ break;
+ }
+
+ so->addr_low = segment_bases[0];
+ so->addr_high = (data->segment_bases[i - 1]
+ + data->segment_sizes[i - 1]
+ + orig_delta);
+ gdb_assert (so->addr_low <= so->addr_high);
+
+ free_symfile_segment_data (data);
+ }