solib-target.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. /* Definitions for targets which report shared library events.
  2. Copyright (C) 2007-2022 Free Software Foundation, Inc.
  3. This file is part of GDB.
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program. If not, see <http://www.gnu.org/licenses/>. */
  14. #include "defs.h"
  15. #include "objfiles.h"
  16. #include "solist.h"
  17. #include "symtab.h"
  18. #include "symfile.h"
  19. #include "target.h"
  20. #include "solib-target.h"
  21. #include <vector>
  22. #include "inferior.h"
  23. /* Private data for each loaded library. */
  24. struct lm_info_target : public lm_info_base
  25. {
  26. /* The library's name. The name is normally kept in the struct
  27. so_list; it is only here during XML parsing. */
  28. std::string name;
  29. /* The target can either specify segment bases or section bases, not
  30. both. */
  31. /* The base addresses for each independently relocatable segment of
  32. this shared library. */
  33. std::vector<CORE_ADDR> segment_bases;
  34. /* The base addresses for each independently allocatable,
  35. relocatable section of this shared library. */
  36. std::vector<CORE_ADDR> section_bases;
  37. /* The cached offsets for each section of this shared library,
  38. determined from SEGMENT_BASES, or SECTION_BASES. */
  39. section_offsets offsets;
  40. };
  41. typedef std::vector<std::unique_ptr<lm_info_target>> lm_info_vector;
  42. #if !defined(HAVE_LIBEXPAT)
  43. static lm_info_vector
  44. solib_target_parse_libraries (const char *library)
  45. {
  46. static int have_warned;
  47. if (!have_warned)
  48. {
  49. have_warned = 1;
  50. warning (_("Can not parse XML library list; XML support was disabled "
  51. "at compile time"));
  52. }
  53. return lm_info_vector ();
  54. }
  55. #else /* HAVE_LIBEXPAT */
  56. #include "xml-support.h"
  57. /* Handle the start of a <segment> element. */
  58. static void
  59. library_list_start_segment (struct gdb_xml_parser *parser,
  60. const struct gdb_xml_element *element,
  61. void *user_data,
  62. std::vector<gdb_xml_value> &attributes)
  63. {
  64. lm_info_vector *list = (lm_info_vector *) user_data;
  65. lm_info_target *last = list->back ().get ();
  66. ULONGEST *address_p
  67. = (ULONGEST *) xml_find_attribute (attributes, "address")->value.get ();
  68. CORE_ADDR address = (CORE_ADDR) *address_p;
  69. if (!last->section_bases.empty ())
  70. gdb_xml_error (parser,
  71. _("Library list with both segments and sections"));
  72. last->segment_bases.push_back (address);
  73. }
  74. static void
  75. library_list_start_section (struct gdb_xml_parser *parser,
  76. const struct gdb_xml_element *element,
  77. void *user_data,
  78. std::vector<gdb_xml_value> &attributes)
  79. {
  80. lm_info_vector *list = (lm_info_vector *) user_data;
  81. lm_info_target *last = list->back ().get ();
  82. ULONGEST *address_p
  83. = (ULONGEST *) xml_find_attribute (attributes, "address")->value.get ();
  84. CORE_ADDR address = (CORE_ADDR) *address_p;
  85. if (!last->segment_bases.empty ())
  86. gdb_xml_error (parser,
  87. _("Library list with both segments and sections"));
  88. last->section_bases.push_back (address);
  89. }
  90. /* Handle the start of a <library> element. */
  91. static void
  92. library_list_start_library (struct gdb_xml_parser *parser,
  93. const struct gdb_xml_element *element,
  94. void *user_data,
  95. std::vector<gdb_xml_value> &attributes)
  96. {
  97. lm_info_vector *list = (lm_info_vector *) user_data;
  98. lm_info_target *item = new lm_info_target;
  99. item->name
  100. = (const char *) xml_find_attribute (attributes, "name")->value.get ();
  101. list->emplace_back (item);
  102. }
  103. static void
  104. library_list_end_library (struct gdb_xml_parser *parser,
  105. const struct gdb_xml_element *element,
  106. void *user_data, const char *body_text)
  107. {
  108. lm_info_vector *list = (lm_info_vector *) user_data;
  109. lm_info_target *lm_info = list->back ().get ();
  110. if (lm_info->segment_bases.empty () && lm_info->section_bases.empty ())
  111. gdb_xml_error (parser, _("No segment or section bases defined"));
  112. }
  113. /* Handle the start of a <library-list> element. */
  114. static void
  115. library_list_start_list (struct gdb_xml_parser *parser,
  116. const struct gdb_xml_element *element,
  117. void *user_data,
  118. std::vector<gdb_xml_value> &attributes)
  119. {
  120. struct gdb_xml_value *version = xml_find_attribute (attributes, "version");
  121. /* #FIXED attribute may be omitted, Expat returns NULL in such case. */
  122. if (version != NULL)
  123. {
  124. const char *string = (const char *) version->value.get ();
  125. if (strcmp (string, "1.0") != 0)
  126. gdb_xml_error (parser,
  127. _("Library list has unsupported version \"%s\""),
  128. string);
  129. }
  130. }
  131. /* The allowed elements and attributes for an XML library list.
  132. The root element is a <library-list>. */
  133. static const struct gdb_xml_attribute segment_attributes[] = {
  134. { "address", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
  135. { NULL, GDB_XML_AF_NONE, NULL, NULL }
  136. };
  137. static const struct gdb_xml_attribute section_attributes[] = {
  138. { "address", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
  139. { NULL, GDB_XML_AF_NONE, NULL, NULL }
  140. };
  141. static const struct gdb_xml_element library_children[] = {
  142. { "segment", segment_attributes, NULL,
  143. GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
  144. library_list_start_segment, NULL },
  145. { "section", section_attributes, NULL,
  146. GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
  147. library_list_start_section, NULL },
  148. { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
  149. };
  150. static const struct gdb_xml_attribute library_attributes[] = {
  151. { "name", GDB_XML_AF_NONE, NULL, NULL },
  152. { NULL, GDB_XML_AF_NONE, NULL, NULL }
  153. };
  154. static const struct gdb_xml_element library_list_children[] = {
  155. { "library", library_attributes, library_children,
  156. GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
  157. library_list_start_library, library_list_end_library },
  158. { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
  159. };
  160. static const struct gdb_xml_attribute library_list_attributes[] = {
  161. { "version", GDB_XML_AF_OPTIONAL, NULL, NULL },
  162. { NULL, GDB_XML_AF_NONE, NULL, NULL }
  163. };
  164. static const struct gdb_xml_element library_list_elements[] = {
  165. { "library-list", library_list_attributes, library_list_children,
  166. GDB_XML_EF_NONE, library_list_start_list, NULL },
  167. { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
  168. };
  169. static lm_info_vector
  170. solib_target_parse_libraries (const char *library)
  171. {
  172. lm_info_vector result;
  173. if (gdb_xml_parse_quick (_("target library list"), "library-list.dtd",
  174. library_list_elements, library, &result) == 0)
  175. {
  176. /* Parsed successfully. */
  177. return result;
  178. }
  179. result.clear ();
  180. return result;
  181. }
  182. #endif
  183. static struct so_list *
  184. solib_target_current_sos (void)
  185. {
  186. struct so_list *new_solib, *start = NULL, *last = NULL;
  187. /* Fetch the list of shared libraries. */
  188. gdb::optional<gdb::char_vector> library_document
  189. = target_read_stralloc (current_inferior ()->top_target (),
  190. TARGET_OBJECT_LIBRARIES, NULL);
  191. if (!library_document)
  192. return NULL;
  193. /* Parse the list. */
  194. lm_info_vector library_list
  195. = solib_target_parse_libraries (library_document->data ());
  196. if (library_list.empty ())
  197. return NULL;
  198. /* Build a struct so_list for each entry on the list. */
  199. for (auto &&info : library_list)
  200. {
  201. new_solib = XCNEW (struct so_list);
  202. strncpy (new_solib->so_name, info->name.c_str (),
  203. SO_NAME_MAX_PATH_SIZE - 1);
  204. new_solib->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
  205. strncpy (new_solib->so_original_name, info->name.c_str (),
  206. SO_NAME_MAX_PATH_SIZE - 1);
  207. new_solib->so_original_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
  208. /* We no longer need this copy of the name. */
  209. info->name.clear ();
  210. new_solib->lm_info = info.release ();
  211. /* Add it to the list. */
  212. if (!start)
  213. last = start = new_solib;
  214. else
  215. {
  216. last->next = new_solib;
  217. last = new_solib;
  218. }
  219. }
  220. return start;
  221. }
  222. static void
  223. solib_target_solib_create_inferior_hook (int from_tty)
  224. {
  225. /* Nothing needed. */
  226. }
  227. static void
  228. solib_target_clear_solib (void)
  229. {
  230. /* Nothing needed. */
  231. }
  232. static void
  233. solib_target_free_so (struct so_list *so)
  234. {
  235. lm_info_target *li = (lm_info_target *) so->lm_info;
  236. gdb_assert (li->name.empty ());
  237. delete li;
  238. }
  239. static void
  240. solib_target_relocate_section_addresses (struct so_list *so,
  241. struct target_section *sec)
  242. {
  243. CORE_ADDR offset;
  244. lm_info_target *li = (lm_info_target *) so->lm_info;
  245. /* Build the offset table only once per object file. We can not do
  246. it any earlier, since we need to open the file first. */
  247. if (li->offsets.empty ())
  248. {
  249. int num_sections = gdb_bfd_count_sections (so->abfd);
  250. li->offsets.assign (num_sections, 0);
  251. if (!li->section_bases.empty ())
  252. {
  253. int i;
  254. asection *sect;
  255. int num_alloc_sections = 0;
  256. for (i = 0, sect = so->abfd->sections;
  257. sect != NULL;
  258. i++, sect = sect->next)
  259. if ((bfd_section_flags (sect) & SEC_ALLOC))
  260. num_alloc_sections++;
  261. if (num_alloc_sections != li->section_bases.size ())
  262. warning (_("\
  263. Could not relocate shared library \"%s\": wrong number of ALLOC sections"),
  264. so->so_name);
  265. else
  266. {
  267. int bases_index = 0;
  268. int found_range = 0;
  269. so->addr_low = ~(CORE_ADDR) 0;
  270. so->addr_high = 0;
  271. for (i = 0, sect = so->abfd->sections;
  272. sect != NULL;
  273. i++, sect = sect->next)
  274. {
  275. if (!(bfd_section_flags (sect) & SEC_ALLOC))
  276. continue;
  277. if (bfd_section_size (sect) > 0)
  278. {
  279. CORE_ADDR low, high;
  280. low = li->section_bases[i];
  281. high = low + bfd_section_size (sect) - 1;
  282. if (low < so->addr_low)
  283. so->addr_low = low;
  284. if (high > so->addr_high)
  285. so->addr_high = high;
  286. gdb_assert (so->addr_low <= so->addr_high);
  287. found_range = 1;
  288. }
  289. li->offsets[i] = li->section_bases[bases_index];
  290. bases_index++;
  291. }
  292. if (!found_range)
  293. so->addr_low = so->addr_high = 0;
  294. gdb_assert (so->addr_low <= so->addr_high);
  295. }
  296. }
  297. else if (!li->segment_bases.empty ())
  298. {
  299. symfile_segment_data_up data
  300. = get_symfile_segment_data (so->abfd);
  301. if (data == NULL)
  302. warning (_("\
  303. Could not relocate shared library \"%s\": no segments"), so->so_name);
  304. else
  305. {
  306. ULONGEST orig_delta;
  307. int i;
  308. if (!symfile_map_offsets_to_segments (so->abfd, data.get (),
  309. li->offsets,
  310. li->segment_bases.size (),
  311. li->segment_bases.data ()))
  312. warning (_("\
  313. Could not relocate shared library \"%s\": bad offsets"), so->so_name);
  314. /* Find the range of addresses to report for this library in
  315. "info sharedlibrary". Report any consecutive segments
  316. which were relocated as a single unit. */
  317. gdb_assert (li->segment_bases.size () > 0);
  318. orig_delta = li->segment_bases[0] - data->segments[0].base;
  319. for (i = 1; i < data->segments.size (); i++)
  320. {
  321. /* If we have run out of offsets, assume all
  322. remaining segments have the same offset. */
  323. if (i >= li->segment_bases.size ())
  324. continue;
  325. /* If this segment does not have the same offset, do
  326. not include it in the library's range. */
  327. if (li->segment_bases[i] - data->segments[i].base
  328. != orig_delta)
  329. break;
  330. }
  331. so->addr_low = li->segment_bases[0];
  332. so->addr_high = (data->segments[i - 1].base
  333. + data->segments[i - 1].size
  334. + orig_delta);
  335. gdb_assert (so->addr_low <= so->addr_high);
  336. }
  337. }
  338. }
  339. offset = li->offsets[gdb_bfd_section_index (sec->the_bfd_section->owner,
  340. sec->the_bfd_section)];
  341. sec->addr += offset;
  342. sec->endaddr += offset;
  343. }
  344. static int
  345. solib_target_open_symbol_file_object (int from_tty)
  346. {
  347. /* We can't locate the main symbol file based on the target's
  348. knowledge; the user has to specify it. */
  349. return 0;
  350. }
  351. static int
  352. solib_target_in_dynsym_resolve_code (CORE_ADDR pc)
  353. {
  354. /* We don't have a range of addresses for the dynamic linker; there
  355. may not be one in the program's address space. So only report
  356. PLT entries (which may be import stubs). */
  357. return in_plt_section (pc);
  358. }
  359. struct target_so_ops solib_target_so_ops;
  360. void _initialize_solib_target ();
  361. void
  362. _initialize_solib_target ()
  363. {
  364. solib_target_so_ops.relocate_section_addresses
  365. = solib_target_relocate_section_addresses;
  366. solib_target_so_ops.free_so = solib_target_free_so;
  367. solib_target_so_ops.clear_solib = solib_target_clear_solib;
  368. solib_target_so_ops.solib_create_inferior_hook
  369. = solib_target_solib_create_inferior_hook;
  370. solib_target_so_ops.current_sos = solib_target_current_sos;
  371. solib_target_so_ops.open_symbol_file_object
  372. = solib_target_open_symbol_file_object;
  373. solib_target_so_ops.in_dynsym_resolve_code
  374. = solib_target_in_dynsym_resolve_code;
  375. solib_target_so_ops.bfd_open = solib_bfd_open;
  376. /* Set current_target_so_ops to solib_target_so_ops if not already
  377. set. */
  378. if (current_target_so_ops == 0)
  379. current_target_so_ops = &solib_target_so_ops;
  380. }