]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Fix parsing .debug_aranges section for signed addresses.
authorMartin Simmons <qqxnjvamvxwx@dyxyl.com>
Thu, 27 Mar 2025 16:03:45 +0000 (16:03 +0000)
committerTom Tromey <tromey@adacore.com>
Thu, 3 Apr 2025 15:02:40 +0000 (09:02 -0600)
Some architectures, such as MIPS, have signed addresses and this changes
read_addrmap_from_aranges to record them as signed when required.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32658
Approved-By: Tom Tromey <tom@tromey.com>
gdb/dwarf2/aranges.c

index 7016eee557c5b2d1dee2911cb39ae0464019d154..ac530abd6b333799f19aa0871854f346aa96c691 100644 (file)
@@ -59,6 +59,7 @@ read_addrmap_from_aranges (dwarf2_per_objfile *per_objfile,
 
   gdb::unordered_set<sect_offset> debug_info_offset_seen;
   const bfd_endian dwarf5_byte_order = gdbarch_byte_order (gdbarch);
+  const int signed_addr_p = bfd_get_sign_extend_vma (abfd);
   const gdb_byte *addr = section->buffer;
   while (addr < section->buffer + section->size)
     {
@@ -167,8 +168,13 @@ read_addrmap_from_aranges (dwarf2_per_objfile *per_objfile,
                          plongest (entry_addr - section->buffer));
              return false;
            }
-         ULONGEST start = extract_unsigned_integer (addr, address_size,
-                                                    dwarf5_byte_order);
+         ULONGEST start;
+         if (signed_addr_p)
+           start = extract_signed_integer (addr, address_size,
+                                           dwarf5_byte_order);
+         else
+           start = extract_unsigned_integer (addr, address_size,
+                                             dwarf5_byte_order);
          addr += address_size;
          ULONGEST length = extract_unsigned_integer (addr, address_size,
                                                      dwarf5_byte_order);