diff options
Diffstat (limited to 'gdb/solib-svr4.c')
-rw-r--r-- | gdb/solib-svr4.c | 543 |
1 files changed, 257 insertions, 286 deletions
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 33577b7..3ff6165 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -53,10 +53,9 @@ static int svr4_have_link_map_offsets (void); static void svr4_relocate_main_executable (void); static void svr4_free_library_list (so_list *solist); static void probes_table_remove_objfile_probes (struct objfile *objfile); -static void svr4_iterate_over_objfiles_in_search_order - (gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb, - objfile *current_objfile); - +static void svr4_iterate_over_objfiles_in_search_order ( + gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb, + objfile *current_objfile); /* On SVR4 systems, a list of symbols in the dynamic linker where GDB can try to place a breakpoint to monitor shared library @@ -66,31 +65,18 @@ static void svr4_iterate_over_objfiles_in_search_order SVR4 systems will fall back to using a symbol as the "startup mapping complete" breakpoint address. */ -static const char * const solib_break_names[] = -{ - "r_debug_state", - "_r_debug_state", - "_dl_debug_state", - "rtld_db_dlactivity", - "__dl_rtld_db_dlactivity", - "_rtld_debug_state", +static const char *const solib_break_names[] = { "r_debug_state", + "_r_debug_state", + "_dl_debug_state", + "rtld_db_dlactivity", + "__dl_rtld_db_dlactivity", + "_rtld_debug_state", - NULL -}; + NULL }; -static const char * const bkpt_names[] = -{ - "_start", - "__start", - "main", - NULL -}; +static const char *const bkpt_names[] = { "_start", "__start", "main", NULL }; -static const char * const main_name_list[] = -{ - "main_$main", - NULL -}; +static const char *const main_name_list[] = { "main_$main", NULL }; /* What to do when a probe stop occurs. */ @@ -128,8 +114,7 @@ struct probe_info probes are present in the dynamic linker then the probes-based interface will be used. */ -static const struct probe_info probe_info[] = -{ +static const struct probe_info probe_info[] = { { "init_start", DO_NOTHING }, { "init_complete", FULL_RELOAD }, { "map_start", DO_NOTHING }, @@ -197,24 +182,25 @@ lm_info_read (CORE_ADDR lm_addr) gdb::byte_vector lm (lmo->link_map_size); if (target_read_memory (lm_addr, lm.data (), lmo->link_map_size) != 0) - warning (_("Error reading shared library list entry at %s"), + warning (_ ("Error reading shared library list entry at %s"), paddress (target_gdbarch (), lm_addr)); else { - struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr; + struct type *ptr_type + = builtin_type (target_gdbarch ())->builtin_data_ptr; lm_info.reset (new lm_info_svr4); lm_info->lm_addr = lm_addr; - lm_info->l_addr_inferior = extract_typed_address (&lm[lmo->l_addr_offset], - ptr_type); + lm_info->l_addr_inferior + = extract_typed_address (&lm[lmo->l_addr_offset], ptr_type); lm_info->l_ld = extract_typed_address (&lm[lmo->l_ld_offset], ptr_type); - lm_info->l_next = extract_typed_address (&lm[lmo->l_next_offset], - ptr_type); - lm_info->l_prev = extract_typed_address (&lm[lmo->l_prev_offset], - ptr_type); - lm_info->l_name = extract_typed_address (&lm[lmo->l_name_offset], - ptr_type); + lm_info->l_next + = extract_typed_address (&lm[lmo->l_next_offset], ptr_type); + lm_info->l_prev + = extract_typed_address (&lm[lmo->l_prev_offset], ptr_type); + lm_info->l_name + = extract_typed_address (&lm[lmo->l_name_offset], ptr_type); } return lm_info; @@ -240,7 +226,7 @@ lm_addr_check (const struct so_list *so, bfd *abfd) l_addr = li->l_addr_inferior; - if (! abfd || ! has_lm_dynamic_from_link_map ()) + if (!abfd || !has_lm_dynamic_from_link_map ()) goto set_addr; l_dynaddr = li->l_ld; @@ -303,10 +289,9 @@ lm_addr_check (const struct so_list *so, bfd *abfd) && (l_addr & align) == ((l_dynaddr - dynaddr) & align)) { if (info_verbose) - gdb_printf (_("Using PIC (Position Independent Code) " - "prelink displacement %s for \"%s\".\n"), - paddress (target_gdbarch (), l_addr), - so->so_name); + gdb_printf (_ ("Using PIC (Position Independent Code) " + "prelink displacement %s for \"%s\".\n"), + paddress (target_gdbarch (), l_addr), so->so_name); } else { @@ -319,9 +304,10 @@ lm_addr_check (const struct so_list *so, bfd *abfd) of the DYNAMIC segment. Still the found address is the best one GDB could find. */ - warning (_(".dynamic section for \"%s\" " - "is not at the expected address " - "(wrong library or version mismatch?)"), so->so_name); + warning (_ (".dynamic section for \"%s\" " + "is not at the expected address " + "(wrong library or version mismatch?)"), + so->so_name); } } @@ -412,8 +398,7 @@ free_probes_table (struct svr4_info *info) static void free_solib_lists (svr4_info *info) { - for (const std::pair<CORE_ADDR, so_list *> tuple - : info->solib_lists) + for (const std::pair<CORE_ADDR, so_list *> tuple : info->solib_lists) svr4_free_library_list (tuple.second); info->solib_lists.clear (); @@ -497,17 +482,17 @@ read_program_header (int type, int *p_arch_size, CORE_ADDR *base_addr) int p_type; if (target_read_memory (at_phdr + i * sizeof (phdr), - (gdb_byte *)&phdr, sizeof (phdr))) + (gdb_byte *) &phdr, sizeof (phdr))) return {}; - p_type = extract_unsigned_integer ((gdb_byte *) phdr.p_type, - 4, byte_order); + p_type = extract_unsigned_integer ((gdb_byte *) phdr.p_type, 4, + byte_order); if (p_type == PT_PHDR) { pt_phdr_p = 1; - pt_phdr = extract_unsigned_integer ((gdb_byte *) phdr.p_vaddr, - 4, byte_order); + pt_phdr = extract_unsigned_integer ((gdb_byte *) phdr.p_vaddr, 4, + byte_order); } if (p_type == type) @@ -518,10 +503,10 @@ read_program_header (int type, int *p_arch_size, CORE_ADDR *base_addr) return {}; /* Retrieve address and size. */ - sect_addr = extract_unsigned_integer ((gdb_byte *)phdr.p_vaddr, - 4, byte_order); - sect_size = extract_unsigned_integer ((gdb_byte *)phdr.p_memsz, - 4, byte_order); + sect_addr + = extract_unsigned_integer ((gdb_byte *) phdr.p_vaddr, 4, byte_order); + sect_size + = extract_unsigned_integer ((gdb_byte *) phdr.p_memsz, 4, byte_order); } else { @@ -534,17 +519,17 @@ read_program_header (int type, int *p_arch_size, CORE_ADDR *base_addr) int p_type; if (target_read_memory (at_phdr + i * sizeof (phdr), - (gdb_byte *)&phdr, sizeof (phdr))) + (gdb_byte *) &phdr, sizeof (phdr))) return {}; - p_type = extract_unsigned_integer ((gdb_byte *) phdr.p_type, - 4, byte_order); + p_type = extract_unsigned_integer ((gdb_byte *) phdr.p_type, 4, + byte_order); if (p_type == PT_PHDR) { pt_phdr_p = 1; - pt_phdr = extract_unsigned_integer ((gdb_byte *) phdr.p_vaddr, - 8, byte_order); + pt_phdr = extract_unsigned_integer ((gdb_byte *) phdr.p_vaddr, 8, + byte_order); } if (p_type == type) @@ -555,10 +540,10 @@ read_program_header (int type, int *p_arch_size, CORE_ADDR *base_addr) return {}; /* Retrieve address and size. */ - sect_addr = extract_unsigned_integer ((gdb_byte *)phdr.p_vaddr, - 8, byte_order); - sect_size = extract_unsigned_integer ((gdb_byte *)phdr.p_memsz, - 8, byte_order); + sect_addr + = extract_unsigned_integer ((gdb_byte *) phdr.p_vaddr, 8, byte_order); + sect_size + = extract_unsigned_integer ((gdb_byte *) phdr.p_memsz, 8, byte_order); } /* PT_PHDR is optional, but we really need it @@ -584,7 +569,6 @@ read_program_header (int type, int *p_arch_size, CORE_ADDR *base_addr) return buf; } - /* Return program interpreter string. */ static gdb::optional<gdb::byte_vector> find_program_interpreter (void) @@ -593,29 +577,30 @@ find_program_interpreter (void) if (current_program_space->exec_bfd () && (bfd_get_flavour (current_program_space->exec_bfd ()) == bfd_target_elf_flavour)) - { - struct bfd_section *interp_sect; + { + struct bfd_section *interp_sect; - interp_sect = bfd_get_section_by_name (current_program_space->exec_bfd (), - ".interp"); - if (interp_sect != NULL) - { - int sect_size = bfd_section_size (interp_sect); - - gdb::byte_vector buf (sect_size); - bool res - = bfd_get_section_contents (current_program_space->exec_bfd (), - interp_sect, buf.data (), 0, sect_size); - if (res) - return buf; - } - } + interp_sect + = bfd_get_section_by_name (current_program_space->exec_bfd (), + ".interp"); + if (interp_sect != NULL) + { + int sect_size = bfd_section_size (interp_sect); + + gdb::byte_vector buf (sect_size); + bool res + = bfd_get_section_contents (current_program_space->exec_bfd (), + interp_sect, buf.data (), 0, + sect_size); + if (res) + return buf; + } + } /* If we didn't find it, use the target auxiliary vector. */ return read_program_header (PT_INTERP, NULL, NULL); } - /* Scan for DESIRED_DYNTAG in .dynamic section of the target's main executable, found by consulting the OS auxillary vector. If DESIRED_DYNTAG is found, 1 is returned and the corresponding PTR is set. */ @@ -641,39 +626,39 @@ scan_dyntag_auxv (const int desired_dyntag, CORE_ADDR *ptr, : sizeof (Elf64_External_Dyn); for (gdb_byte *buf = ph_data->data (), *bufend = buf + ph_data->size (); buf < bufend; buf += step) - { - if (arch_size == 32) - { - Elf32_External_Dyn *dynp = (Elf32_External_Dyn *) buf; + { + if (arch_size == 32) + { + Elf32_External_Dyn *dynp = (Elf32_External_Dyn *) buf; - current_dyntag = extract_unsigned_integer ((gdb_byte *) dynp->d_tag, - 4, byte_order); - dyn_ptr = extract_unsigned_integer ((gdb_byte *) dynp->d_un.d_ptr, - 4, byte_order); - } - else - { - Elf64_External_Dyn *dynp = (Elf64_External_Dyn *) buf; + current_dyntag = extract_unsigned_integer ((gdb_byte *) dynp->d_tag, + 4, byte_order); + dyn_ptr = extract_unsigned_integer ((gdb_byte *) dynp->d_un.d_ptr, 4, + byte_order); + } + else + { + Elf64_External_Dyn *dynp = (Elf64_External_Dyn *) buf; - current_dyntag = extract_unsigned_integer ((gdb_byte *) dynp->d_tag, - 8, byte_order); - dyn_ptr = extract_unsigned_integer ((gdb_byte *) dynp->d_un.d_ptr, - 8, byte_order); - } - if (current_dyntag == DT_NULL) - break; + current_dyntag = extract_unsigned_integer ((gdb_byte *) dynp->d_tag, + 8, byte_order); + dyn_ptr = extract_unsigned_integer ((gdb_byte *) dynp->d_un.d_ptr, 8, + byte_order); + } + if (current_dyntag == DT_NULL) + break; - if (current_dyntag == desired_dyntag) - { - if (ptr) - *ptr = dyn_ptr; + if (current_dyntag == desired_dyntag) + { + if (ptr) + *ptr = dyn_ptr; - if (ptr_addr) - *ptr_addr = base_addr + buf - ph_data->data (); + if (ptr_addr) + *ptr_addr = base_addr + buf - ph_data->data (); - return 1; - } - } + return 1; + } + } return 0; } @@ -703,11 +688,12 @@ elf_locate_base (void) instead of DT_DEBUG, although they sometimes contain an unused DT_DEBUG. */ if (gdb_bfd_scan_elf_dyntag (DT_MIPS_RLD_MAP, - current_program_space->exec_bfd (), - &dyn_ptr, NULL) + current_program_space->exec_bfd (), &dyn_ptr, + NULL) || scan_dyntag_auxv (DT_MIPS_RLD_MAP, &dyn_ptr, NULL)) { - struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr; + struct type *ptr_type + = builtin_type (target_gdbarch ())->builtin_data_ptr; gdb_byte *pbuf; int pbuf_size = ptr_type->length (); @@ -723,11 +709,12 @@ elf_locate_base (void) because of needing to support PIE. DT_MIPS_RLD_MAP will also exist in non-PIE. */ if (gdb_bfd_scan_elf_dyntag (DT_MIPS_RLD_MAP_REL, - current_program_space->exec_bfd (), - &dyn_ptr, &dyn_ptr_addr) + current_program_space->exec_bfd (), &dyn_ptr, + &dyn_ptr_addr) || scan_dyntag_auxv (DT_MIPS_RLD_MAP_REL, &dyn_ptr, &dyn_ptr_addr)) { - struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr; + struct type *ptr_type + = builtin_type (target_gdbarch ())->builtin_data_ptr; gdb_byte *pbuf; int pbuf_size = ptr_type->length (); @@ -773,8 +760,8 @@ solib_svr4_r_map (CORE_ADDR debug_base) try { - addr = read_memory_typed_address (debug_base + lmo->r_map_offset, - ptr_type); + addr + = read_memory_typed_address (debug_base + lmo->r_map_offset, ptr_type); } catch (const gdb_exception_error &ex) { @@ -811,9 +798,9 @@ solib_svr4_r_ldsomap (struct svr4_info *info) { /* Check version, and return zero if `struct r_debug' doesn't have the r_ldsomap member. */ - version - = read_memory_unsigned_integer (info->debug_base + lmo->r_version_offset, - lmo->r_version_size, byte_order); + version = read_memory_unsigned_integer (info->debug_base + + lmo->r_version_offset, + lmo->r_version_size, byte_order); } catch (const gdb_exception_error &ex) { @@ -852,8 +839,7 @@ solib_svr4_r_next (CORE_ADDR debug_base) if (version < 2 || lmo->r_next_offset == -1) return 0; - return read_memory_typed_address (debug_base + lmo->r_next_offset, - ptr_type); + return read_memory_typed_address (debug_base + lmo->r_next_offset, ptr_type); } /* On Solaris systems with some versions of the dynamic linker, @@ -903,18 +889,18 @@ open_symbol_file_object (int from_tty) add_flags |= SYMFILE_VERBOSE; if (current_program_space->symfile_object_file) - if (!query (_("Attempt to reload symbols from process? "))) + if (!query (_ ("Attempt to reload symbols from process? "))) return 0; /* Always locate the debug struct, in case it has moved. */ info->debug_base = elf_locate_base (); if (info->debug_base == 0) - return 0; /* failed somehow... */ + return 0; /* failed somehow... */ /* First link map member should be the executable. */ lm = solib_svr4_r_map (info->debug_base); if (lm == 0) - return 0; /* failed somehow... */ + return 0; /* failed somehow... */ /* Read address of name from target memory to GDB. */ read_memory (lm + lmo->l_name_offset, l_name_buf.data (), l_name_size); @@ -923,7 +909,7 @@ open_symbol_file_object (int from_tty) l_name = extract_typed_address (l_name_buf.data (), ptr_type); if (l_name == 0) - return 0; /* No filename. */ + return 0; /* No filename. */ /* Now fetch the filename from target memory. */ gdb::unique_xmalloc_ptr<char> filename @@ -931,7 +917,7 @@ open_symbol_file_object (int from_tty) if (filename == nullptr) { - warning (_("failed to read exec filename from attached file")); + warning (_ ("failed to read exec filename from attached file")); return 0; } @@ -1115,7 +1101,7 @@ svr4_library_list_start_list (struct gdb_xml_parser *parser, if (strcmp (version, "1.0") != 0) gdb_xml_error (parser, - _("SVR4 Library list has unsupported version \"%s\""), + _ ("SVR4 Library list has unsupported version \"%s\""), version); if (main_lm) @@ -1131,39 +1117,30 @@ svr4_library_list_start_list (struct gdb_xml_parser *parser, /* The allowed elements and attributes for an XML library list. The root element is a <library-list>. */ -static const struct gdb_xml_attribute svr4_library_attributes[] = -{ - { "name", GDB_XML_AF_NONE, NULL, NULL }, - { "lm", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, - { "l_addr", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, - { "l_ld", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, - { "lmid", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, - { NULL, GDB_XML_AF_NONE, NULL, NULL } -}; - -static const struct gdb_xml_element svr4_library_list_children[] = -{ - { - "library", svr4_library_attributes, NULL, - GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL, - library_list_start_library, NULL - }, - { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } -}; - -static const struct gdb_xml_attribute svr4_library_list_attributes[] = -{ - { "version", GDB_XML_AF_NONE, NULL, NULL }, - { "main-lm", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL }, - { NULL, GDB_XML_AF_NONE, NULL, NULL } -}; - -static const struct gdb_xml_element svr4_library_list_elements[] = -{ - { "library-list-svr4", svr4_library_list_attributes, svr4_library_list_children, - GDB_XML_EF_NONE, svr4_library_list_start_list, NULL }, - { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } -}; +static const struct gdb_xml_attribute svr4_library_attributes[] + = { { "name", GDB_XML_AF_NONE, NULL, NULL }, + { "lm", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, + { "l_addr", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, + { "l_ld", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, + { "lmid", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL }, + { NULL, GDB_XML_AF_NONE, NULL, NULL } }; + +static const struct gdb_xml_element svr4_library_list_children[] + = { { "library", svr4_library_attributes, NULL, + GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL, + library_list_start_library, NULL }, + { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } }; + +static const struct gdb_xml_attribute svr4_library_list_attributes[] + = { { "version", GDB_XML_AF_NONE, NULL, NULL }, + { "main-lm", GDB_XML_AF_OPTIONAL, gdb_xml_parse_attr_ulongest, NULL }, + { NULL, GDB_XML_AF_NONE, NULL, NULL } }; + +static const struct gdb_xml_element svr4_library_list_elements[] + = { { "library-list-svr4", svr4_library_list_attributes, + svr4_library_list_children, GDB_XML_EF_NONE, + svr4_library_list_start_list, NULL }, + { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL } }; /* Parse qXfer:libraries:read packet into *SO_LIST_RETURN. Return 1 if @@ -1174,18 +1151,17 @@ static const struct gdb_xml_element svr4_library_list_elements[] = static int svr4_parse_libraries (const char *document, struct svr4_library_list *list) { - auto cleanup = make_scope_exit ([list] () - { - for (const std::pair<CORE_ADDR, so_list *> tuple - : list->solib_lists) - svr4_free_library_list (tuple.second); - }); + auto cleanup = make_scope_exit ([list] () { + for (const std::pair<CORE_ADDR, so_list *> tuple : list->solib_lists) + svr4_free_library_list (tuple.second); + }); list->tailp = nullptr; list->main_lm = 0; list->solib_lists.clear (); - if (gdb_xml_parse_quick (_("target library list"), "library-list-svr4.dtd", - svr4_library_list_elements, document, list) == 0) + if (gdb_xml_parse_quick (_ ("target library list"), "library-list-svr4.dtd", + svr4_library_list_elements, document, list) + == 0) { /* Parsed successfully, keep the result. */ cleanup.release (); @@ -1214,8 +1190,7 @@ svr4_current_sos_via_xfer_libraries (struct svr4_library_list *list, /* Fetch the list of shared libraries. */ gdb::optional<gdb::char_vector> svr4_library_document = target_read_stralloc (current_inferior ()->top_target (), - TARGET_OBJECT_LIBRARIES_SVR4, - annex); + TARGET_OBJECT_LIBRARIES_SVR4, annex); if (!svr4_library_document) return 0; @@ -1252,7 +1227,8 @@ svr4_default_sos (svr4_info *info) li->l_addr = li->l_addr_inferior = info->debug_loader_offset; li->l_addr_p = 1; - strncpy (newobj->so_name, info->debug_loader_name, SO_NAME_MAX_PATH_SIZE - 1); + strncpy (newobj->so_name, info->debug_loader_name, + SO_NAME_MAX_PATH_SIZE - 1); newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; strcpy (newobj->so_original_name, newobj->so_name); @@ -1287,7 +1263,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, if (li->l_prev != prev_lm) { - warning (_("Corrupted shared library list: %s != %s"), + warning (_ ("Corrupted shared library list: %s != %s"), paddress (target_gdbarch (), prev_lm), paddress (target_gdbarch (), li->l_prev)); return 0; @@ -1315,7 +1291,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, object, but (most likely) a vDSO. In this case, silently skip it; otherwise emit a warning. */ if (first_l_name == 0 || li->l_name != first_l_name) - warning (_("Can't read pathname for load map.")); + warning (_ ("Can't read pathname for load map.")); continue; } @@ -1325,7 +1301,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, /* If this entry has no name, or its name matches the name for the main executable, don't include it in the list. */ - if (! newobj->so_name[0] || match_main (newobj->so_name)) + if (!newobj->so_name[0] || match_main (newobj->so_name)) continue; newobj->next = 0; @@ -1360,8 +1336,7 @@ svr4_current_sos_direct (struct svr4_info *info) Unfortunately statically linked inferiors will also fall back through this suboptimal code path. */ - info->using_xfer = svr4_current_sos_via_xfer_libraries (&library_list, - NULL); + info->using_xfer = svr4_current_sos_via_xfer_libraries (&library_list, NULL); if (info->using_xfer) { if (library_list.main_lm) @@ -1393,15 +1368,13 @@ svr4_current_sos_direct (struct svr4_info *info) late by a static executable. */ if (current_program_space->exec_bfd () && bfd_get_section_by_name (current_program_space->exec_bfd (), - ".dynamic") == NULL) + ".dynamic") + == NULL) ignore_first = false; else ignore_first = true; - auto cleanup = make_scope_exit ([info] () - { - free_solib_lists (info); - }); + auto cleanup = make_scope_exit ([info] () { free_solib_lists (info); }); /* Collect the sos in each namespace. */ CORE_ADDR debug_base = info->debug_base; @@ -1451,8 +1424,7 @@ svr4_collect_probes_sos (svr4_info *info) so_list *sos = nullptr; so_list **pnext = &sos; - for (const std::pair<CORE_ADDR, so_list *> tuple - : info->solib_lists) + for (const std::pair<CORE_ADDR, so_list *> tuple : info->solib_lists) { so_list *solist = tuple.second; @@ -1621,7 +1593,7 @@ svr4_fetch_objfile_link_map (struct objfile *objfile) static int match_main (const char *soname) { - const char * const *mainp; + const char *const *mainp; for (mainp = main_name_list; *mainp != NULL; mainp++) { @@ -1640,12 +1612,10 @@ svr4_in_dynsym_resolve_code (CORE_ADDR pc) { struct svr4_info *info = get_svr4_info (current_program_space); - return ((pc >= info->interp_text_sect_low - && pc < info->interp_text_sect_high) - || (pc >= info->interp_plt_sect_low - && pc < info->interp_plt_sect_high) - || in_plt_section (pc) - || in_gnu_ifunc_stub (pc)); + return ( + (pc >= info->interp_text_sect_low && pc < info->interp_text_sect_high) + || (pc >= info->interp_plt_sect_low && pc < info->interp_plt_sect_high) + || in_plt_section (pc) || in_gnu_ifunc_stub (pc)); } /* Given an executable's ABFD and target, compute the entry-point @@ -1664,9 +1634,9 @@ exec_entry_point (struct bfd *abfd, struct target_ops *targ) gdbarch_convert_from_func_ptr_addr(). The method gdbarch_convert_from_func_ptr_addr() is the merely the identify function for targets which don't use function descriptors. */ - addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (), - bfd_get_start_address (abfd), - targ); + addr + = gdbarch_convert_from_func_ptr_addr (target_gdbarch (), + bfd_get_start_address (abfd), targ); return gdbarch_addr_bits_remove (target_gdbarch (), addr); } @@ -1749,8 +1719,8 @@ register_solib_event_probe (svr4_info *info, struct objfile *objfile, /* Create the probes table, if necessary. */ if (info->probes_table == NULL) info->probes_table.reset (htab_create_alloc (1, hash_probe_and_action, - equal_probe_and_action, - xfree, xcalloc, xfree)); + equal_probe_and_action, xfree, + xcalloc, xfree)); lookup.address = address; slot = htab_find_slot (info->probes_table.get (), &lookup, INSERT); @@ -1847,8 +1817,7 @@ solist_update_full (struct svr4_info *info) failure. */ static int -solist_update_incremental (svr4_info *info, CORE_ADDR debug_base, - CORE_ADDR lm) +solist_update_incremental (svr4_info *info, CORE_ADDR debug_base, CORE_ADDR lm) { /* Fall back to a full update if we are using a remote target that does not support incremental transfers. */ @@ -1926,8 +1895,8 @@ solist_update_incremental (svr4_info *info, CORE_ADDR debug_base, } /* ...but nothing else. */ - for (const std::pair<CORE_ADDR, so_list *> tuple - : library_list.solib_lists) + for (const std::pair<CORE_ADDR, so_list *> tuple : + library_list.solib_lists) gdb_assert (tuple.second == nullptr); *pnext = sos; @@ -1952,8 +1921,8 @@ solist_update_incremental (svr4_info *info, CORE_ADDR debug_base, static void disable_probes_interface (svr4_info *info) { - warning (_("Probes-based dynamic linker interface failed.\n" - "Reverting to original interface.")); + warning (_ ("Probes-based dynamic linker interface failed.\n" + "Reverting to original interface.")); free_probes_table (info); free_solib_lists (info); @@ -1989,10 +1958,8 @@ svr4_handle_solib_event (void) /* If anything goes wrong we revert to the original linker interface. */ - auto cleanup = make_scope_exit ([info] () - { - disable_probes_interface (info); - }); + auto cleanup + = make_scope_exit ([info] () { disable_probes_interface (info); }); action = solib_event_probe_action (pa); if (action == PROBES_INTERFACE_FAILED) @@ -2260,8 +2227,8 @@ svr4_find_and_create_probe_breakpoints (svr4_info *info, catch (const gdb_exception_error &ex) { exception_print (gdb_stderr, ex); - warning (_("Initializing probes-based dynamic linker interface " - "failed.\nReverting to original interface.")); + warning (_ ("Initializing probes-based dynamic linker interface " + "failed.\nReverting to original interface.")); return false; } } @@ -2293,7 +2260,8 @@ svr4_create_solib_event_breakpoints (svr4_info *info, struct gdbarch *gdbarch, if (os == nullptr || (!svr4_find_and_create_probe_breakpoints (info, gdbarch, os, false) - && !svr4_find_and_create_probe_breakpoints (info, gdbarch, os, true))) + && !svr4_find_and_create_probe_breakpoints (info, gdbarch, os, + true))) { solib_debug_printf ("falling back to r_brk breakpoint: addr=%s", paddress (gdbarch, address)); @@ -2309,6 +2277,7 @@ cmp_name_and_sec_flags (const asymbol *sym, const void *data) return (strcmp (sym->name, (const char *) data) == 0 && (sym->section->flags & (SEC_CODE | SEC_DATA)) != 0); } + /* Arrange for dynamic linker to hit breakpoint. Both the SunOS and the SVR4 dynamic linkers have, as part of their @@ -2345,7 +2314,7 @@ static int enable_break (struct svr4_info *info, int from_tty) { struct bound_minimal_symbol msymbol; - const char * const *bkpt_namep; + const char *const *bkpt_namep; asection *interp_sect; CORE_ADDR sym_addr; @@ -2366,10 +2335,11 @@ enable_break (struct svr4_info *info, int from_tty) { struct obj_section *os; - sym_addr = gdbarch_addr_bits_remove - (target_gdbarch (), - gdbarch_convert_from_func_ptr_addr - (target_gdbarch (), sym_addr, current_inferior ()->top_target ())); + sym_addr + = gdbarch_addr_bits_remove (target_gdbarch (), + gdbarch_convert_from_func_ptr_addr ( + target_gdbarch (), sym_addr, + current_inferior ()->top_target ())); /* On at least some versions of Solaris there's a dynamic relocation on _r_debug.r_brk and SYM_ADDR may not be relocated yet, e.g., if @@ -2418,7 +2388,8 @@ enable_break (struct svr4_info *info, int from_tty) = info->interp_plt_sect_low + bfd_section_size (interp_sect); } - svr4_create_solib_event_breakpoints (info, target_gdbarch (), sym_addr); + svr4_create_solib_event_breakpoints (info, target_gdbarch (), + sym_addr); return 1; } } @@ -2490,8 +2461,8 @@ enable_break (struct svr4_info *info, int from_tty) if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT)) { CORE_ADDR space_size = (CORE_ADDR) 1 << addr_bit; - CORE_ADDR tmp_entry_point = exec_entry_point (tmp_bfd.get (), - tmp_bfd_target); + CORE_ADDR tmp_entry_point + = exec_entry_point (tmp_bfd.get (), tmp_bfd_target); gdb_assert (load_addr < space_size); @@ -2553,9 +2524,9 @@ enable_break (struct svr4_info *info, int from_tty) /* Now try to set a breakpoint in the dynamic linker. */ for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++) { - sym_addr = gdb_bfd_lookup_symbol (tmp_bfd.get (), - cmp_name_and_sec_flags, - *bkpt_namep); + sym_addr + = gdb_bfd_lookup_symbol (tmp_bfd.get (), cmp_name_and_sec_flags, + *bkpt_namep); if (sym_addr != 0) break; } @@ -2564,9 +2535,9 @@ enable_break (struct svr4_info *info, int from_tty) /* Convert 'sym_addr' from a function pointer to an address. Because we pass tmp_bfd_target instead of the current target, this will always produce an unrelocated value. */ - sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (), - sym_addr, - tmp_bfd_target); + sym_addr + = gdbarch_convert_from_func_ptr_addr (target_gdbarch (), sym_addr, + tmp_bfd_target); /* We're done with both the temporary bfd and target. Closing the target closes the underlying bfd, because it holds the @@ -2583,9 +2554,9 @@ enable_break (struct svr4_info *info, int from_tty) /* For whatever reason we couldn't set a breakpoint in the dynamic linker. Warn and drop into the old code. */ bkpt_at_symbol: - warning (_("Unable to find dynamic linker breakpoint function.\n" - "GDB will be unable to debug shared library initializers\n" - "and track explicitly loaded dynamic code.")); + warning (_ ("Unable to find dynamic linker breakpoint function.\n" + "GDB will be unable to debug shared library initializers\n" + "and track explicitly loaded dynamic code.")); } /* Scan through the lists of symbols, trying to look up the symbol and @@ -2595,12 +2566,11 @@ enable_break (struct svr4_info *info, int from_tty) for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++) { msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, objf); - if ((msymbol.minsym != NULL) - && (msymbol.value_address () != 0)) + if ((msymbol.minsym != NULL) && (msymbol.value_address () != 0)) { sym_addr = msymbol.value_address (); - sym_addr = gdbarch_convert_from_func_ptr_addr - (target_gdbarch (), sym_addr, current_inferior ()->top_target ()); + sym_addr = gdbarch_convert_from_func_ptr_addr ( + target_gdbarch (), sym_addr, current_inferior ()->top_target ()); svr4_create_solib_event_breakpoints (info, target_gdbarch (), sym_addr); return 1; @@ -2612,13 +2582,12 @@ enable_break (struct svr4_info *info, int from_tty) for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++) { msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, objf); - if ((msymbol.minsym != NULL) - && (msymbol.value_address () != 0)) + if ((msymbol.minsym != NULL) && (msymbol.value_address () != 0)) { sym_addr = msymbol.value_address (); - sym_addr = gdbarch_convert_from_func_ptr_addr - (target_gdbarch (), sym_addr, - current_inferior ()->top_target ()); + sym_addr = gdbarch_convert_from_func_ptr_addr ( + target_gdbarch (), sym_addr, + current_inferior ()->top_target ()); svr4_create_solib_event_breakpoints (info, target_gdbarch (), sym_addr); return 1; @@ -2765,11 +2734,13 @@ svr4_exec_displacement (CORE_ADDR *displacementp) content offset for the verification purpose. */ if (phdrs_target->size () != phdrs_binary->size () - || bfd_get_arch_size (current_program_space->exec_bfd ()) != arch_size) + || bfd_get_arch_size (current_program_space->exec_bfd ()) + != arch_size) return 0; else if (arch_size == 32 && phdrs_target->size () >= sizeof (Elf32_External_Phdr) - && phdrs_target->size () % sizeof (Elf32_External_Phdr) == 0) + && phdrs_target->size () % sizeof (Elf32_External_Phdr) + == 0) { Elf_Internal_Ehdr *ehdr2 = elf_tdata (current_program_space->exec_bfd ())->elf_header; @@ -2792,16 +2763,17 @@ svr4_exec_displacement (CORE_ADDR *displacementp) CORE_ADDR displacement_vaddr = 0; CORE_ADDR displacement_paddr = 0; - phdrp = &((Elf32_External_Phdr *) phdrs_target->data ())[i]; + phdrp + = &((Elf32_External_Phdr *) phdrs_target->data ())[i]; buf_vaddr_p = (gdb_byte *) &phdrp->p_vaddr; buf_paddr_p = (gdb_byte *) &phdrp->p_paddr; - vaddr = extract_unsigned_integer (buf_vaddr_p, 4, - byte_order); + vaddr + = extract_unsigned_integer (buf_vaddr_p, 4, byte_order); displacement_vaddr = vaddr - phdr2[i].p_vaddr; - paddr = extract_unsigned_integer (buf_paddr_p, 4, - byte_order); + paddr + = extract_unsigned_integer (buf_paddr_p, 4, byte_order); displacement_paddr = paddr - phdr2[i].p_paddr; if (displacement_vaddr == displacement_paddr) @@ -2836,13 +2808,13 @@ svr4_exec_displacement (CORE_ADDR *displacementp) /* Check also other adjustment combinations - PR 11786. */ - vaddr = extract_unsigned_integer (buf_vaddr_p, 4, - byte_order); + vaddr + = extract_unsigned_integer (buf_vaddr_p, 4, byte_order); vaddr -= displacement; store_unsigned_integer (buf_vaddr_p, 4, byte_order, vaddr); - paddr = extract_unsigned_integer (buf_paddr_p, 4, - byte_order); + paddr + = extract_unsigned_integer (buf_paddr_p, 4, byte_order); paddr -= displacement; store_unsigned_integer (buf_paddr_p, 4, byte_order, paddr); @@ -2882,8 +2854,9 @@ svr4_exec_displacement (CORE_ADDR *displacementp) gdb_byte *buf_filesz_p = (gdb_byte *) &phdrp->p_filesz; CORE_ADDR filesz; - content2 = (bfd_section_flags (plt2_asect) - & SEC_HAS_CONTENTS) != 0; + content2 + = (bfd_section_flags (plt2_asect) & SEC_HAS_CONTENTS) + != 0; filesz = extract_unsigned_integer (buf_filesz_p, 4, byte_order); @@ -2907,7 +2880,8 @@ svr4_exec_displacement (CORE_ADDR *displacementp) } else if (arch_size == 64 && phdrs_target->size () >= sizeof (Elf64_External_Phdr) - && phdrs_target->size () % sizeof (Elf64_External_Phdr) == 0) + && phdrs_target->size () % sizeof (Elf64_External_Phdr) + == 0) { Elf_Internal_Ehdr *ehdr2 = elf_tdata (current_program_space->exec_bfd ())->elf_header; @@ -2930,16 +2904,17 @@ svr4_exec_displacement (CORE_ADDR *displacementp) CORE_ADDR displacement_vaddr = 0; CORE_ADDR displacement_paddr = 0; - phdrp = &((Elf64_External_Phdr *) phdrs_target->data ())[i]; + phdrp + = &((Elf64_External_Phdr *) phdrs_target->data ())[i]; buf_vaddr_p = (gdb_byte *) &phdrp->p_vaddr; buf_paddr_p = (gdb_byte *) &phdrp->p_paddr; - vaddr = extract_unsigned_integer (buf_vaddr_p, 8, - byte_order); + vaddr + = extract_unsigned_integer (buf_vaddr_p, 8, byte_order); displacement_vaddr = vaddr - phdr2[i].p_vaddr; - paddr = extract_unsigned_integer (buf_paddr_p, 8, - byte_order); + paddr + = extract_unsigned_integer (buf_paddr_p, 8, byte_order); displacement_paddr = paddr - phdr2[i].p_paddr; if (displacement_vaddr == displacement_paddr) @@ -2973,13 +2948,13 @@ svr4_exec_displacement (CORE_ADDR *displacementp) /* Check also other adjustment combinations - PR 11786. */ - vaddr = extract_unsigned_integer (buf_vaddr_p, 8, - byte_order); + vaddr + = extract_unsigned_integer (buf_vaddr_p, 8, byte_order); vaddr -= displacement; store_unsigned_integer (buf_vaddr_p, 8, byte_order, vaddr); - paddr = extract_unsigned_integer (buf_paddr_p, 8, - byte_order); + paddr + = extract_unsigned_integer (buf_paddr_p, 8, byte_order); paddr -= displacement; store_unsigned_integer (buf_paddr_p, 8, byte_order, paddr); @@ -3011,17 +2986,17 @@ svr4_exec_displacement (CORE_ADDR *displacementp) } /* prelink can convert .plt SHT_NOBITS to SHT_PROGBITS. */ - plt2_asect - = bfd_get_section_by_name (current_program_space->exec_bfd (), - ".plt"); + plt2_asect = bfd_get_section_by_name ( + current_program_space->exec_bfd (), ".plt"); if (plt2_asect) { int content2; gdb_byte *buf_filesz_p = (gdb_byte *) &phdrp->p_filesz; CORE_ADDR filesz; - content2 = (bfd_section_flags (plt2_asect) - & SEC_HAS_CONTENTS) != 0; + content2 + = (bfd_section_flags (plt2_asect) & SEC_HAS_CONTENTS) + != 0; filesz = extract_unsigned_integer (buf_filesz_p, 8, byte_order); @@ -3055,8 +3030,8 @@ svr4_exec_displacement (CORE_ADDR *displacementp) the executable symbols/file has been already relocated to displacement. */ - gdb_printf (_("Using PIE (Position Independent Executable) " - "displacement %s for \"%s\".\n"), + gdb_printf (_ ("Using PIE (Position Independent Executable) " + "displacement %s for \"%s\".\n"), paddress (target_gdbarch (), exec_displacement), bfd_get_filename (current_program_space->exec_bfd ())); } @@ -3101,7 +3076,7 @@ svr4_relocate_main_executable (void) - The section offsets were not reset earlier, and the best we can hope is that the old offsets are still applicable to the new run. */ - if (! svr4_exec_displacement (&displacement)) + if (!svr4_exec_displacement (&displacement)) return; /* Even DISPLACEMENT 0 is a valid new difference of in-memory vs. in-file @@ -3207,7 +3182,6 @@ svr4_truncate_ptr (CORE_ADDR addr) return addr & (((CORE_ADDR) 1 << gdbarch_ptr_bit (target_gdbarch ())) - 1); } - static void svr4_relocate_section_addresses (struct so_list *so, struct target_section *sec) @@ -3217,14 +3191,13 @@ svr4_relocate_section_addresses (struct so_list *so, sec->addr = svr4_truncate_ptr (sec->addr + lm_addr_check (so, abfd)); sec->endaddr = svr4_truncate_ptr (sec->endaddr + lm_addr_check (so, abfd)); } - /* Architecture-specific operations. */ struct solib_svr4_ops { /* Return a description of the layout of `struct link_map'. */ - struct link_map_offsets *(*fetch_link_map_offsets)(void) = nullptr; + struct link_map_offsets *(*fetch_link_map_offsets) (void) = nullptr; }; /* Per-architecture data key. */ @@ -3245,16 +3218,16 @@ get_ops (struct gdbarch *gdbarch) GDBARCH to FLMO. Also, install SVR4 solib_ops into GDBARCH. */ void -set_solib_svr4_fetch_link_map_offsets (struct gdbarch *gdbarch, - struct link_map_offsets *(*flmo) (void)) +set_solib_svr4_fetch_link_map_offsets ( + struct gdbarch *gdbarch, struct link_map_offsets *(*flmo) (void) ) { struct solib_svr4_ops *ops = get_ops (gdbarch); ops->fetch_link_map_offsets = flmo; set_gdbarch_so_ops (gdbarch, &svr4_so_ops); - set_gdbarch_iterate_over_objfiles_in_search_order - (gdbarch, svr4_iterate_over_objfiles_in_search_order); + set_gdbarch_iterate_over_objfiles_in_search_order ( + gdbarch, svr4_iterate_over_objfiles_in_search_order); } /* Fetch a link_map_offsets structure using the architecture-specific @@ -3278,7 +3251,6 @@ svr4_have_link_map_offsets (void) return (ops->fetch_link_map_offsets != NULL); } - /* Most OS'es that have SVR4-style ELF dynamic libraries define a `struct r_debug' and a `struct link_map' that are binary compatible @@ -3347,7 +3319,6 @@ svr4_lp64_fetch_link_map_offsets (void) return lmp; } - /* Return the DSO matching OBJFILE or nullptr if none can be found. */ @@ -3384,8 +3355,7 @@ find_debug_base_for_solib (so_list *solib) svr4_info *info = get_svr4_info (current_program_space); gdb_assert (info != nullptr); - for (const std::pair<CORE_ADDR, so_list *> tuple - : info->solib_lists) + for (const std::pair<CORE_ADDR, so_list *> tuple : info->solib_lists) { CORE_ADDR debug_base = tuple.first; so_list *solist = tuple.second; @@ -3405,9 +3375,9 @@ find_debug_base_for_solib (so_list *solib) the initial namespace. */ static void -svr4_iterate_over_objfiles_in_search_order - (gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb, - objfile *current_objfile) +svr4_iterate_over_objfiles_in_search_order ( + gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb, + objfile *current_objfile) { bool checked_current_objfile = false; if (current_objfile != nullptr) @@ -3423,7 +3393,8 @@ svr4_iterate_over_objfiles_in_search_order abfd = current_objfile->obfd.get (); if (abfd != nullptr - && gdb_bfd_scan_elf_dyntag (DT_SYMBOLIC, abfd, nullptr, nullptr) == 1) + && gdb_bfd_scan_elf_dyntag (DT_SYMBOLIC, abfd, nullptr, nullptr) + == 1) { checked_current_objfile = true; if (cb (current_objfile)) @@ -3463,8 +3434,7 @@ svr4_iterate_over_objfiles_in_search_order } } -const struct target_so_ops svr4_so_ops = -{ +const struct target_so_ops svr4_so_ops = { svr4_relocate_section_addresses, svr4_free_so, svr4_clear_so, @@ -3482,6 +3452,7 @@ const struct target_so_ops svr4_so_ops = }; void _initialize_svr4_solib (); + void _initialize_svr4_solib () { |