]> git.ipfire.org Git - thirdparty/binutils-gdb.git/log
thirdparty/binutils-gdb.git
20 hours agoAutomatic date update in version.in binutils-2_46-branch
GDB Administrator [Fri, 30 Jan 2026 00:00:34 +0000 (00:00 +0000)] 
Automatic date update in version.in

30 hours agoRevert "ld: testcase for .note.GNU-stack wanting to be SHT_NOTE" etc
Jan Beulich [Thu, 29 Jan 2026 13:19:54 +0000 (14:19 +0100)] 
Revert "ld: testcase for .note.GNU-stack wanting to be SHT_NOTE" etc

This reverts commits a1c2fa92ac93bf50227941bd82094e6997c5fd56,
bc6e40a093e700e84b549902d55e73bfe92a113b
("amend "ELF: give .note.GNU-stack proper section type""), and
c8db2c887b4129732341c4a1a51cdcd3191db271
("ELF: give .note.GNU-stack proper section type"). They're deemed
to require a little more testing before being ready for a release.

44 hours agoAutomatic date update in version.in
GDB Administrator [Thu, 29 Jan 2026 00:00:35 +0000 (00:00 +0000)] 
Automatic date update in version.in

46 hours agoPR 33852 Different objects for same input
Alan Modra [Wed, 28 Jan 2026 21:49:44 +0000 (08:19 +1030)] 
PR 33852 Different objects for same input

Testcase:
$ cat aff.s
 .quad x@ntpoff
$ gas/as-new -m64 aff.s -o t.o
with MALLOC_PERTURB_ this reliably shows uninitialised memory making
its way into the output.

R_390_TLS_LE64 howto was sized incorrectly, resulting in the
initialisation in s390_elf_cons zeroing only the first four bytes.

* elf64-s390.c (elf_howto_table <R_390_TLS_LE64>): Correct
size and bitsize.

(cherry picked from commit 0e245c72b774658c48a14b05d78a4e0943a8a9b1)

2 days agogas: segmentation fault in as_report_context
Alan Modra [Wed, 28 Jan 2026 07:38:09 +0000 (18:08 +1030)] 
gas: segmentation fault in as_report_context

After input_scrub_end when next_saved_file is NULL, it is possible
that macro_nest will be non-zero on files with errors.  If
output_file_close then has an error and reports it with as_fatal we
hit the segfault.

PR 33746
* input_scrub.c (as_report_context): Don't assume
next_saved_file is non-NULL.
(as_where): Likewise.

(cherry picked from commit ea96771a0188a235645558ae10d6885c91c1ac00)

2 days agoAutomatic date update in version.in
GDB Administrator [Wed, 28 Jan 2026 00:00:35 +0000 (00:00 +0000)] 
Automatic date update in version.in

2 days agoregen pot files
Alan Modra [Tue, 27 Jan 2026 23:53:11 +0000 (10:23 +1030)] 
regen pot files

2 days agoRe: PR 33840 typo in elfnn-loongarch.c
Alan Modra [Tue, 27 Jan 2026 23:18:41 +0000 (09:48 +1030)] 
Re: PR 33840 typo in elfnn-loongarch.c

The second string with the typo was unused (and had unescaped %).
Remove it.

(cherry picked from commit 6f8d261d200b59f0cc55581ad6cefe3912a05fa9)

2 days agoPR 33840 typo in elfnn-loongarch.c
Alan Modra [Tue, 27 Jan 2026 22:53:21 +0000 (09:23 +1030)] 
PR 33840 typo in elfnn-loongarch.c

s/marching/matching/

(cherry picked from commit 5c9b48f2eda429b3ef09a8239a472f6a72541a53)

2 days agoPR 33838 Truncated translation in objcopy.c
Alan Modra [Mon, 26 Jan 2026 03:53:29 +0000 (14:23 +1030)] 
PR 33838 Truncated translation in objcopy.c

The only macros allowed are the ones specially handled by gettext,
such as PRId64.

* objcopy.c (copy_usage): Don't use string literal
concatenation of macros in translated strings.

Patch from Andreas Schwab <schwab@linux-m68k.org>

(cherry picked from commit 1c8cfb3d217aee87562c4f4c4dbc1e4d60e8eadb)

2 days agoPR 33835 readelf incorrect handling of DWARF5 CU DIE addr_base attribute
Than McIntosh [Sun, 25 Jan 2026 14:19:10 +0000 (14:19 +0000)] 
PR 33835 readelf incorrect handling of DWARF5 CU DIE addr_base attribute

Users of "readelf" report problems running the tool's DWARF dump flag
on binaries built with the most recent version of the Go compiler (1.25),
Go bug report here https://github.com/golang/go/issues/77246

dwarf.c (skip_attribute <DW_FORM_string>): Skip terminating NUL too.

(cherry picked from commit a72b83ab3792532b66cc5c472a20476a8a2fd969)

2 days agoHard-coded plural in readelf.c
Alan Modra [Sun, 25 Jan 2026 22:02:35 +0000 (08:32 +1030)] 
Hard-coded plural in readelf.c

PR 33837
* readelf.c (process_got_section_contents): Use ngettext.

(cherry picked from commit 795593e667b00334e7b3fa8b11ea0e844e01b5af)

3 days agoAutomatic date update in version.in
GDB Administrator [Tue, 27 Jan 2026 00:00:34 +0000 (00:00 +0000)] 
Automatic date update in version.in

4 days agobfd/ELF: fix BFD library build --enable-shared
Matthieu Longo [Thu, 22 Jan 2026 18:53:34 +0000 (18:53 +0000)] 
bfd/ELF: fix BFD library build --enable-shared

The patch series that added support for Object Attributes v2 introduced
regressions when building the BFD library as a shared object.

Incorrect usages of ATTRIBUTE_HIDDEN caused the following link-time errors:

/usr/bin/ld: config/obj-elf-attr.o: in function `obj_attr_v2_record':
obj-elf-attr.c: undefined reference to `bfd_elf_obj_attr_v2_init'
obj-elf-attr.c: undefined reference to `_bfd_obj_attr_v2_find_by_tag'
obj-elf-attr.c: undefined reference to `obj_attr_v2_t_append'
/usr/bin/ld: config/obj-elf-attr.o: in function `obj_attr_v2_subsection_record':
obj-elf-attr.c: undefined reference to `obj_attr_subsection_v2_t_append'
obj-elf-attr.c: undefined reference to `obj_attr_subsection_v2_t_remove'
obj-elf-attr.c: undefined reference to `obj_attr_subsection_v2_t_append'

This patch fixes the symbols visibility so that the BFD library links
correctly when built with --enable-shared.
The ATTRIBUTE_HIDDEN annotations were removed from bfd_elf_obj_attr_v2_init
and _bfd_obj_attr_v2_find_by_tag, and _bfd_obj_attr_v2_find_by_tag was renamed
to reflect the belonging to the public BFD API using the 'bfd_' prefix. The
doubly linked list helpers remain hidden and are instead exposed through wrapper
functions.

4 days agobinutils: xfail "gnu-debuglink (objdump 1)" on Solaris/amd64 [PR33243,PR33389]
Rainer Orth [Mon, 26 Jan 2026 09:12:04 +0000 (10:12 +0100)] 
binutils: xfail "gnu-debuglink (objdump 1)" on Solaris/amd64 [PR33243,PR33389]

As reported in PR binutils/33243, one test FAILs on Solaris/amd64:

FAIL: gnu-debuglink (objdump 1)

30c30,32
<   400660:     ff 35 b2 15 00 00 ff 25 b4 15 00 00 0f 1f 40 00     .5.....%......@.
---
>   400660:     ff 35 b2 15 00 00       push   0x15b2(%rip)        # 401c18 <_GLOBAL_OFFSET_TABLE_+0x8>
>   400666:     ff 25 b4 15 00 00       jmp    *0x15b4(%rip)        # 401c20 <_GLOBAL_OFFSET_TABLE_+0x10>
>   40066c:     0f 1f 40 00             nopl   0x0(%rax)

This is another instance of PR binutils/33389, so this patch xfail's the
test.

Tested on {amd64,i386}-pc-solaris2.11 and {x86_64,i686}-pc-linux-gnu.

2026-01-25  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

binutils:
PR binutils/33243
PR binutils/33389
* testsuite/binutils-all/compress.exp (test_gnu_debuglink): xfail
on Solaris/amd64.

(cherry picked from commit aa3291fceac4a53054a6337a577a882b078db9be)

5 days agoUpdate version to 2.45.90
Nick Clifton [Sun, 25 Jan 2026 09:57:52 +0000 (09:57 +0000)] 
Update version to 2.45.90

5 days agoAdd 2.46 release markers to NEWS files. Update BRANCHES. Update README.
Nick Clifton [Sun, 25 Jan 2026 08:47:26 +0000 (08:47 +0000)] 
Add 2.46 release markers to NEWS files.  Update BRANCHES.  Update README.

5 days agold: sframe: do not generate .sframe for PLT if no .sframe is in input BFDs
Indu Bhagat [Thu, 22 Jan 2026 08:00:36 +0000 (10:00 +0200)] 
ld: sframe: do not generate .sframe for PLT if no .sframe is in input BFDs

GNU ld creates SFrame stack trace info for the PLT. For x86 the linker-
created .sframe section is created in setup_gnu_properties.  For s390 it
is created in create_dynamic_sections.  For both, the section data is
itself emitted a bit later in late_size_sections.  Note that for aarch64 the
linker does not create .sframe for PLT yet.

Recall that a previous patch 832ca9ef670 uncoupled
--no-ld-generated-unwind-info from the linker-generated .sframe
sections.  This means that the linker now generates .sframe section (for
.plt*) for the first input BFD enthusiatically even when none of the
input BFDs have any .sframe section, unless --discard-sframe is also
added.  The issue is that these (unexpected) linker-generated .sframe
sections (on x86_64, and s390) may now trip the linking process, e.g.,
when using --orphan-handling=error together with a linker script that
treats .sframe differently than the default linker script.
https://sourceware.org/pipermail/binutils/2026-January/147826.html

