diff options
author | Aaron Merey <amerey@redhat.com> | 2021-08-10 22:05:44 -0400 |
---|---|---|
committer | Aaron Merey <amerey@redhat.com> | 2021-08-18 22:24:18 -0400 |
commit | 8ddf46454aa981246f9611b1897f41fabd2a108d (patch) | |
tree | 17b1d9632a2f2e5d8627b7d50585d13690630b10 /gdb/solib-dsbt.c | |
parent | 76bed1fdbd7256228847962770bdc5832c53172c (diff) | |
download | fsf-binutils-gdb-8ddf46454aa981246f9611b1897f41fabd2a108d.zip fsf-binutils-gdb-8ddf46454aa981246f9611b1897f41fabd2a108d.tar.gz fsf-binutils-gdb-8ddf46454aa981246f9611b1897f41fabd2a108d.tar.bz2 |
gdb/solib: Refactor scan_dyntag
scan_dyntag is unnecessarily duplicated in solib-svr4.c and solib-dsbt.c.
Move this function to solib.c and rename it to gdb_bfd_scan_elf_dyntag.
Also add it to solib.h so it is included in both solib-svr4 and solib-dsbt.
Diffstat (limited to 'gdb/solib-dsbt.c')
-rw-r--r-- | gdb/solib-dsbt.c | 104 |
1 files changed, 3 insertions, 101 deletions
diff --git a/gdb/solib-dsbt.c b/gdb/solib-dsbt.c index 803467d..d7f4b25 100644 --- a/gdb/solib-dsbt.c +++ b/gdb/solib-dsbt.c @@ -396,106 +396,6 @@ fetch_loadmap (CORE_ADDR ldmaddr) static void dsbt_relocate_main_executable (void); static int enable_break (void); -/* Scan for DYNTAG in .dynamic section of ABFD. If DYNTAG is found 1 is - returned and the corresponding PTR is set. */ - -static int -scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr) -{ - int arch_size, step, sect_size; - long dyn_tag; - CORE_ADDR dyn_ptr, dyn_addr; - gdb_byte *bufend, *bufstart, *buf; - Elf32_External_Dyn *x_dynp_32; - Elf64_External_Dyn *x_dynp_64; - struct bfd_section *sect; - - if (abfd == NULL) - return 0; - - if (bfd_get_flavour (abfd) != bfd_target_elf_flavour) - return 0; - - arch_size = bfd_get_arch_size (abfd); - if (arch_size == -1) - return 0; - - /* Find the start address of the .dynamic section. */ - sect = bfd_get_section_by_name (abfd, ".dynamic"); - if (sect == NULL) - return 0; - - bool found = false; - for (const target_section &target_section - : current_program_space->target_sections ()) - if (sect == target_section.the_bfd_section) - { - dyn_addr = target_section.addr; - found = true; - break; - } - if (!found) - { - /* ABFD may come from OBJFILE acting only as a symbol file without being - loaded into the target (see add_symbol_file_command). This case is - such fallback to the file VMA address without the possibility of - having the section relocated to its actual in-memory address. */ - - dyn_addr = bfd_section_vma (sect); - } - - /* Read in .dynamic from the BFD. We will get the actual value - from memory later. */ - sect_size = bfd_section_size (sect); - buf = bufstart = (gdb_byte *) alloca (sect_size); - if (!bfd_get_section_contents (abfd, sect, - buf, 0, sect_size)) - return 0; - - /* Iterate over BUF and scan for DYNTAG. If found, set PTR and return. */ - step = (arch_size == 32) ? sizeof (Elf32_External_Dyn) - : sizeof (Elf64_External_Dyn); - for (bufend = buf + sect_size; - buf < bufend; - buf += step) - { - if (arch_size == 32) - { - x_dynp_32 = (Elf32_External_Dyn *) buf; - dyn_tag = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_tag); - dyn_ptr = bfd_h_get_32 (abfd, (bfd_byte *) x_dynp_32->d_un.d_ptr); - } - else - { - x_dynp_64 = (Elf64_External_Dyn *) buf; - dyn_tag = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_tag); - dyn_ptr = bfd_h_get_64 (abfd, (bfd_byte *) x_dynp_64->d_un.d_ptr); - } - if (dyn_tag == DT_NULL) - return 0; - if (dyn_tag == dyntag) - { - /* If requested, try to read the runtime value of this .dynamic - entry. */ - if (ptr) - { - struct type *ptr_type; - gdb_byte ptr_buf[8]; - CORE_ADDR ptr_addr; - - ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr; - ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8; - if (target_read_memory (ptr_addr, ptr_buf, arch_size / 8) == 0) - dyn_ptr = extract_typed_address (ptr_buf, ptr_type); - *ptr = dyn_ptr; - } - return 1; - } - } - - return 0; -} - /* See solist.h. */ static int @@ -565,7 +465,9 @@ lm_base (void) "lm_base: get addr %x by _GLOBAL_OFFSET_TABLE_.\n", (unsigned int) addr); } - else if (scan_dyntag (DT_PLTGOT, current_program_space->exec_bfd (), &addr)) + else if (gdb_bfd_scan_elf_dyntag (DT_PLTGOT, + current_program_space->exec_bfd (), + &addr, NULL)) { struct int_elf32_dsbt_loadmap *ldm; |