diff options
-rw-r--r-- | bfd/archive.c | 3 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 9 | ||||
-rw-r--r-- | bfd/version.h | 2 | ||||
-rw-r--r-- | binutils/objcopy.c | 9 | ||||
-rw-r--r-- | binutils/readelf.c | 60 | ||||
-rw-r--r-- | gdb/break-catch-load.c | 1 | ||||
-rw-r--r-- | gdb/break-catch-sig.c | 2 | ||||
-rw-r--r-- | gdb/break-catch-syscall.c | 1 | ||||
-rw-r--r-- | gdb/break-catch-throw.c | 4 | ||||
-rw-r--r-- | gdb/break-cond-parse.c | 1 | ||||
-rw-r--r-- | gdb/riscv-tdep.c | 17 | ||||
-rw-r--r-- | gdb/solib.c | 4 |
12 files changed, 52 insertions, 61 deletions
diff --git a/bfd/archive.c b/bfd/archive.c index 8e20554..c61d4b1 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -2299,7 +2299,6 @@ _bfd_compute_and_write_armap (bfd *arch, unsigned int elength) { char *first_name = NULL; bfd *current; - file_ptr elt_no = 0; struct orl *map = NULL; unsigned int orl_max = 1024; /* Fine initial default. */ unsigned int orl_count = 0; @@ -2334,7 +2333,7 @@ _bfd_compute_and_write_armap (bfd *arch, unsigned int elength) /* Map over each element. */ for (current = arch->archive_head; current != NULL; - current = current->archive_next, elt_no++) + current = current->archive_next) { if (bfd_check_format (current, bfd_object) && (bfd_get_file_flags (current) & HAS_SYMS) != 0) diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 2bd855a..5af11cf 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -3280,11 +3280,14 @@ extern asection _bfd_elf_large_com_section; _bfd_clear_contents (howto, input_bfd, input_section, \ contents, rel[index].r_offset); \ \ + /* For ld -r, remove relocations in debug and sframe sections \ + against symbols defined in discarded sections. Not done for \ + others. In particular the .eh_frame editing code expects \ + such relocs to be present. */ \ if (bfd_link_relocatable (info) \ - && (input_section->flags & SEC_DEBUGGING)) \ + && ((input_section->flags & SEC_DEBUGGING) != 0 \ + || elf_section_type (input_section) == SHT_GNU_SFRAME)) \ { \ - /* Only remove relocations in debug sections since other \ - sections may require relocations. */ \ Elf_Internal_Shdr *rel_hdr; \ \ rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section); \ diff --git a/bfd/version.h b/bfd/version.h index a555b4c..877f9a5 100644 --- a/bfd/version.h +++ b/bfd/version.h @@ -16,7 +16,7 @@ In releases, the date is not included in either version strings or sonames. */ -#define BFD_VERSION_DATE 20250716 +#define BFD_VERSION_DATE 20250717 #define BFD_VERSION @bfd_version@ #define BFD_VERSION_STRING @bfd_version_package@ @bfd_version_string@ #define REPORT_BUGS_TO @report_bugs_to@ diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 8c90773..2ca04e8 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -2529,7 +2529,6 @@ merge_gnu_build_notes (bfd * abfd, /* Reconstruct the ELF notes. */ bfd_byte * new_contents; - bfd_byte * old; bfd_byte * new; bfd_vma prev_start = 0; bfd_vma prev_end = 0; @@ -2537,12 +2536,8 @@ merge_gnu_build_notes (bfd * abfd, /* Not sure how, but the notes might grow in size. (eg see PR 1774507). Allow for this here. */ new = new_contents = xmalloc (size * 2); - for (pnote = pnotes, old = contents; - pnote < pnotes_end; - pnote ++) + for (pnote = pnotes; pnote < pnotes_end; pnote ++) { - bfd_size_type note_size = 12 + pnote->padded_namesz + pnote->note.descsz; - if (! is_deleted_note (pnote)) { /* Create the note, potentially using the @@ -2585,8 +2580,6 @@ merge_gnu_build_notes (bfd * abfd, prev_end = pnote->end; } } - - old += note_size; } #if DEBUG_MERGE diff --git a/binutils/readelf.c b/binutils/readelf.c index cfccdd2..686a16c 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -21727,8 +21727,13 @@ print_v850_note (Elf_Internal_Note * pnote) { unsigned int val; + printf (" %s: ", get_v850_elf_note_type (pnote->type)); + if (pnote->descsz != 4) - return false; + { + printf ("<corrupt descsz: %#lx>\n", pnote->descsz); + return false; + } val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz); @@ -23297,10 +23302,15 @@ process_v850_notes (Filedata * filedata, uint64_t offset, uint64_t length) " %#" PRIx64 " with length %#" PRIx64 ":\n"), offset, length); - while ((char *) external + sizeof (Elf_External_Note) < end) + while ((char *) external < end) { - Elf_External_Note * next; + char *next; Elf_Internal_Note inote; + size_t data_remaining = end - (char *) external; + + if (data_remaining < offsetof (Elf_External_Note, name)) + break; + data_remaining -= offsetof (Elf_External_Note, name); inote.type = BYTE_GET (external->type); inote.namesz = BYTE_GET (external->namesz); @@ -23308,47 +23318,25 @@ process_v850_notes (Filedata * filedata, uint64_t offset, uint64_t length) inote.descsz = BYTE_GET (external->descsz); inote.descdata = inote.namedata + align_power (inote.namesz, 2); inote.descpos = offset + (inote.descdata - (char *) pnotes); + next = inote.descdata + align_power (inote.descsz, 2); - if (inote.descdata < (char *) pnotes || inote.descdata >= end) - { - warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz); - inote.descdata = inote.namedata; - inote.namesz = 0; - } - - next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2)); - - if ( ((char *) next > end) - || ((char *) next < (char *) pnotes)) + if ((size_t) (inote.descdata - inote.namedata) < inote.namesz + || (size_t) (inote.descdata - inote.namedata) > data_remaining + || (size_t) (next - inote.descdata) < inote.descsz + || ((size_t) (next - inote.descdata) + > data_remaining - (size_t) (inote.descdata - inote.namedata))) { - warn (_("corrupt descsz found in note at offset %#tx\n"), + warn (_("note with invalid namesz and/or descsz found at offset %#tx\n"), (char *) external - (char *) pnotes); - warn (_(" type: %#lx, namesize: %#lx, descsize: %#lx\n"), - inote.type, inote.namesz, inote.descsz); + warn (_(" type: %#lx, namesize: %#lx, descsize: %#lx, alignment: %u\n"), + inote.type, inote.namesz, inote.descsz, 2); break; } - external = next; - - /* Prevent out-of-bounds indexing. */ - if ( inote.namedata + inote.namesz > end - || inote.namedata + inote.namesz < inote.namedata) - { - warn (_("corrupt namesz found in note at offset %#zx\n"), - (char *) external - (char *) pnotes); - warn (_(" type: %#lx, namesize: %#lx, descsize: %#lx\n"), - inote.type, inote.namesz, inote.descsz); - break; - } - - printf (" %s: ", get_v850_elf_note_type (inote.type)); + external = (Elf_External_Note *) next; if (! print_v850_note (& inote)) - { - res = false; - printf ("<corrupt sizes: namesz: %#lx, descsz: %#lx>\n", - inote.namesz, inote.descsz); - } + res = false; } free (pnotes); diff --git a/gdb/break-catch-load.c b/gdb/break-catch-load.c index 594884e..b5594c2 100644 --- a/gdb/break-catch-load.c +++ b/gdb/break-catch-load.c @@ -22,7 +22,6 @@ #include "arch-utils.h" #include "breakpoint.h" #include "cli/cli-decode.h" -#include "mi/mi-common.h" #include "progspace.h" #include "solib.h" #include "target.h" diff --git a/gdb/break-catch-sig.c b/gdb/break-catch-sig.c index adfc48f..9e1c6d6 100644 --- a/gdb/break-catch-sig.c +++ b/gdb/break-catch-sig.c @@ -18,9 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "arch-utils.h" -#include <ctype.h> #include "breakpoint.h" -#include "cli/cli-cmds.h" #include "inferior.h" #include "infrun.h" #include "annotate.h" diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c index 63bfec6..96f22a1 100644 --- a/gdb/break-catch-syscall.c +++ b/gdb/break-catch-syscall.c @@ -19,7 +19,6 @@ #include <ctype.h> #include "breakpoint.h" -#include "cli/cli-cmds.h" #include "inferior.h" #include "cli/cli-utils.h" #include "annotate.h" diff --git a/gdb/break-catch-throw.c b/gdb/break-catch-throw.c index cb682a6..6da38eb 100644 --- a/gdb/break-catch-throw.c +++ b/gdb/break-catch-throw.c @@ -25,12 +25,8 @@ #include "annotate.h" #include "valprint.h" #include "cli/cli-utils.h" -#include "completer.h" -#include "gdbsupport/gdb_obstack.h" #include "mi/mi-common.h" -#include "linespec.h" #include "probe.h" -#include "objfiles.h" #include "cp-abi.h" #include "gdbsupport/gdb_regex.h" #include "cp-support.h" diff --git a/gdb/break-cond-parse.c b/gdb/break-cond-parse.c index 04a8895..31b5343 100644 --- a/gdb/break-cond-parse.c +++ b/gdb/break-cond-parse.c @@ -23,7 +23,6 @@ #include "break-cond-parse.h" #include "tid-parse.h" #include "ada-lang.h" -#include "exceptions.h" /* When parsing tokens from a string, which direction are we parsing? diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c index 6d439b0..f5b8523 100644 --- a/gdb/riscv-tdep.c +++ b/gdb/riscv-tdep.c @@ -4163,6 +4163,20 @@ riscv_gnu_triplet_regexp (struct gdbarch *gdbarch) return "riscv(32|64)?"; } +/* Implement the "print_insn" gdbarch method. */ + +static int +riscv_print_insn (bfd_vma addr, struct disassemble_info *info) +{ + /* Initialize the BFD section to enable ISA string detection depending on the + object in scope. */ + struct obj_section *s = find_pc_section (addr); + if (s != nullptr) + info->section = s->the_bfd_section; + + return default_print_insn (addr, info); +} + /* Implementation of `gdbarch_stap_is_single_operand', as defined in gdbarch.h. */ @@ -4429,6 +4443,9 @@ riscv_gdbarch_init (struct gdbarch_info info, disassembler_options_riscv ()); set_gdbarch_disassembler_options (gdbarch, &riscv_disassembler_options); + /* Disassembler print_insn. */ + set_gdbarch_print_insn (gdbarch, riscv_print_insn); + /* SystemTap Support. */ set_gdbarch_stap_is_single_operand (gdbarch, riscv_stap_is_single_operand); set_gdbarch_stap_register_indirection_prefixes diff --git a/gdb/solib.c b/gdb/solib.c index 676688b..6d0fded 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -1743,8 +1743,8 @@ gdb_bfd_read_elf_soname (const char *filename) if symbol is not found. */ static CORE_ADDR -bfd_lookup_symbol_from_dyn_symtab ( - bfd *abfd, gdb::function_view<bool (const asymbol *)> match_sym) +bfd_lookup_symbol_from_dyn_symtab + (bfd *abfd, gdb::function_view<bool (const asymbol *)> match_sym) { long storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd); CORE_ADDR symaddr = 0; |