Further, with SFrame sections to be soon marked KEEP for fixing
GC/SFrame (PR ld/32769), the presence of these linker generated SFrame
sections will also cause emission of an empty .sframe (for x86_64 and
s390x), even when all input bfd's have no .sframe section.

This patch avoids creation of .sframe for .plt* if none of the input
BFDs had any .sframe section.  This then avoids creation of empty
.sframe in linked objects on x86_64 and s390x, when none of the inputs
have SFrame sections.  This also fixes PR ld/33830.

For the code changes:
Reviewed-by: Jens Remus <jremus@linux.ibm.com>
New testcases have (since the above Reviewed-by) been added.  Since
--no-ld-generated-unwind-info is not supported on aarch64, add
target-specific ld tests.  Additionally add a generic test (for all
targets that support SFrame) to ensure no output .sframe is generated if
users says no --gsframe or similar.

bfd/
PR ld/33830
* elf-bfd.h (_bfd_elf_sframe_present_input_bfds): New
declaration.
* elf-sframe.c (_bfd_elf_sframe_present_input_bfds): New
definition.
* elf64-s390.c (elf_s390_create_dynamic_sections): Do not
generate .sframe for .plt unconditionally.
* elfxx-x86.c (_bfd_x86_elf_link_setup_gnu_properties):
Likewise.
ld/testsuite/
PR ld/33830
* ld-s390/no-sframe.ld: Linker script with no specification for
SFrame sections.
* ld-s390/s390.exp: Add new test.
* ld-s390/sframe-command-line-2.d: New testcase that uses
--no-ld-generated-unwind-info and a linker script that has no
specific rules for .sframe.
* ld-x86-64/no-sframe.ld: Likewise for x86_64.
* ld-x86-64/sframe-command-line-2.d: Likewise for x86_64.
* ld-x86-64/x86-64.exp: Add new test.
* ld-sframe/no-ld-generated-sframe.d: Ensure no .sframe in
output if no .sframe in input.
* ld-sframe/no-sframe.ld: Linker script with no specification
for SFrame sections.
* ld-sframe/test.s: Add new test.

5 days agogas: aarch64: i386: s390: sframe: adjust sframe_ra_tracking_p
Indu Bhagat [Sun, 25 Jan 2026 03:11:59 +0000 (19:11 -0800)] 
gas: aarch64: i386: s390: sframe: adjust sframe_ra_tracking_p

Like the previous commit b600229503 which adjusted the implementation of
flex fde hook, make a similar change for sframe_ra_tracking_p.

Simply providing the definition to use boolean value direcly is
sufficient for the purpose, and helps generate better code.

gas/
* config/tc-aarch64.c (aarch64_sframe_ra_tracking_p): Remove.
* config/tc-aarch64.h (aarch64_sframe_ra_tracking_p): Remove.
(sframe_ra_tracking_p): Set to true.
* config/tc-i386.c (x86_sframe_ra_tracking_p): Remove.
* config/tc-i386.h (x86_sframe_ra_tracking_p): Remove.
(sframe_ra_tracking_p): Set to false.
* config/tc-s390.c (s390_sframe_ra_tracking_p): Remove.
* config/tc-s390.h (s390_sframe_ra_tracking_p): Remove.
(sframe_ra_tracking_p): Set to true.

5 days agoAutomatic date update in version.in
GDB Administrator [Sun, 25 Jan 2026 00:00:07 +0000 (00:00 +0000)] 
Automatic date update in version.in

5 days agohppa64: Fix Linux link
John David Anglin [Sat, 24 Jan 2026 20:44:13 +0000 (15:44 -0500)] 
hppa64: Fix Linux link

The "BFD_ASSERT (r_symndx != STN_UNDEF)" assert is incorrect and
triggers linking Linux kernel.

2026-01-24  John David Anglin  <danglin@gcc.gnu.org>

bfd/ChangeLog:

* elf64-hppa.c (elf64_hppa_relocate_section): Remove asserts.

6 days agogas/NEWS: Add AArch64 updates
Alice Carlotti [Sat, 24 Jan 2026 03:19:49 +0000 (03:19 +0000)] 
gas/NEWS: Add AArch64 updates

6 days agoaarch64: Tidy architecture extensions documentation
Alice Carlotti [Sat, 24 Jan 2026 02:45:39 +0000 (02:45 +0000)] 
aarch64: Tidy architecture extensions documentation

Document mops_go, add some missing full stops, and fix alphabetization
mistakes.

6 days agoaarch64: Fix sme2p3 and f16f32dot feature dependencies
Alice Carlotti [Sat, 24 Jan 2026 02:42:16 +0000 (02:42 +0000)] 
aarch64: Fix sme2p3 and f16f32dot feature dependencies

These are changed to match the dependencies we agreed with LLVM.

6 days agoaarch64: Add -march=armv9.7-a option
Alice Carlotti [Sat, 24 Jan 2026 02:51:56 +0000 (02:51 +0000)] 
aarch64: Add -march=armv9.7-a option

6 days agoaarch64: Fix documentation of armv9.6-a dependencies
Alice Carlotti [Sat, 24 Jan 2026 02:49:22 +0000 (02:49 +0000)] 
aarch64: Fix documentation of armv9.6-a dependencies

The sve2p2 and fprcvt extensions were removed from -march=armv9.6-a, but
we forgot to update the documentation at the same time.

6 days agoaarch64: Remove redundant macros
Alice Carlotti [Sat, 24 Jan 2026 01:39:15 +0000 (01:39 +0000)] 
aarch64: Remove redundant macros

We no longer encode flags in the aarch64_hint_options value field, so
delete the HINT_VAL, HINT_FLAG and HINT_ENCODE macros.

6 days agoaarch64: Add support for TLBID system registers
Srinath Parvathaneni [Fri, 23 Jan 2026 22:25:30 +0000 (22:25 +0000)] 
aarch64: Add support for TLBID system registers

This patch adds support for following TLBID system registers.

* tlbididr_el1 (RO)
* vtlbid0_el2
* vtlbid1_el2
* vtlbid2_el2
* vtlbid3_el2
* vtlbidos0_el2
* vtlbidos1_el2
* vtlbidos2_el2
* vtlbidos3_el2

6 days agoaarch64: TLBI Domains changes for PLBI instruction
Srinath Parvathaneni [Fri, 23 Jan 2026 22:25:29 +0000 (22:25 +0000)] 
aarch64: TLBI Domains changes for PLBI instruction

For the PLBI instruction with optional register argument
<Rt> == 0b1111, with FEAT_TLBID enabled they are permitted to
have an Rt value which is not 0b11111 and this is allowed for
all the TLBI instructions with a <type> of ALLE1*, ALLE2* and
VMALL* and a <shareability> of IS or OS.

6 days agoaarch64: Enable TLBIP instructions with tlbid option
Srinath Parvathaneni [Fri, 23 Jan 2026 22:25:28 +0000 (22:25 +0000)] 
aarch64: Enable TLBIP instructions with tlbid option

TLBI Domains feature changes TLBI and TLBIP system instructions.
For all TLBIP *E1IS*, TLBIP *E1OS*, TLBIP *E2IS* and TLBIP *E2OS*
instructions that are currently dependent on FEAT_D128 (+d128),
will also be available with FEAT_TLBID (+tlbid).

6 days agoaarch64: Add support for FEAT_TLBID feature
Srinath Parvathaneni [Fri, 23 Jan 2026 22:25:27 +0000 (22:25 +0000)] 
aarch64: Add support for FEAT_TLBID feature

TLBI Domains feature changes TLBI and TLBIP system instructions.
For the TLBI instruction with optional register argument
<Rt> == 0b1111, with FEAT_TLBID enabled they are permitted to
have an Rt value which is not 0b11111 and this is allowed for
all the TLBI instructions with a <type> of ALLE1*, ALLE2*,
VMALL*, VMALLS12* or VMALLWS2* and a <shareability> of IS or OS.

This patch add support for FEAT_TLBID feature, which is enabled
by new +tlbid option.

6 days agold: testsuite: Relax libgot-1-i386 test for Solaris [PR33350]
Rainer Orth [Sat, 24 Jan 2026 07:08:48 +0000 (08:08 +0100)] 
ld: testsuite: Relax libgot-1-i386 test for Solaris [PR33350]

When running the ld testsuite with -melf_i386_sol2 instead of -melf_i386
on Solaris, one test regresses:

FAIL: Build libgot-1-i386.so

The issue is that one line in the --got-contents output differs
unexpectedly:

 Global Offset Table '.got.plt' contains 4 entries:
    Index:  Address      Reloc             Sym. Name + Addend/Value
-       0: 00200200                        20016c
-       1: 00200204                        0
-       2: 00200208                        0
-       3: 0020020c R_386_JUMP_SLOT        bar + 156
+       0: 00200270                        2001dc
+       1: 00200274                        0
+       2: 00200278                        0
+       3: 0020027c R_386_JUMP_SLOT        bar + 1c6

While ld-i386/libgot-1.rd already allows for differences in the
addresses, the addend is assumed to be fixed.  However, this is not the
case with -melf_i386_sol2.  The difference is that .hash, .dynsym, and
.symtab have additional entries as required by the Solaris ABI:

* In .dynsym and .symtab, _DYNAMIC, _GLOBAL_OFFSET_TABLE_, and
  _PROCEDURE_LINKAGE_TABLE_ are added.

* .symtab also gains _END_ and _START_.

This explains the differences in addresses and addends, but they are
completely benign.

This patch thus allows for arbitrary addends.

Tested on {i386,amd64}-pc-solaris2.11 with both -melf_i386_sol2 and
-melf_i386, and {i686,x86_64}-pc-linux-gnu.

2026-01-23  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

ld:
PR ld/33350
* testsuite/ld-i386/libgot-1.rd: Allow for different
R_386_JUMP_SLOT addends.

6 days agold: testsuite: Skip pr33577 tests with GNU extensions on Solaris [PR33577]
Rainer Orth [Sat, 24 Jan 2026 07:02:14 +0000 (08:02 +0100)] 
ld: testsuite: Skip pr33577 tests with GNU extensions on Solaris [PR33577]

Several of the ld-elfvers pr33577 tests FAIL on Solaris, for either or
both of two reasons:

