aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/archive.c3
-rw-r--r--bfd/elf-bfd.h9
-rw-r--r--bfd/version.h2
-rw-r--r--binutils/objcopy.c9
-rw-r--r--binutils/readelf.c60
-rw-r--r--gdb/break-catch-load.c1
-rw-r--r--gdb/break-catch-sig.c2
-rw-r--r--gdb/break-catch-syscall.c1
-rw-r--r--gdb/break-catch-throw.c4
-rw-r--r--gdb/break-cond-parse.c1
-rw-r--r--gdb/riscv-tdep.c17
-rw-r--r--gdb/solib.c4
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;