* Tests using ld --hash-style=gnu cannot work on Solaris:
  .gnu.hash/SHT_GNU_HASH sections are a GNU extension not supported by
  Solaris ld.so.1.

* Similarly, binding different implementations of the same symbol to
  different symbol versions is a GNU extension that wasn't in the
  original Solaris specification of symbol versioning.  ld.so.1 doesn't
  support it and never will.

  This can be seen in the elfdump output for the .dynsym section:

Symbol Table Section:  .dynsym
  index     value size  type bind oth ver shndx         name

    [8]     0x630  0xd  FUNC GLOB  D   1H .text         foo
   [10]     0x620  0x6  FUNC GLOB  D    2 .text         foo

  foo is bound to both version 1 (the Base version) and version 2 (VERS_1
  from pr33577.map).

  Same for .symtab:

Symbol Table Section:  .symtab
  index    value size  type bind oth ver shndx       name

   [28]     0x620  0x6  FUNC GLOB  D    0 .text         foo
   [35]     0x630  0xd  FUNC GLOB  D    0 .text         foo@

  As I said, ld.so.1 doesn't support <symbol>@<version> (in this case the
  Base version) at all.

Therefore the tests that employ those extensions are guarded with
supports_gnu_osabi.

Tested on sparc{,v9}-sun-solaris2.11, sparc{,64}-unknown-linux-gnu,
{i386,amd64}-pc-solaris2.11, and {x86_64,i686}-pc-linux-gnu.

2026-01-23  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

ld:
PR ld/33577
* testsuite/ld-elfvers/vers.exp (base_symbol_test): Only run
pr33577a with libpr33577-versioned.so test on ELFOSABI_GNU
systems.
Likewise for run base_symbol_tests with --hash-style=gnu.

6 days agold: Make separate clauses where a label was before a declaration
Hans-Peter Nilsson [Sat, 24 Jan 2026 03:53:41 +0000 (04:53 +0100)] 
ld: Make separate clauses where a label was before a declaration

The default behavior of gcc changed from gcc-11.  With gcc-10 and
earlier versions, you got:

In file included from ../bfd/bfd.h:45,
                 from /src/ld/ldmisc.c:23:
/src/ld/ldmisc.c: In function 'vfinfo':
/src/ld/ldmisc.c:186:8: error: a label can only be part of a statement and a declaration is not a statement
  186 |        bool ll_type = false;
      |        ^~~~
/src/ld/ldmisc.c:581:8: error: a label can only be part of a statement and a declaration is not a statement
  581 |        bool ll_type = false;
      |        ^~~~
make[4]: *** [Makefile:1606: ldmisc.o] Error 1

Since gcc-10 matches the binutils/README requirement ("a C99 compliant
compiler and library") and as binutils policy is to adjust code to
handle earlier gcc versions, an obvious fix is to make a compound
statement for the code after the case-label.

ld:

* ldmisc.c (vfinfo) <case 'l' - two cases>: Make separate
compound statements where case-labels were part of a declaration.

6 days agoelf: Set has_local_dynsyms for forced local symbol
H.J. Lu [Thu, 15 Jan 2026 01:11:50 +0000 (09:11 +0800)] 
elf: Set has_local_dynsyms for forced local symbol

bfd_elf_link_record_dynamic_symbol may be called by mips backend after
a global symbol has been forced to local.  Set has_local_dynsyms to true
in this case.

bfd/

PR ld/33793
* elflink.c (bfd_elf_link_record_dynamic_symbol): Set
has_local_dynsyms to true for forced local symbol.

ld/

PR ld/33793
* testsuite/ld-mips-elf/mips-elf.exp: Run pr33793.
* testsuite/ld-mips-elf/pr33793.d: New file.
* testsuite/ld-mips-elf/pr33793.s: Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
6 days agowindres: quote the angled brackets to avoid confusing shell
Alibek Omarov [Thu, 22 Jan 2026 22:35:18 +0000 (03:35 +0500)] 
windres: quote the angled brackets to avoid confusing shell

When invoking windres with a preprocessor parameter that contains angled
brackets, the shell will try to interpret them, leading to an error.

For example with an empty test.rc file:

$ i686-w64-mingw32-windres '-DTEST=<foo>' -o test.o -i test.rc
sh: 1: cannot open foo: No such file
i686-w64-mingw32-windres: preprocessing failed.

After patch it correctly complains about no resources baked in:

$ ./i686-w64-mingw32-windres '-DTEST=<foo>' -o test.o -i test.rc
./i686-w64-mingw32-windres: no resources

Signed-off-by: Alibek Omarov <a1ba.omarov@gmail.com>
6 days agoopcodes: Fix branch displacement mask in M*Core disassembler
Michal Sobon [Fri, 23 Jan 2026 13:38:28 +0000 (14:38 +0100)] 
opcodes: Fix branch displacement mask in M*Core disassembler

The BT, BF, BR, and BSR instructions use the Scaled 11-Bit Displacement
addressing mode. According to the Motorola M*Core Reference Manual,
the instruction format has:
- bits 15-11: opcode
- bits 10-0: 11-bit signed displacement field

The displacement calculation is: PC <- PC + 2 + (sign-extended disp11 << 1)

The disassembler was incorrectly masking with 0x3FF (10 bits) instead of
0x7FF (11 bits). This masked off bit 10, which is the sign bit for the
11-bit signed displacement. As a result, negative (backward) branches
were incorrectly disassembled as forward branches.

opcodes/
* mcore-dis.c (print_insn_mcore): Fix displacement mask from
0x3FF to 0x7FF in BR case to correctly extract all 11 bits
including the sign bit.

Signed-off-by: Michal Sobon <msobon@hex-rays.com>
6 days agoamend supports_oa targets
Alan Modra [Sat, 24 Jan 2026 02:09:27 +0000 (12:39 +1030)] 
amend supports_oa targets

Add vxworks and windiss to supported targets.  is_elf_target excludes
them as a hack to work around multiple other elf test failures.

On these targets, fixes
FAIL: GNU attributes v1/v2: no support for directive .gnu_attribute

6 days agosframe: doc: prepare SFrame specification for release
Indu Bhagat [Sat, 24 Jan 2026 00:25:21 +0000 (16:25 -0800)] 
sframe: doc: prepare SFrame specification for release

Remove the DRAFT marker before release.  Currently needs to be done
manually.

libsframe/
* doc/sframe-spec.texi: Remove DRAFT marker.

6 days agogas: move obj_begin earlier
Alan Modra [Fri, 23 Jan 2026 23:22:40 +0000 (09:52 +1030)] 
gas: move obj_begin earlier

csky wants to set up ELF object attributes in its md_begin.

* as.c (perform_an_assembly_pass): Move obj_begin earlier.
* testsuite/gas/mmix/builtin1.d,
* testsuite/gas/mmix/builtin3.d: Adjust expected output.

6 days agofix fail of X32 DSO from x86-64 sframe.o
Alan Modra [Fri, 23 Jan 2026 23:20:57 +0000 (09:50 +1030)] 
fix fail of X32 DSO from x86-64 sframe.o

The testcase assumes binutils is configured without
--disable-separate-code.  Pass -z separate-code to generate the
expected output.

6 days agoscore: segfault on null hi16_rel_addr
Alan Modra [Fri, 23 Jan 2026 23:19:29 +0000 (09:49 +1030)] 
score: segfault on null hi16_rel_addr

On a fuzzed input object we hit a segfault when a LO16 reloc doesn't
have the required preceding HI16 reloc.

move score static hi16_rel_addr to elf_section_data, and check that
it is non-NULL before dereferencing.

6 days agoasan: mips ecoff integer overflow
Alan Modra [Fri, 23 Jan 2026 07:47:06 +0000 (18:17 +1030)] 
asan: mips ecoff integer overflow

Silence an inconsequential oss-fuzz complaint.

* ecofflink.c (lookup_line): Make lineno unsigned to avoid
integer overflow.  Sign extend without a conditional.

6 days agoAutomatic date update in version.in
GDB Administrator [Sat, 24 Jan 2026 00:00:06 +0000 (00:00 +0000)] 
Automatic date update in version.in

6 days agosframe: doc: minor typos and cosmetic fixes
Indu Bhagat [Fri, 23 Jan 2026 22:59:11 +0000 (14:59 -0800)] 
sframe: doc: minor typos and cosmetic fixes

libsframe/
* doc/sframe-spec.texi: Minor edits.

6 days agolibsframe: rename sframe_fre_* internal APIs to use data word instead of offset
Indu Bhagat [Fri, 23 Jan 2026 22:21:56 +0000 (14:21 -0800)] 
libsframe: rename sframe_fre_* internal APIs to use data word instead of offset

Rename three internal functions:
  - sframe_fre_get_offset_count to sframe_fre_get_dataword_count
  - sframe_fre_get_offset_size to sframe_fre_get_dataword_size
  - sframe_fre_offset_bytes_size to sframe_fre_datawords_bytes_size.

libsframe/
* sframe.c: Rename functions and variables.

6 days agolibsframe: rename flip_fre_stack_offsets to flip_fre_datawords
Indu Bhagat [Fri, 23 Jan 2026 22:21:35 +0000 (14:21 -0800)] 
libsframe: rename flip_fre_stack_offsets to flip_fre_datawords

Also adjust function level comment for flip_fre_datawords.

libsframe/
* sframe.c (flip_fre_stack_offsets): Rename to
flip_fre_datawords.

6 days agolibsframe: rename offset in user-facing sframe_frame_row_entry struct
Indu Bhagat [Fri, 23 Jan 2026 22:21:15 +0000 (14:21 -0800)] 
libsframe: rename offset in user-facing sframe_frame_row_entry struct

This patch is the first patch to align libsframe with the terminology
change of moving from 'offset' to 'data word'.  With the introduction of
flexible FDE type SFRAME_FDE_TYPE_FLEX, the variable-length data
following an SFrame FRE header can now represent signed offsets or
unsigned control data. Consequently, 'data word' is adopted as the more
generic term.

This change updates the names used in the user-facing
sframe_frame_row_entry structure.  While some API function names remain
unchanged to preserve existing contracts, the underlying data buffers
and size macros now reflect the data word' terminology.

libsframe is a tricky spot for such a terminology change: some of APIs
are still used to read (may be followed by endian swap) for dumping
SFrame V2 sections in textual format.  Some classic examples are
sframe_decode_fre, and flip_fre (both are static functions).  But moving
forward, using the term 'data word' for such APIs and their internal too
may be better.  Subsequent commits will achieve just that.

include/
* sframe-api.h (MAX_NUM_DATAWORDS): Rename from
MAX_NUM_STACK_OFFSETS.
(MAX_DATAWORD_BYTES): Rename from MAX_OFFSET_BYTES.
(struct sframe_frame_row_entry): Rename fre_offsets to
fre_datawords.
libsframe/
* sframe.c (sframe_fre_sanity_check_p): Use MAX_NUM_DATAWORDS.
(sframe_get_fre_offset): Update internal pointers to use
'offsets' and access fre_datawords.
(sframe_get_fre_udata): Rename local variables to
dataword_cnt/dataword_size and update to use
SFRAME_FRE_DATAWORD_* constants.
(sframe_decode_fre): Use fre_datawords and MAX_DATAWORD_BYTES.
(sframe_encoder_add_fre): Use fre_datawords.
(sframe_encoder_write_fre): Use fre_datawords.

6 days agoinclude: gas: sframe: fix terminology from offset to data word
Indu Bhagat [Fri, 23 Jan 2026 22:20:54 +0000 (14:20 -0800)] 
include: gas: sframe: fix terminology from offset to data word

In SFrame V3, with the addition of flexible FDE type, the
variable-length array of bytes trailing the SFrame FRE header are no
longer exclusively interpreted as signed offsets. This data can now
include unsigned control data, unsigned padding word data or signed
offset data. Consequently, using the term "offsets" to describe this
trailing data is inaccurate and can be confusing.

This patch switches the terminology to 'Data Word' across the assembler
and the SFrame header file. Note that, the term 'Word' is used
colloquially here, the actual size (1, 2, or 4 bytes) remains determined
by the applicable bits in the FRE info byte.

gas/
* gen-sframe.c: Rename SFrame FRE 'offset' to 'data word'.
include/
* sframe.h (SFRAME_FRE_DATAWORD_1B, SFRAME_FRE_DATAWORD_2B,
SFRAME_FRE_DATAWORD_4B): New constants.
(struct sframe_fre_info): Update bitfield documentation.
(SFRAME_V3_FRE_DATAWORD_COUNT): New macro.
(SFRAME_V3_FRE_DATAWORD_SIZE): New macro.

6 days agosframe: doc: terminology change from offset to data word
Indu Bhagat [Fri, 23 Jan 2026 22:20:33 +0000 (14:20 -0800)] 
sframe: doc: terminology change from offset to data word

ChangeLog:
* libsframe/doc/sframe-spec.texi

6 days agoSimplify cp_print_class_member
Tom Tromey [Sun, 23 Apr 2023 15:58:14 +0000 (09:58 -0600)] 
Simplify cp_print_class_member

I noticed that cp_print_class_member's calling convention can be
simplified.  In particular it seems cleaner for it to simply take a
value and a stream; and the "prefix" argument is only ever set to one
value.

This version also renames the function, to indicate a bit more clearly
what it actually does.

Regression tested on x86-64 Fedora 40.

Reviewed-By: Keith Seitz <keiths@redhat.com>
7 days agoAdd aarch64-windows support
Hannes Domani [Fri, 23 Jan 2026 19:07:04 +0000 (20:07 +0100)] 
Add aarch64-windows support

This makes most debugging work, except unwinding doesn't always work
from inside dlls where no debug info is available, because SEH unwinding
is not implemented.

The number of available hardware breakpoints is taken from
ID_AA64DFR0_EL1 (registry key "CP 4028").
As for hardware watchpoints, even though ARM64_MAX_WATCHPOINTS is 2,
testing showed that only 1 ever works, so it's fixed to that value.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Approved-By: Tom Tromey <tom@tromey.com>
7 days agoMove setting size of long to windows-tdep
Hannes Domani [Fri, 23 Jan 2026 19:07:04 +0000 (20:07 +0100)] 
Move setting size of long to windows-tdep

It's 32bit for all (non-cygwin) Windows ABIs.

Approved-By: Tom Tromey <tom@tromey.com>
7 days agoMove auto_wide_charset gdbarch method to windows-tdep
Hannes Domani [Fri, 23 Jan 2026 19:07:04 +0000 (20:07 +0100)] 
Move auto_wide_charset gdbarch method to windows-tdep

It's UTF-16 for all Windows ABIs.

Approved-By: Tom Tromey <tom@tromey.com>
7 days agoMove software breakpoint recognition code into x86-windows-nat.c
Hannes Domani [Fri, 23 Jan 2026 19:07:04 +0000 (20:07 +0100)] 
Move software breakpoint recognition code into x86-windows-nat.c

Approved-By: Tom Tromey <tom@tromey.com>
Reviewed-By: Christina Schimpe <christina.schimpe@intel.com>
7 days agoMove x86 selector code into x86-windows-nat.c
Hannes Domani [Fri, 23 Jan 2026 19:07:04 +0000 (20:07 +0100)] 
Move x86 selector code into x86-windows-nat.c

Approved-By: Tom Tromey <tom@tromey.com>
Reviewed-By: Christina Schimpe <christina.schimpe@intel.com>
7 days agoMove x86 register code into x86-windows-nat.c
Hannes Domani [Fri, 23 Jan 2026 19:07:04 +0000 (20:07 +0100)] 
Move x86 register code into x86-windows-nat.c

Reviewed-By: Christina Schimpe <christina.schimpe@intel.com>
Approved-By: Tom Tromey <tom@tromey.com>
7 days agoMove x86 debug registers and related code into x86-windows-nat.c
Hannes Domani [Fri, 23 Jan 2026 19:07:04 +0000 (20:07 +0100)] 
Move x86 debug registers and related code into x86-windows-nat.c

Approved-By: Tom Tromey <tom@tromey.com>
7 days agoCreate x86-windows-nat.c
Hannes Domani [Fri, 23 Jan 2026 19:07:04 +0000 (20:07 +0100)] 
Create x86-windows-nat.c

Also creates the x86_windows_per_inferior and x86_windows_nat_target
derived classes in there which will then hold the arch-specific data and
function overrides.

Approved-By: Tom Tromey <tom@tromey.com>
7 days agoMove struct declarations into windows-nat.h
Hannes Domani [Fri, 23 Jan 2026 19:07:04 +0000 (20:07 +0100)] 
Move struct declarations into windows-nat.h

This is done as preparation for aarch64-windows-nat, since both x86 and
aarch64 will use them as base (after the x86 parts are split off into
x86-windows-nat).

Approved-By: Tom Tromey <tom@tromey.com>
7 days agoSimplify windows_nat_target::resume
Hannes Domani [Fri, 23 Jan 2026 19:07:04 +0000 (20:07 +0100)] 
Simplify windows_nat_target::resume

Now the thread context is only needed for setting the trace bit, so move
the rest out of the with_context lambda.

Approved-By: Tom Tromey <tom@tromey.com>
Reviewed-By: Christina Schimpe <christina.schimpe@intel.com>
7 days agoRemove duplicate code from windows_nat_target::resume
Hannes Domani [Fri, 23 Jan 2026 19:07:04 +0000 (20:07 +0100)] 
Remove duplicate code from windows_nat_target::resume

Updating the debug registers and calling SetThreadContext is already
done in windows_continue, called directly afterwards, so this removes it
from windows_nat_target::resume.

Approved-By: Tom Tromey <tom@tromey.com>
7 days agoSome cleanups to "pretend language" handling
Tom Tromey [Sat, 22 Nov 2025 18:03:57 +0000 (11:03 -0700)] 
Some cleanups to "pretend language" handling

I noticed that the "pretend language" handling in the DWARF reader
doesn't work as intended; the problem code in dwarf2_per_cu::set_lang
is:

  if (unit_type () == DW_UT_partial)
    return;

The issue here is that this subverts the very purpose of having a
"pretend" language.

Some background: when Jakub wrote dwz, we also added support for this
style of DWARF compression to gdb.  Now, dwz only shares DIEs in a
"top level" way -- i.e., at the time (and as far as I know, continuing
to today), it would not emit a DW_TAG_imported_unit inside a
namespace.  So, when implementing this we also implemented an
optimization, namely that gdb would not re-read every imported unit a
la '#include', but instead would make symtabs for each included unit
(partial units didn't yet exist).

However, an imported/partial unit might not have a language -- but a
language is necessary for interpreting the DIEs.  This is where the
"pretend" language comes from.  When reading a CU, any included
partial units that do not have a language of their own will inherit
that CU's language.

This patch started by removing the DW_UT_partial check.  This of
course caused assertion failures in some modes, as set_lang also
asserts that the language cannot change.  But, it's possible for a CU
to be prepared multiple times, and for different invocations to
provide different languages.

This is not a scenario we allowed for in the early days.  Nowadays,
though, it seems to me that it's basically fine in practice, with the
reason being that sharing DIEs that differ semantically but not
syntactically across different languages is hard to achieve.

We do see this some cross-language sharing in a limited way -- "dwz
-5" will emit inclusions from both C and C++ CUs for the
gdb.fortran/mixed-lang-stack.exp test -- but note that this sharing is
limited to things that are common between C and C++, like "float".

Therefore this patch replaces the assertions in set_lang with some
compare-exchanges.

Finally I changed cutu_reader to use a std::optional for the pretend
language.  I think this makes it more clear what is happening.  And,
while doing this I found a spot in the cooked indexer where
language_minimal was passed in, but where the importing CU's language
should have been used.

I regression tested this on x86-64 Fedora 40 using the default board,
plus the cc-with-gdb-index, cc-with-debug-names, and cc-with-dwz-5
boards.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33661

7 days agoUpdate black to 26.1.0
Tom Tromey [Thu, 22 Jan 2026 20:41:02 +0000 (13:41 -0700)] 
Update black to 26.1.0

"pre-commit autoupdate" suggests a new version of black.  This version
seems to want to change how destructuring assignments are formatted.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
7 days agoaarch64 test: fix clashing test name
Matthieu Longo [Fri, 23 Jan 2026 11:30:37 +0000 (11:30 +0000)] 
aarch64 test: fix clashing test name

7 days agofix build failures due to incorrect format specifier for uint64_t
Matthieu Longo [Thu, 22 Jan 2026 15:15:05 +0000 (15:15 +0000)] 
fix build failures due to incorrect format specifier for uint64_t

7 days agoReword the section of the AI Acceptance Policy that refers to labelling submissions.
Nick Clifton [Fri, 23 Jan 2026 10:47:06 +0000 (10:47 +0000)] 
Reword the section of the AI Acceptance Policy that refers to labelling submissions.

7 days agogdb/tui: return std::string from tui_get_function_from_frame
Andrew Burgess [Thu, 22 Jan 2026 14:09:37 +0000 (14:09 +0000)] 
gdb/tui: return std::string from tui_get_function_from_frame

Update tui_get_function_from_frame to return a std::string rather than
a pointer into a static buffer.

The value returned from tui_get_function_from_frame is passed to
tui_location_tracker::set_location, which already stores the data in a
std::string; this just moves the string creation earlier.

I don't think there was anything particularly wrong with the old code,
but I'm not a huge fan of returning data in static buffers unless
there's a really good reason, and it doesn't feel like there's a
really good reason in this case.

The current approach in tui_get_function_from_frame is to call
print_address_symbolic, and then to pull the function name from the
result.  There is an argument that this approach could be improved,
but I've not done that in this commit, nor do I plan to do that any
time soon.  As such the new code should do exactly what the old code
did.

There should be no user visible changes after this commit.

Approved-By: Tom Tromey <tom@tromey.com>
7 days agold: bring vfinfo() in parity with printf() for format specifiers ll[d|i|x]
Matthieu Longo [Thu, 22 Jan 2026 17:34:39 +0000 (17:34 +0000)] 
ld: bring vfinfo() in parity with printf() for format specifiers ll[d|i|x]

vfinfo() does not currently support the double-'l' ('ll') length
modifier for 'd', 'u', and 'x' conversion specifiers. This caused
incorrect behavior when using PRI[d|u|x][32|64] on some platforms,
and is error-prone for developers who reasonably expect
printf-compatible semantics.

This patch adds support for ll[d|u|x] to align vfinfo() with printf()
and improve portability and robustness.

7 days agobinutils: testsuite: Fix is_elf_format indentation
Rainer Orth [Fri, 23 Jan 2026 10:18:54 +0000 (11:18 +0100)] 
binutils: testsuite: Fix is_elf_format indentation

One line in is_elf_format isn't indented correctly.

Fixed thus.

Tested on x86_64-pc-linux-gnu.

2026-01-23  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

binutils:
* testsuite/lib/binutils-common.exp (is_elf_format): Fix
indentation.

7 days agogdb: Document recent enhancements when using Windows Terminal
Eli Zaretskii [Fri, 23 Jan 2026 08:02:37 +0000 (10:02 +0200)] 
gdb: Document recent enhancements when using Windows Terminal

* gdb/NEWS:
* gdb/doc/gdb.texinfo (Output Styling): Document support for
24-bit colors and UTF-8 output, including emoji styling.

7 days agox32: Allow R_X86_64_PC64 for SFrame V3
H.J. Lu [Sun, 18 Jan 2026 01:24:48 +0000 (09:24 +0800)] 
x32: Allow R_X86_64_PC64 for SFrame V3

SFrame V3 generates R_X86_64_PC64 relocation, instead of R_X86_64_PC32,
in .sframe section for x86-64.  Although x32 doesn't support SFrame,
.sframe section can be found in x32 object converted from x86-64 object
with objcopy, which only changes the ELF file class from ELFCLASS64 to
ELFCLASS32 with all section contents unchanged.

Update elf_x86_64_scan_relocs to allow R_X86_64_PC64 for x32 so that
x32 object file with .sframe section can be used as x32 linker input.

bfd/

PR ld/33807
* elf64-x86-64.c (elf_x86_64_scan_relocs): Allow R_X86_64_PC64
for x32.

ld/

PR ld/33807
* testsuite/ld-x86-64/sframe.rd: New file.
* testsuite/ld-x86-64/sframe.s: Likewise.
* testsuite/ld-x86-64/x86-64.exp: Run PR ld/33807 tests.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
7 days ago[gdb/testsuite] Force elf headers in linux core dump
Tom de Vries [Fri, 23 Jan 2026 06:54:32 +0000 (07:54 +0100)] 
[gdb/testsuite] Force elf headers in linux core dump

I've got a test setup consisting of a chromebook with a MediaTek MT8183
processor, running Debian userland with a custom kernel [1].

The custom kernel doesn't have CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS enabled,
and consequently the default coredump_filter is 0x23 instead of 0x33, in other
words bit 4 (which enables the dumping of ELF headers) is not set.

The testsuite relies on the dumping of ELF headers in core files to get the
build-ID of the executable and shared libraries, and consequently some
test-cases fail.

Fix this in core_find, by adding bit 4 in the coredump_filter, if necessary.

Fixes test-cases:
- gdb.base/corefile-exec-mismatch.exp
- gdb.base/corefile-find-exec.exp
- gdb.debuginfod/corefile-mapped-file.exp
- gdb.debuginfod/solib-with-soname.exp
- gdb.python/py-corefile.exp
- gdb.python/py-missing-objfile.exp

Tested on aarch64-linux.

Reviewed-By: Keith Seitz <keiths@redhat.com>
PR testsuite/33772
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33772

[1] https://github.com/hexdump0815/linux-mainline-mediatek-mt81xx-kernel

7 days agoAutomatic date update in version.in
GDB Administrator [Fri, 23 Jan 2026 00:00:07 +0000 (00:00 +0000)] 
Automatic date update in version.in

7 days agohppa64: Implement support for DT_TEXTREL
John David Anglin [Thu, 22 Jan 2026 22:16:50 +0000 (17:16 -0500)] 
hppa64: Implement support for DT_TEXTREL

This fixes ld-elf/pr19539, DT_TEXTREL in shared lib, and DT_TEXTREL
map file warning tests on hppa64.

2026-01-22  John David Anglin  <danglin@gcc.gnu.org>

bfd/ChangeLog:

* elf64-hppa.c (allocate_dynrel_entries): Set DF_TEXTREL
if it isn't already set and we encounter a relocation
against a readonly section.
(elf64_hppa_late_size_sections): Add DT_TEXTREL dynamic
entry if we have relocs and DF_TEXTREL is set in info->flags.

7 days agoFix typo in fetch-exec-and-args.exp
Tom Tromey [Thu, 22 Jan 2026 20:39:36 +0000 (13:39 -0700)] 
Fix typo in fetch-exec-and-args.exp

pre-commit points out a typo in this file.

8 days agold: testsuite: Enable ld-sparc tests on Solaris
Rainer Orth [Thu, 22 Jan 2026 20:02:32 +0000 (21:02 +0100)] 
ld: testsuite: Enable ld-sparc tests on Solaris

The ld-sparc tests aren't currently run on Solaris to avoid PR
binutils/27666.  This has been fixed, so they can be enabled there, too.

Tested no sparc{v9,}-sun-solaris2.11 and sparc{64,}-unknown-linux-gnu.

2026-01-17  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

ld:
* testsuite/ld-sparc/sparc.exp: Run sparctests, sparc64tests on
Solaris.

8 days agogas: sframe: graceful handling of bogus sleb128 input
Indu Bhagat [Wed, 21 Jan 2026 20:00:22 +0000 (12:00 -0800)] 
gas: sframe: graceful handling of bogus sleb128 input

Currently, sframe_xlate_escape_sleb128_to_offsetT () uses a gas_assert
to sanity check that a DWARF sleb128 value was successfully read from a
single-byte buffer. However, if the byte provided has the highest bit
set (e.g., bogus input of 0x80), the value of 'read' variable will be 0,
triggering an assertion failure.  This concern was raised during the
review of SFrame-V3 patches
https://inbox.sourceware.org/binutils/807b5641-87c2-4109-9d33-bb8fa28ed5ef@suse.com/T/#u

Change the internal API sframe_xlate_escape_sleb128_to_offsetT () to return
an error code. Callers now check for SFRAME_XLATE_ERR_INVAL and proceed
to a warning/exit path rather than aborting.

gas/
* gen-sframe.c (sframe_xlate_escape_sleb128_to_offsetT): Return int
status. Handle read failure gracefully.
(sframe_xlate_do_escape_cfa_expr): Check returned error code of
read_sleb128_to_int64 and jump to warn_and_exit on error.
(sframe_xlate_do_escape_expr): Likewise.

8 days agoConstify gdbserver "monitor" commands
Tom Tromey [Sat, 18 Apr 2020 19:25:51 +0000 (13:25 -0600)] 
Constify gdbserver "monitor" commands

I noticed that the gdbserver "monitor" commands should take a const
parameter.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
8 days agogdb/testsuite: fix failure in gdb.server/fetch-exec-and-args.exp
Andrew Burgess [Wed, 14 Jan 2026 19:31:24 +0000 (19:31 +0000)] 
gdb/testsuite: fix failure in gdb.server/fetch-exec-and-args.exp

Bug PR gdb/33792 reported a gdb.server/fetch-exec-and-args.exp FAIL
when using the native-gdbserver board:

  FAIL: gdb.server/fetch-exec-and-args.exp: packet=on: set_remote_exec=false: test_server_with_no_exec: show remote exec-file

The actual test output looks like this:

  (gdb) show remote exec-file
  The remote exec-file is unset, using automatic value "/tmp/build/gdb/testsuite/outputs/gdb.server/fetch-exec-and-args/fetch-exec-and-args".
  (gdb) FAIL: gdb.server/fetch-exec-and-args.exp: packet=on: set_remote_exec=false: test_server_with_no_exec: show remote exec-file

This test actually fails with native-gdbsever and
native-extended-gdbserver boards.  The problem is that these boards
clear the sysroot.

This exact test has the following conditions:

  + The qExecAndArgs is in use (see 'packet=on').

  + We're not explicitly doing 'set remote exec-file ...' (see
    'set_remote_exec=false').

  + The test starts gdbserver without an executable (see
    'test_server_with_no_exec').

  + And because of the native-gdbsever board, the sysroot is "".

What this means is that GDB knows that gdbserver doesn't have an
executable thanks to qExecAndArgs, the user hasn't set an executable
for GDB to use when starting a new inferior, but GDB does know that
GDB and gdbserver can see the same filesystem due to the sysroot
setting.  GDB will then automatically use the current executable as
the remote executable name.  The test script doesn't expect this case,
and so the test fails.

Fix this by adjusting the script to expect the 'using automatic value
...' text when appropriate.

I also extended the test_server_with_no_exec proc to take a new flag
'clear_sysroot', we now run the test with the sysroot set to 'target:'
and with the sysroot set to "", even when using the 'unix' board.

Additionally, I ran the test through check-all-boards and found one
additional failure, when using --host_board=local-remote-host-native
and --target_board=local-remote-host-native.  In this case GDB copies
the executable to the remote host, which changes its filename.  When
the filename appears in the 'using automatic value ...' text, I was
expecting the filename assuming a local host.

I could fix this, but it doesn't seem worth the extra complexity for
this one test, so I've just set the test to be skipped for that one
configuration.

Now, when using check-all-boards, I'm seeing no failures.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33792

Approved-By: Simon Marchi <simon.marchi@efficios.com>
8 days agobfd: Use PRIu64 to print uint64_t in elf-attrs.c
Rainer Orth [Thu, 22 Jan 2026 15:21:00 +0000 (16:21 +0100)] 
bfd: Use PRIu64 to print uint64_t in elf-attrs.c

elf-attrs.c has two more errors when built on 32-bit hosts:

In file included from bfd/elf-attrs.c:140:
bfd/elf-attrs.c: In function β€˜oav2_parse_subsection’:
bfd/elf-attrs.c:2752:29: error: format β€˜%lu’ expects argument of type β€˜long unsigned int’, but argument 4 has type β€˜uint64_t’ {aka β€˜long long unsigned int’} [-Werror=format=]
 2752 |       _bfd_error_handler (_("%pB: error: bad subsection length (%u > max=%lu)"),

In file included from bfd/sysdep.h:165,
                 from bfd/elf-attrs.c:140:
bfd/elf-attrs.c: In function β€˜_bfd_elf_parse_attributes’:
bfd/elf-attrs.c:2910:12: error: format β€˜%lld’ expects argument of type β€˜long long int’, but argument 4 has type β€˜bfd_size_type’ {aka β€˜unsigned int’} [-Werror=format=]
 2910 |         (_("%pB: error: attribute section '%pA' too big: %" PRId64),

Fixed like this.

Tested on sparc-sun-solaris2.11, i386-pc-solaris2.11, and i686-pc-linux-gnu
with --enable-64-bit-bfd.

2026-01-22  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

bfd:
* elf-attrs.c (oav2_parse_subsection): Use PRIu64 to print
uint64_t.
(_bfd_elf_parse_attributes): Use PRIu64.
Cast bfd_size_t arg to uint64_t.

8 days agogdb: pagination fix for emoji and unicode box output
Andrew Burgess [Mon, 12 Jan 2026 16:36:36 +0000 (16:36 +0000)] 
gdb: pagination fix for emoji and unicode box output

I noticed that, on a 24 line terminal, the new unicode boxed hint text
was causing the pager to trigger unexpectedly:

  $ gdb -nx -nh
  GNU gdb (GDB) 18.0.50.20260107-git
  Copyright (C) 2026 Free Software Foundation, Inc.
  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  This is free software: you are free to change and redistribute it.
  There is NO WARRANTY, to the extent permitted by law.
  Type "show copying" and "show warranty" for details.
  This GDB was configured as "x86_64-pc-linux-gnu".
  Type "show configuration" for configuration details.
  For bug reporting instructions, please see:
  <https://www.gnu.org/software/gdb/bugs/>.

  β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”“
  β”ƒ Find the GDB manual online at:                                            β”ƒ
  β”ƒ http://www.gnu.org/software/gdb/documentation/.                           β”ƒ
  β”ƒ For help, type "help".                                                    β”ƒ
  β”ƒ Type "apropos <word>" to search for commands related to <word>.           β”ƒ
  --Type <RET> for more, q to quit, c to continue without paging--

At this point there are 6 unused lines remaining in my terminal, so
the pager should not have triggered yet.

There are two problems here, both in pager_file::puts (in utils.c).
Lets start with the easy problem first.  When content is written to
the pager_file we process it within a loop looking for a newline
character.  We handle some special cases, but if none of them apply we
handle all general, printable, content with this block:

  else
    {
      m_wrap_buffer.push_back (*linebuffer);
      chars_printed++;
      linebuffer++;
    }

This copies one byte from LINEBUFFER to M_WRAP_BUFFER, and increments
CHARS_PRINTED.  The problem is that the unicode box characters are
multi-byte, this means we are over incrementing CHARS_PRINTED by
counting each byte of the unicode character as one output character.

GDB believes that the top line of the box is actually going to span
over multiple screen lines due to the large number of bytes within the
line.  In reality of course, the multi-byte characters fill exactly
one screen line.

I propose fixing this by making use of mbrlen to spot multi-byte
characters and count them as a single character.

If mbrlen returns anything less than 1 (which indicates a null
character, or an invalid character), then I just treat this as a
single byte character and continue as before.  This means if any
"weird" output is sent to the pager then it will still be printed.

The null wide character case shouldn't occur as the null wide
character is still all zeros, which the outer control loop in ::puts
should catch, so all I'm really concerned about is the invalid wide
character case.

Handling multi-byte wide characters does make things a little better,
but doesn't fix everything.  The pager still activates unnecessarily,
but just a little later.  On the same 80x24 terminal, the output is
now:

  $ gdb -nx -nh
  GNU gdb (GDB) 18.0.50.20260107-git
  Copyright (C) 2026 Free Software Foundation, Inc.
  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  This is free software: you are free to change and redistribute it.
  There is NO WARRANTY, to the extent permitted by law.
  Type "show copying" and "show warranty" for details.
  This GDB was configured as "x86_64-pc-linux-gnu".
  Type "show configuration" for configuration details.
  For bug reporting instructions, please see:
  <https://www.gnu.org/software/gdb/bugs/>.

  β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”β”“
  β”ƒ Find the GDB manual online at:                                            β”ƒ
  β”ƒ http://www.gnu.org/software/gdb/documentation/.                           β”ƒ
  β”ƒ For help, type "help".                                                    β”ƒ
  β”ƒ Type "apropos <word>" to search for commands related to <word>.           β”ƒ
  β”—━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
  --Type <RET> for more, q to quit, c to continue without paging--

We managed to get an extra line of output printed, but there is still
enough room on the terminal to print everything, so why is the pager
triggering?

The problem now is how we deal with lines that entirely fill the
terminal, and how we handle newlines.

Within the pager_file::puts inner loop we process input from
LINEBUFFER and copy it to the M_WRAP_BUFFER, incrementing
CHARS_PRINTED as we do.  This continues until we reach the end of
LINEBUFFER, or until we reach a newline within LINEBUFFER.

After each character is added to M_WRAP_BUFFER, we check CHARS_PRINTED
to see if we have filled a line.  If we have then we flush
M_WRAP_BUFFER and increment LINES_PRINTED.  If enough lines have now
been printed then we activate the pager.

Alternatively, if we encounter a newline character in LINEBUFFER then
we flush M_WRAP_BUFFER and increment LINES_PRINTED, then we re-enter
the inner loop, which includes performing a check to see if the pager
should trigger.

The problem here is that when we print the box, we entirely fill a
screen line, and then print the newline character.  When we print the
final non-newline character then this is enough to trigger the line
full logic, this flushes the line and increments LINES_PRINTED.  The
CHARS_PRINTED count is also reset to zero.

Then we print the newline.  This never enters the inner loop, but just
goes straight to the newline handling code, which increments
LINES_PRINTED and also resets CHARS_PRINTED to zero.

Notice that we've now incremented LINES_PRINTED twice.  This is the
cause of the premature pager activation; lines that are exactly one
screen width wide end up being double counted.

My initial thoughts when trying to fix this were to move the full line
check before the code which copies content from LINEBUFFER to
M_WRAP_BUFFER, inside the pager_file::puts inner loop.  This would
mean we only check for a full line when processing the next byte of
output after we've filled a screen line, but we'd never encounter this
check if the first byte after a full screen line was the newline
character, as in this case we'd never enter the inner loop.

And this does indeed fix the immediate problem, but I think, is still
not correct.

On an 80 character wide terminal, what we actually care about, is when
we try to add the 81st _printable_ character.  If the 81st character
was a tab then this doesn't wrap onto the next line.  Or if the 81st
character was \r, then this certainly doesn't wrap to a new line, it
just resets the current line.  And the same is true for the 82nd
character, and so on.  The only time we need to trigger a new screen
line is when we try to actually print something that will be displayed
to the user.

It turns out, I think, that we only want to check for a full line
inside the block that I mentioned above, the one I just updated to use
mbrlen.  This is the only place where printable content is copied from
LINEBUFFER into M_WRAP_BUFFER.

There are still some edge cases here that are not being handled
correctly, some unicode characters are non-printable, or stack on the
previous character, requiring zero width.  And even some of the basic
ASCII characters that we don't cover are non-printable.  But I'm
choosing to ignore all of these for now.  These cases were broken
before this patch, and continue to be broken afterwards.  Broken here
simply means that including these characters in GDB's output will
confuse the pager, likely resulting in the pager triggering too
early.

But for printable characters that are 1 terminal character wide,
things should now be a little better.  The pager will trigger only
when we try to add the first character that wraps onto the next screen
line.  In our original problem with the box, this means that when the
top border of the box is printed this will no longer cause an
increment of LINES_PRINTED.  When the newline is added then this does
finish off the current line and increments LINES_PRINTED as expected.
We now only increment LINES_PRINTED once for each line of the box,
rather than twice, and so the pager no longer needs to trigger during
startup.

To make the code cleaner, I moved the full line check into a new
function, pager_file::check_for_overfull_line(), and added comments in
the LINEBUFFER handling code to explain when the new function should
be called.

The test gdb.python/py-color-pagination.exp needed some updates after
this patch, the current expected output was tied to how the pager used
to operate.  Now that we defer starting a newline until we see some
printable characters GDB is better able to coalesce adjacent style
changes, this accounts for the large volume of changes to this test.

I've also added a couple of new tests to the
gdb.python/py-color-pagination.exp file.  An initial failed idea I had
for fixing this problem caused a bug such that empty lines would never
have triggered the pager, there's a new test that covers this case.
There's also a test that lines can exceed the screen width so long as
the extra content is non-printable; the test fills a line then prints
some tabs and a '\r' before filling the same line a second time.

There are also a couple of new pager self tests that I added.  I wrote
these because early on while investigating this issue, I thought I'd
spotted a bug in pager_file::wrap_here, so I wrote these tests to
expose that bug.  It turned not to be a bug, but a gap in my
understanding.  I think retaining these tests isn't going to hurt, and
increases coverage.

Approved-By: Tom Tromey <tom@tromey.com>
8 days ago[gdb/build] Declare gdb_get_ncolors
Tom de Vries [Thu, 22 Jan 2026 13:12:15 +0000 (14:12 +0100)] 
[gdb/build] Declare gdb_get_ncolors

Since a recent commit, I run into:
....
gdb/ui-style.c: In lambda function:
gdb/ui-style.c:597:20: error: β€˜gdb_get_ncolors’ was not declared in this scope
  597 |       int colors = gdb_get_ncolors ();
      |                    ^~~~~~~~~~~~~~~
make: *** [Makefile:2096: ui-style.o] Error 1
....

Fix this by adding the missing declaration.

8 days agobfd: use correct format specifier for uint64_t
Matthieu Longo [Thu, 22 Jan 2026 12:55:07 +0000 (12:55 +0000)] 
bfd: use correct format specifier for uint64_t

8 days agobinutils: Fix broken bullet lists in objcopy documentation
Thiago C Silva [Thu, 22 Jan 2026 11:05:07 +0000 (12:05 +0100)] 
binutils: Fix broken bullet lists in objcopy documentation

The documentation for --add-gnu-debuglink and --extract-symbol
uses diverse formatting styles for list items, including @table and
manual bullets. This looked broken in the generated man pages, showing
raw text artifacts like "*<..>" instead of real bullet points.

This patch unifies these sections to use @itemize @bullet, resulting in
cleaner output and better readability for these options.

binutils/
        * doc/binutils.texi (objcopy): Use @itemize @bullet
        for --add-gnu-debuglink and --extract-symbol.

8 days agobinutils: Fix broken numbering in strip/objcopy --only-keep-debug doc
Thiago C Silva [Thu, 22 Jan 2026 11:03:43 +0000 (12:03 +0100)] 
binutils: Fix broken numbering in strip/objcopy --only-keep-debug doc

The documentation for --only-keep-debug displayed the procedure steps as
"1. 1. 1. 1." in the man pages, despite using the @enumerate command.

This patch moves the item text to the line following the @item tag and
adds whitespace between items. This forces the man page generator to
correctly distinguish the items and increment the list counter.

binutils/
        * doc/binutils.texi (strip, objcopy): Reformat @enumerate list
        to fix man page numbering.

8 days agogdb: Support UTF-8 output on MS-Windows terminal
Eli Zaretskii [Thu, 22 Jan 2026 11:03:13 +0000 (13:03 +0200)] 
gdb: Support UTF-8 output on MS-Windows terminal

This detects when the Windows Terminal uses codepage 65001
(a.k.a. "UTF-8") for output, and sets the default host
charset to UTF-8 in that case.  It also enables Emoji
styling, as the Windows terminal supports it in that case.

* gdb/charset.c (INIT_GDB_FILE) [USE_WIN32API]: If the Windows
console uses codepage 65001, set default host charset to UTF-8, and
switch to the "C" locale, to prevent Windows from interpreting UTF-8
sequences written to the console.
* gdb/mingw-hdep.c (windows_initialize_console): Don't disable Emoji
here...
* gdb/charset.c (INIT_GDB_FILE) [USE_WIN32API]: ...disable them here
instead, and only if the console doesn't use UTF-8.

8 days agogdb: Support 24-bit colors and other attributes on MS-Windows
Eli Zaretskii [Thu, 22 Jan 2026 10:43:38 +0000 (12:43 +0200)] 
gdb: Support 24-bit colors and other attributes on MS-Windows

This enables Virtual Terminal Sequences on MS-Windows consoles
when they are supported.  (All modern Windows versions since
v10 support that.)  This allows to support 24-bit true-color
and also other text attributes, like "dim" and "underline".

* gdb/mingw-hdep.c (mingw_use_console_color_apis): Rename from
mingw_console_initialized.
(orig_console_mode, virt_mode_flags): New static variables.
(windows_initialize_console): Setup the console for using Virtual
Terminal Sequences if that is supported.
(mingw_deinitialize_console, gdb_get_ncolors): New functions.
* gdb/ui-style.c (colorsupport): Call gdb_get_ncolors to retrieve
the number of colors supported by the terminal.  If the number of
colors is greater or equal 16777216, consider 24-bit color
supported.
* gdb/top.c (undo_terminal_modifications_before_exit) [__MINGW32__]:
Call mingw_deinitialize_console to restore original settings of the
terminal.
* gdb/posix-hdep.c (gdb_get_ncolors): New function, a trivial
wrapper for tgetnum.

8 days agolibgot-1 testcases
Alan Modra [Thu, 22 Jan 2026 02:37:51 +0000 (13:07 +1030)] 
libgot-1 testcases

There is no need for multiple tests of readelf --got-contents,
nor should the matching be so strict that changes in section layout
force editing of the testsuite.

It also looks to me that the i386 --got-contents output is wrong,
at least it is confusing to have .rel.plt show
0020020c  00000307 R_386_JUMP_SLOT   00000000   bar
while the corresponding got-contents dump shows "bar + 156".
     3: 0020020c R_386_JUMP_SLOT   bar + 156

* testsuite/ld-i386/binutils.exp: Reduce number of tests.
* testsuite/ld-i386/libgot-1.rd: New.
* testsuite/ld-i386/libgot-1a.rd,
* testsuite/ld-i386/libgot-1b.rd,
* testsuite/ld-i386/libgot-1c.rd,
* testsuite/ld-i386/libgot-1d.rd: Delete.
* testsuite/ld-x86-64/binutils.exp: Reduce number of tests.
* testsuite/ld-x86-64/libgot-1.rd: New.
* testsuite/ld-x86-64/libgot-1a.rd,
* testsuite/ld-x86-64/libgot-1b.rd,
* testsuite/ld-x86-64/libgot-1c.rd,
* testsuite/ld-x86-64/libgot-1d.rd: Delete.
* testsuite/ld-x86-64/libgot-1-x32.rd: New.
* testsuite/ld-x86-64/libgot-1a-x32.rd,
* testsuite/ld-x86-64/libgot-1b-x32.rd,
* testsuite/ld-x86-64/libgot-1c-x32.rd,
* testsuite/ld-x86-64/libgot-1d-x32.rd: Delete.

8 days agogdb: fix 'info frame' for tail calls with no debug information
Andrew Burgess [Mon, 12 Jan 2026 10:44:35 +0000 (10:44 +0000)] 
gdb: fix 'info frame' for tail calls with no debug information

If the inferior stack contains a tail call function.  And if the CU
containing the tail call function doesn't have any debug information.
And if the user uses 'info frame' to examine the tail call frame, then
GDB will report the wrong function name, for example:

  Breakpoint 1, 0x000000000040110a in callee ()
  (gdb) bt
  #0  0x000000000040110a in callee ()
  #1  0x0000000000401116 in caller ()
  #2  0x0000000000401140 in main ()
  (gdb) up
  #1  0x0000000000401116 in caller ()
  (gdb) frame
  #1  0x0000000000401116 in caller ()
  (gdb) info frame
  Stack level 1, frame at 0x7fffffffa440:
   rip = 0x401116 in dummy_func; saved rip = 0x401140
   called by frame at 0x7fffffffa450, caller of frame at 0x7fffffffa430
   Arglist at 0x7fffffffa430, args:
   Locals at 0x7fffffffa430, Previous frame's sp is 0x7fffffffa440
   Saved registers:
    rbp at 0x7fffffffa430, rip at 0x7fffffffa438
  (gdb)

Notice that 'info frame' claims that the current frame is 'dummy_func'
rather than 'caller', as the 'backtrace', 'up', and 'frame' commands
claim.

This is because 'backtrace', 'up', and 'frame' all uses print_frame to
print the frame details, which in turn uses find_frame_funname to get
the frame's function name.

In contrast, 'info_frame_command_core' contains an inlined copy of
'find_frame_funname' with one key difference.  The code in
info_frame_command_core uses get_frame_pc_if_available while
find_frame_funname uses get_frame_address_in_block_if_available.  The
latter function returns '$pc - 1' if the frame in question could be a
tail call function, while get_frame_pc_if_available always returns
$pc.  This difference means that, for a tail call function, GDB will
lookup the wrong msymbol.

Fix this by updating info_frame_command_core to use
find_frame_funname.  We end up still keeping the call to
get_frame_pc_if_available as 'info frame' still needs to print this
address.  There should be no other noticeable changes after this
commit.

There's also a test in which I have tried to create a tail call
function in a (relatively) target agnostic way.  I compile a test
program, pull some addresses from it, then recompile the test to
assembly, and augment the assembler output, changing one symbol size,
and adding an entirely new function symbol.  The modified assembly
file is then compiled, without debug information, to create the actual
test executable.  This gives GDB the impression that the test contains
a tail call function.

Approved-By: Tom Tromey <tom@tromey.com>
8 days agognu directives: bfd: generic tests for merge of gnu attributes v2
Matthieu Longo [Thu, 10 Apr 2025 15:11:02 +0000 (16:11 +0100)] 
gnu directives: bfd: generic tests for merge of gnu attributes v2

These tests are a copy-paste of the generic tests for AArch64.

Test cases:
    - only one input object is copied to the output object
    - merge two inputs with optional subsections of both types
      ULEB128 and NTBS, which contains same, additional, and
      missing attributes.
    - mismatch subsection properties.
    - combine matching required subsections.
    - combine non-matching required subsections.
    - prune unknown attributes in known subsections.
    - prune unknown subsections.

8 days agognu directives: bfd: generic tests for objcopy of gnu attributes v2
Matthieu Longo [Thu, 10 Apr 2025 16:22:51 +0000 (17:22 +0100)] 
gnu directives: bfd: generic tests for objcopy of gnu attributes v2

8 days agognu directives: gas/readelf tests for gnu attributes v2
Matthieu Longo [Thu, 10 Apr 2025 14:16:31 +0000 (15:16 +0100)] 
gnu directives: gas/readelf tests for gnu attributes v2

These tests are a copy-paste of the generic parsing tests for AArch64.

The added tests cover the parsing of the new assembly directives
(gnu_subsection and gnu_attribute), the serialization of the
Object Attributes v2 (OAv2) data into an object file, and the
dumping of those data via readelf.

The parsing tests focus on the following points:
- the syntax of the new directives.
- the recognition of generic tokens like: NTBS, ULEB128, required,
  optional.

The dumping tests focus on:
- the OAv2 population into the correct section assigned by the backend.
- the merge of the subsections and attributes when they are declared
  several times inside respectively the same compilation unit, and
  subsection.
- the sorting of OAv2 before the serialization.

8 days agognu directives: add support for .gnu_attribute and .gnu_subsection in OAv2 context
Matthieu Longo [Thu, 17 Apr 2025 17:02:38 +0000 (18:02 +0100)] 
gnu directives: add support for .gnu_attribute and .gnu_subsection in OAv2 context

This patch adds support for the GNU directives .gnu_attribute and
.gnu_subsection, used respectively for OAv1 and OAv2, and for OAv2
only. These directives behave like their AEABI counterparts, as
they are aliases intended for use by any backends supporting OAv1
and/or OAv2. Their availability is controlled by the TC_OBJ_ATTR_v1
and TC_OBJ_ATTR_v2 macros.

Previously, the "gnu_" subsection namespace was used only for
"gnu_testing_" and defaulted to a private scope. This patch updates
the scope recognition to correctly distinguish between private usage
(e.g., testing) and public usage (e.g., actual GNU subsections
storing public information).

8 days agold tests for AArch64-specific merge coverage for AEABI Build Attributes
Matthieu Longo [Tue, 25 Feb 2025 17:28:03 +0000 (17:28 +0000)] 
ld tests for AArch64-specific merge coverage for AEABI Build Attributes

Test cases:
- coverage of required subsection 'aeabi_pauthabi'.
- coverage for BTI, PAC, GCS used along GNU properties.
- warn on unknown attributes, and prune them from output.

8 days agoaarch64: merge of Object Attributes v2 during linkage
Matthieu Longo [Thu, 17 Apr 2025 09:23:08 +0000 (10:23 +0100)] 
aarch64: merge of Object Attributes v2 during linkage

This patch adds support to AArch64 backend to process AEABI Build
Attributes and raise any compatibility issue.

AArch64 backend declares 2 vendor subsections, and their associated tags:
- aeabi_feature_and_bits: contains tags that describe the same optional
  bits as the GNU_PROPERTY_AARCH64_FEATURE_1_AND. For now, the following
  attributes are recognized:
    - Tag_Feature_BTI: means that all the executable sections are
      compatible with Branch Target Identification (BTI) mechanism.
    - Tag_Feature_PAC: means that all the executable sections have been
      protected with Return Address Signing.
    - Tag_Feature_GCS: means that all the executable sections are
      compatible with the Guarded Control Stack (GCS) extension.
- aeabi_pauthabi: contains information about the Pointer Authentication
  Signing schema when the object uses an extension to ELF, PAUTHABI64,
  which is currently not supported by GCC toolchain. The pointers that
  are signed as well as the modifiers and key used for each type of
  pointer are known as the signing schema. The support of this
  subsection is there for completeness with the AEABI Build Attributes
  document, and allows readelf to dump the data nicely, and the linker
  to detect a use of a signing schema, and error.
    - Tag_PAuth_Paltform: the platform vendor id.
    - Tag_PAuth_Schema: the version numner of the schema.

For backward-compatibilty purpose, AArch64 backend translates
GNU_PROPERTY_AARCH64_FEATURE_1_AND in input files to its OAv2 equivalents.
The frozen set of OAv2 is populated with values derived from command-line
options for BTI (-z force-bti) and GCS (-z gcs=*).
It also reports incompatibilities for BTI and GCS, and set BTI PLT type
depending on the OAv2 merge result.
Regarding incompatibilities, only the ones detected in objects constituting
the output link unit will be reported. Supports for detecting incompatibilities
in shared objects might be a future work to bring it in pair with the GNU
properties merge. However, since OAv2 are translated to GNU properties,
detection will still happen so this feature seems redundant and of little
value given the backward compatibility support for GNU properties is
required (see next paragraph).
Finally, it translates OAv2s in subsection "aeabi_feature_and_bits" to
GNU_PROPERTY_AARCH64_FEATURE_1_AND as GNU properties are required for
the dynamic linker (it does not understand OAv2s yet).

8 days agold tests for generic merge coverage of Object Attributes v2
Matthieu Longo [Tue, 25 Feb 2025 17:26:57 +0000 (17:26 +0000)] 
ld tests for generic merge coverage of Object Attributes v2

Test cases:
- only one input object is copied to the output object
- merge two inputs with optional subsections of both types
  ULEB128 and NTBS, which contains same, additional, and
  missing attributes.
- mismatch subsection properties.
- combine matching required subsections.
- combine non-matching required subsections.
- prune unknown attributes in known subsections.
- prune unknown subsections.

8 days agoOAv2 merge: translate GNU properties to Object Attributes v2 (and vice versa)
Matthieu Longo [Wed, 12 Nov 2025 16:05:07 +0000 (16:05 +0000)] 
OAv2 merge: translate GNU properties to Object Attributes v2 (and vice versa)

Some input objects may contain inconsistencies, i.e. they might include
GNU properties but lack the corresponding object attributes, or inversely.
The later case is never produced by Gas, but the former can occur with
older Gas versions that do not support object attributes.

To keep consistency during the merge process, each input object's GNU
properties are translated into their object attributes equivalents (if
they exists). Also, after object attributes have been merged at the file
scope, they are translated back to GNU properties to keep the GNU
properties merge process consistent. This final translation occurs before
merging the input with the global merge accumulator (a.k.a. REF) and the
global configuration (a.k.a FROZEN).

Note: the first parameter of translate_obj_attrs_to_gnu_props(), bfd *,
should be 'const', but this implies that _bfd_elf_get_property() should
also be constified, and this is out of scope.

8 days agoOAv2 merge: prune unsupported or invalid subsections and attributes
Matthieu Longo [Fri, 14 Nov 2025 10:31:29 +0000 (10:31 +0000)] 
OAv2 merge: prune unsupported or invalid subsections and attributes

During the merge, each subsection and attribute is assigned a status.
If the status is OK, the item is retained and serialized into the
output object. Otherwise, unsupported or invalid subsections and
attributes are pruned before serialization.

When a subsection or attribute is pruned, ld emits information-level
messages to inform the user, preventing confusion about the absence
of elements that were present in the input objects.

8 days agoOAv2 merge: merging Object Attributes
Matthieu Longo [Fri, 14 Nov 2025 12:04:32 +0000 (12:04 +0000)] 
OAv2 merge: merging Object Attributes

The Object Ottributes merge process must handle both optional and
required subsections. It also treats the first merge of the frozen set
specially, as the OAv2 list in the input BFD serves as the accumulator
for subsequent merges.

** Optional subsections

Optional subsections are processed as if merging two ordered sets β€” by
iterating linearly through both, checking whether an element of a given
ordinality is present in the opposite set, and adding it to the
accumulator. The added diffuculty with subsections and attributes lies
in the fact that missing elements have default values, and these must be
merged with existing ones to produce the final value to be stored.

** Required subsections

Required subsections are processed slightly differently from the
optional subsections, as they cannot be pruned since they are mandatory,
hence an error will be raised by the linker if it is not recognized.

For now, the subsection for PAuth ABI is the only one use case, and
no merge is applied on the values. The values simply need to match.
This implementation choice might be challenged in the future if required
subsections can have the same diversity as optional subsections. If the
case arises, the refactoring to handle this new behavior should consist
in adding a new merge policy MERGE-EQUAL, or something similar. Some "if
required" should be added in the optional subsections merge logic to
error on any missing elements, or mismatch, and messages should also be
rephrased to point out that the error is for a required subsection.

** Important note regarding support for testing

In order to test this generic logic, AArch64's use cases are not
offering enough coverage, so a "GNU testing namespace" which corresponds
to the name of the subsection was introduced. It follows the following
pattern:
  gnu_testing_<XXXXXX>_MERGE_<POLICY>
with:
  - <XXXXXX>: an arbitrary name for your testing subsection.
  - <POLICY>: the name of the merging policy to apply on the values in
    the subsection. The currently supported merge policy are:
      * _MERGE_AND: bitwise AND applied on numerical values.
      * _MERGE_OR: bitwise OR applied on numerical values.
      * _MERGE_ADD: concatenates strings together with a '+' in-between.
    Note: "_MERGE_ADD" does not make really sense, and will very likely
    never be used for a real merge. Its only purpose is to test the
    correct handling of merges with strings.
Any subsection name matching neither names supported by the backend, nor
following the pattern corresponding GNU testing namespace will be considered
unknown and its status set to obj_attr_subsection_v2_unknown. This will
have for consequence the pruning of this subsection.

Additionally, the first two tags in gnu_testing namespace, GNUTestTag_0
and GNUTestTag_1, are known, and so have a name and can be initialized
to the default value ('0' or NULL) depending on the encoding specified
on the subsection. Any tags above 1 will be considered unknown, so will
be default-initialized in the same way but its status will be set to
obj_attr_v2_unknown. This behavior of the testing tags allows to test
the pruning of unknown attributes.