public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/3] Threads and BFD
@ 2023-10-26 19:07 Tom Tromey
  2023-10-26 19:07 ` [PATCH 1/3] Make _bfd_error_buf static Tom Tromey
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Tom Tromey @ 2023-10-26 19:07 UTC (permalink / raw)
  To: binutils

gdb started using threads a while ago.  So far we've (mostly) avoided
doing anything BFD-related off the main thread, but I would like to
change that.

In particular, I'd like gdb to do most of its DWARF reading in the
background.  To achieve this, gdb only really needs threading on a
per-BFD basis.  That is, all access to any particular BFD will be from
a single thread at a given time.  However, due to DWO, gdb may also
need to create a new BFD from a worker thread.

For gdb's purposes, I think only BFD globals really need to be
protected.  There are a few spots to consider.

The first is BFD error handling.  In this series, I chose to make it
thread-local.  This approach seemed simple and straightforward.
Locking seemed impractical here.  Maybe moving the error into a BFD
would work, but I didn't serious investigate that.

The second set of globals involve opening and closing BFD, and also
the fd cache.  I went back and forth on ways to solve this.  In this
series I let the BFD client provide lock- and unlock-functions, and
change BFD to use these when needed.  I took this approach because it
means that current BFD clients don't need to be changed in any way.
(I do have a variant of this patch where BFD implements its own
locking using a POSIX or Windows mutex; I can send that if you'd
prefer.)

I have a larger patch series to implement the background reading in
gdb, based on these patches.  I've run this under TSAN quite a bit and
I think all the races (there were none in BFD, of course) and
deadlocks (I found one in my first draft of this patch) have been
ironed out.  Also, it's worth noting that the approach taken here
won't really affect single-threaded BFD users, i.e., everything except
gdb.

Let me know what you think.

Tom



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/3] Make _bfd_error_buf static
  2023-10-26 19:07 [PATCH 0/3] Threads and BFD Tom Tromey
@ 2023-10-26 19:07 ` Tom Tromey
  2023-11-01 12:27   ` Nick Clifton
  2023-10-26 19:07 ` [PATCH 2/3] Make various error-related globals thread-local Tom Tromey
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: Tom Tromey @ 2023-10-26 19:07 UTC (permalink / raw)
  To: binutils; +Cc: Tom Tromey

This makes _bfd_error_buf static and adds a way to clear it.  I felt
that this made the subsequent patches a little cleaner.

	* bfd.c (_bfd_error_buf): Now static.
	(bfd_set_input_error): Use _bfd_clear_error_data.
	(_bfd_clear_error_data): New function.
	(bfd_init): Use _bfd_clear_error_data.
	* libbfd.h: Regenerate.
	* opncls.c (bfd_close_all_done): Use _bfd_clear_error_data.
	* po/bfd.pot: Regenerate.
---
 bfd/bfd.c      |   30 +-
 bfd/libbfd.h   |    3 +-
 bfd/opncls.c   |    3 +-
 bfd/po/bfd.pot | 2469 +++++++++++++++++++++++++-----------------------
 4 files changed, 1336 insertions(+), 1169 deletions(-)

diff --git a/bfd/bfd.c b/bfd/bfd.c
index 88943a042d6..08980ae52b7 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -726,16 +726,12 @@ CODE_FRAGMENT
 .}
 .bfd_error_type;
 .
-INTERNAL
-.{* A buffer that is freed on bfd_close.  *}
-.extern char *_bfd_error_buf;
-.
 */
 
 static bfd_error_type bfd_error;
 static bfd_error_type input_error;
 static bfd *input_bfd;
-char *_bfd_error_buf;
+static char *_bfd_error_buf;
 
 const char *const bfd_errmsgs[] =
 {
@@ -823,8 +819,7 @@ bfd_set_input_error (bfd *input, bfd_error_type error_tag)
   /* This is an error that occurred during bfd_close when writing an
      archive, but on one of the input files.  */
   bfd_error = bfd_error_on_input;
-  free (_bfd_error_buf);
-  _bfd_error_buf = NULL;
+  _bfd_clear_error_data ();
   input_bfd = input;
   input_error = error_tag;
   if (input_error >= bfd_error_on_input)
@@ -896,6 +891,24 @@ bfd_perror (const char *message)
   fflush (stderr);
 }
 
+/*
+INTERNAL_FUNCTION
+	_bfd_clear_error_data
+
+SYNOPSIS
+	void _bfd_clear_error_data (void);
+
+DESCRIPTION
+	Free any data associated with the BFD error.
+*/
+
+void
+_bfd_clear_error_data (void)
+{
+  free (_bfd_error_buf);
+  _bfd_error_buf = NULL;
+}
+
 /*
 INTERNAL_FUNCTION
 	bfd_asprintf
@@ -1725,8 +1738,7 @@ bfd_init (void)
 {
   bfd_error = bfd_error_no_error;
   input_bfd = NULL;
-  free (_bfd_error_buf);
-  _bfd_error_buf = NULL;
+  _bfd_clear_error_data ();
   input_error = bfd_error_no_error;
   _bfd_error_program_name = NULL;
   _bfd_error_internal = error_handler_fprintf;
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index 1ce6bc12b7e..fea00b6ee45 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -929,8 +929,7 @@ bool bfd_write_bigendian_4byte_int (bfd *, unsigned int) ATTRIBUTE_HIDDEN;
 unsigned int bfd_log2 (bfd_vma x) ATTRIBUTE_HIDDEN;
 
 /* Extracted from bfd.c.  */
-/* A buffer that is freed on bfd_close.  */
-extern char *_bfd_error_buf;
+void _bfd_clear_error_data (void) ATTRIBUTE_HIDDEN;
 
 char *bfd_asprintf (const char *fmt, ...) ATTRIBUTE_HIDDEN;
 
diff --git a/bfd/opncls.c b/bfd/opncls.c
index 741d20e81da..cddfd7ec1fb 100644
--- a/bfd/opncls.c
+++ b/bfd/opncls.c
@@ -927,8 +927,7 @@ bfd_close_all_done (bfd *abfd)
     _maybe_make_executable (abfd);
 
   _bfd_delete_bfd (abfd);
-  free (_bfd_error_buf);
-  _bfd_error_buf = NULL;
+  _bfd_clear_error_data ();
 
   return ret;
 }
diff --git a/bfd/po/bfd.pot b/bfd/po/bfd.pot
index d324c0617e9..fa47ba70e91 100644
--- a/bfd/po/bfd.pot
+++ b/bfd/po/bfd.pot
@@ -8,10 +8,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2023-07-03 11:38+0100\n"
+"POT-Creation-Date: 2023-10-26 11:38-0600\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -32,22 +33,22 @@ msgstr ""
 msgid "%pB: bad relocation record imported: %d"
 msgstr ""
 
-#: aoutx.h:1265 aoutx.h:1612 pdp11.c:1238 pdp11.c:1511
+#: aoutx.h:1265 aoutx.h:1612 pdp11.c:1237 pdp11.c:1510
 #, c-format
 msgid "%pB: can not represent section `%pA' in a.out object file format"
 msgstr ""
 
-#: aoutx.h:1576 pdp11.c:1483
+#: aoutx.h:1576 pdp11.c:1482
 #, c-format
 msgid ""
 "%pB: can not represent section for symbol `%s' in a.out object file format"
 msgstr ""
 
-#: aoutx.h:1579 vms-alpha.c:8437
+#: aoutx.h:1579 vms-alpha.c:8461
 msgid "*unknown*"
 msgstr ""
 
-#: aoutx.h:1715 pdp11.c:1579
+#: aoutx.h:1715 pdp11.c:1578
 #, c-format
 msgid "%pB: invalid string offset %<PRIu64> >= %<PRIu64>"
 msgstr ""
@@ -57,19 +58,19 @@ msgstr ""
 msgid "%pB: unsupported AOUT relocation size: %d"
 msgstr ""
 
-#: aoutx.h:2407 aoutx.h:2425 pdp11.c:2062
+#: aoutx.h:2407 aoutx.h:2425 pdp11.c:2059
 #, c-format
 msgid "%pB: attempt to write out unknown reloc type"
 msgstr ""
 
-#: aoutx.h:4080 pdp11.c:3446
+#: aoutx.h:4080 pdp11.c:3443
 #, c-format
 msgid "%pB: unsupported relocation type"
 msgstr ""
 
 #. Unknown relocation.
-#: aoutx.h:4400 coff-alpha.c:601 coff-alpha.c:1521 coff-mips.c:356
-#: coff-rs6000.c:3029 coff-sh.c:504 coff-tic4x.c:184 coff-tic54x.c:262
+#: aoutx.h:4400 coff-alpha.c:601 coff-alpha.c:1559 coff-mips.c:356
+#: coff-rs6000.c:3050 coff-sh.c:504 coff-tic4x.c:184 coff-tic54x.c:262
 #: elf-hppa.h:798 elf-hppa.h:826 elf-m10200.c:226 elf-m10300.c:813
 #: elf32-arc.c:532 elf32-arm.c:1985 elf32-avr.c:962 elf32-bfin.c:1063
 #: elf32-bfin.c:4686 elf32-cr16.c:654 elf32-cr16.c:684 elf32-cris.c:467
@@ -79,8 +80,8 @@ msgstr ""
 #: elf32-i386.c:394 elf32-ip2k.c:1241 elf32-iq2000.c:442 elf32-lm32.c:496
 #: elf32-m32c.c:305 elf32-m32r.c:1286 elf32-m32r.c:1311 elf32-m32r.c:2209
 #: elf32-m68hc11.c:390 elf32-m68hc12.c:510 elf32-m68k.c:354 elf32-mcore.c:354
-#: elf32-mcore.c:440 elf32-mep.c:385 elf32-metag.c:871 elf32-microblaze.c:690
-#: elf32-microblaze.c:1002 elf32-mips.c:2242 elf32-moxie.c:137
+#: elf32-mcore.c:440 elf32-mep.c:385 elf32-metag.c:871 elf32-microblaze.c:708
+#: elf32-microblaze.c:1020 elf32-mips.c:2242 elf32-moxie.c:137
 #: elf32-msp430.c:737 elf32-msp430.c:747 elf32-mt.c:241 elf32-nds32.c:3288
 #: elf32-nds32.c:3309 elf32-nds32.c:5078 elf32-nios2.c:3019 elf32-or1k.c:1087
 #: elf32-pj.c:326 elf32-ppc.c:900 elf32-ppc.c:913 elf32-pru.c:423
@@ -91,19 +92,22 @@ msgstr ""
 #: elf32-v850.c:1924 elf32-v850.c:4250 elf32-vax.c:289 elf32-visium.c:481
 #: elf32-wasm32.c:105 elf32-xgate.c:418 elf32-xstormy16.c:395
 #: elf32-xtensa.c:510 elf32-xtensa.c:544 elf32-z80.c:331 elf64-alpha.c:1114
-#: elf64-alpha.c:4056 elf64-alpha.c:4204 elf64-bpf.c:129 elf64-ia64-vms.c:255
+#: elf64-alpha.c:4056 elf64-alpha.c:4204 elf64-bpf.c:132 elf64-ia64-vms.c:255
 #: elf64-ia64-vms.c:3426 elf64-mips.c:3965 elf64-mips.c:3981 elf64-mmix.c:1264
 #: elf64-nfp.c:151 elf64-ppc.c:1031 elf64-ppc.c:1385 elf64-ppc.c:1394
 #: elf64-s390.c:328 elf64-s390.c:378 elf64-x86-64.c:269 elfn32-mips.c:3799
-#: elfxx-ia64.c:324 elfxx-loongarch.c:1574 elfxx-riscv.c:980 elfxx-sparc.c:589
+#: elfxx-ia64.c:324 elfxx-loongarch.c:1568 elfxx-riscv.c:980 elfxx-sparc.c:589
 #: elfxx-sparc.c:639 elfxx-tilegx.c:907 elfxx-tilegx.c:947
-#: elfnn-aarch64.c:2215 elfnn-aarch64.c:2313 elfnn-ia64.c:214
+#: elfnn-aarch64.c:2215
+#: elfnn-aarch64.c:2313
+#: elfnn-ia64.c:214
 #: elfnn-ia64.c:3821
+#: elfnn-kvx.c:259
 #, c-format
 msgid "%pB: unsupported relocation type %#x"
 msgstr ""
 
-#: aoutx.h:5427 pdp11.c:3869
+#: aoutx.h:5427 pdp11.c:3866
 #, c-format
 msgid "%pB: relocatable link from %s to %s not supported"
 msgstr ""
@@ -117,132 +121,132 @@ msgstr ""
 msgid "%F%P: %pB(%s): error opening thin archive member: %E\n"
 msgstr ""
 
-#: archive.c:2285
+#: archive.c:2294
 msgid "warning: writing archive was slow: rewriting timestamp"
 msgstr ""
 
-#: archive.c:2353 archive.c:2414 elflink.c:4772 linker.c:1431
+#: archive.c:2362 archive.c:2423 elflink.c:4775 linker.c:1434
 #, c-format
 msgid "%pB: plugin needed to handle lto object"
 msgstr ""
 
-#: archive.c:2640
+#: archive.c:2655
 msgid "Reading archive file mod timestamp"
 msgstr ""
 
-#: archive.c:2664
+#: archive.c:2686
 msgid "Writing updated armap timestamp"
 msgstr ""
 
-#: bfd.c:720
+#: bfd.c:738
 msgid "no error"
 msgstr ""
 
-#: bfd.c:721
+#: bfd.c:739
 msgid "system call error"
 msgstr ""
 
-#: bfd.c:722
+#: bfd.c:740
 msgid "invalid bfd target"
 msgstr ""
 
-#: bfd.c:723
+#: bfd.c:741
 msgid "file in wrong format"
 msgstr ""
 
-#: bfd.c:724
+#: bfd.c:742
 msgid "archive object file in wrong format"
 msgstr ""
 
-#: bfd.c:725
+#: bfd.c:743
 msgid "invalid operation"
 msgstr ""
 
-#: bfd.c:726
+#: bfd.c:744
 msgid "memory exhausted"
 msgstr ""
 
-#: bfd.c:727
+#: bfd.c:745
 msgid "no symbols"
 msgstr ""
 
-#: bfd.c:728
+#: bfd.c:746
 msgid "archive has no index; run ranlib to add one"
 msgstr ""
 
-#: bfd.c:729
+#: bfd.c:747
 msgid "no more archived files"
 msgstr ""
 
-#: bfd.c:730
+#: bfd.c:748
 msgid "malformed archive"
 msgstr ""
 
-#: bfd.c:731
+#: bfd.c:749
 msgid "DSO missing from command line"
 msgstr ""
 
-#: bfd.c:732
+#: bfd.c:750
 msgid "file format not recognized"
 msgstr ""
 
-#: bfd.c:733
+#: bfd.c:751
 msgid "file format is ambiguous"
 msgstr ""
 
-#: bfd.c:734
+#: bfd.c:752
 msgid "section has no contents"
 msgstr ""
 
-#: bfd.c:735
+#: bfd.c:753
 msgid "nonrepresentable section on output"
 msgstr ""
 
-#: bfd.c:736
+#: bfd.c:754
 msgid "symbol needs debug section which does not exist"
 msgstr ""
 
-#: bfd.c:737
+#: bfd.c:755
 msgid "bad value"
 msgstr ""
 
-#: bfd.c:738
+#: bfd.c:756
 msgid "file truncated"
 msgstr ""
 
-#: bfd.c:739
+#: bfd.c:757
 msgid "file too big"
 msgstr ""
 
-#: bfd.c:740
+#: bfd.c:758
 msgid "sorry, cannot handle this file"
 msgstr ""
 
-#: bfd.c:741
+#: bfd.c:759
 #, c-format
 msgid "error reading %s: %s"
 msgstr ""
 
-#: bfd.c:742
+#: bfd.c:760
 msgid "#<invalid error code>"
 msgstr ""
 
-#: bfd.c:1856
+#: bfd.c:1890
 #, c-format
 msgid "BFD %s assertion fail %s:%d"
 msgstr ""
 
-#: bfd.c:1869
+#: bfd.c:1903
 #, c-format
 msgid "BFD %s internal error, aborting at %s:%d in %s\n"
 msgstr ""
 
-#: bfd.c:1874
+#: bfd.c:1908
 #, c-format
 msgid "BFD %s internal error, aborting at %s:%d\n"
 msgstr ""
 
-#: bfd.c:1876
+#: bfd.c:1910
 msgid "Please report this bug.\n"
 msgstr ""
 
@@ -261,7 +265,7 @@ msgstr ""
 msgid "warning: writing section `%pA' at huge (ie negative) file offset"
 msgstr ""
 
-#: cache.c:272
+#: cache.c:273
 #, c-format
 msgid "reopening %pB: %s"
 msgstr ""
@@ -273,21 +277,38 @@ msgid ""
 "to generate uncompressed binaries"
 msgstr ""
 
-#: coff-alpha.c:857 coff-alpha.c:894 coff-alpha.c:1963 coff-mips.c:948
+#: coff-alpha.c:867 coff-alpha.c:904 coff-alpha.c:2001 coff-mips.c:948
 msgid "GP relative relocation used when GP not defined"
 msgstr ""
 
-#: coff-alpha.c:1450
+#: coff-alpha.c:1151 coff-z80.c:351 coff-z8k.c:214 elf32-nds32.c:13189
+#: elfxx-mips.c:13515 reloc.c:8641 reloc16.c:314
+#, c-format
+msgid "%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"
+msgstr ""
+
+#: coff-alpha.c:1157 coff-z80.c:477 coff-z8k.c:378 elfxx-mips.c:13525
+#: reloc.c:8651
+#, c-format
+msgid "%X%P: %pB(%pA): relocation \"%pR\" is not supported\n"
+msgstr ""
+
+#: coff-alpha.c:1163 elfxx-mips.c:13534 reloc.c:8660
+#, c-format
+msgid "%X%P: %pB(%pA): relocation \"%pR\" returns an unrecognized value %x\n"
+msgstr ""
+
+#: coff-alpha.c:1488
 msgid "using multiple gp values"
 msgstr ""
 
-#: coff-alpha.c:1508 coff-alpha.c:1514 elf.c:10207 elf32-mcore.c:100
-#: elf32-mcore.c:455 elf32-ppc.c:7655 elf32-ppc.c:8850 elf64-ppc.c:16826
+#: coff-alpha.c:1546 coff-alpha.c:1552 elf.c:10234 elf32-mcore.c:100
+#: elf32-mcore.c:455 elf32-ppc.c:7670 elf32-ppc.c:8858 elf64-ppc.c:16839
 #, c-format
 msgid "%pB: %s unsupported"
 msgstr ""
 
-#: coff-go32.c:167 coffswap.h:819
+#: coff-go32.c:167 coffswap.h:812
 #, c-format
 msgid "%pB: warning: %s: line number overflow: 0x%lx > 0xffff"
 msgstr ""
@@ -307,107 +328,96 @@ msgstr ""
 msgid "%pB: unsupported swap_aux_out for storage class %#x"
 msgstr ""
 
-#: coff-rs6000.c:3119
+#: coff-rs6000.c:3140
 #, c-format
 msgid "%pB: TOC reloc at %#<PRIx64> to symbol `%s' with no TOC entry"
 msgstr ""
 
-#: coff-rs6000.c:3243 coff64-rs6000.c:848
+#: coff-rs6000.c:3264 coff64-rs6000.c:848
 #, c-format
 msgid "Unable to find the stub entry targeting %s"
 msgstr ""
 
-#: coff-rs6000.c:3358
+#: coff-rs6000.c:3379
 #, c-format
 msgid "%pB: TLS relocation at 0x%<PRIx64> over non-TLS symbol %s (0x%x)\n"
 msgstr ""
 
-#: coff-rs6000.c:3371
+#: coff-rs6000.c:3392
 #, c-format
 msgid "%pB: TLS local relocation at 0x%<PRIx64> over imported symbol %s\n"
 msgstr ""
 
-#: coff-rs6000.c:3777
+#: coff-rs6000.c:3798
 #, c-format
 msgid "%pB: relocation (%d) at 0x%<PRIx64> has wrong r_rsize (0x%x)\n"
 msgstr ""
 
-#: coff-rs6000.c:4039 coff64-rs6000.c:2031
+#: coff-rs6000.c:4060 coff64-rs6000.c:2030
 #, c-format
 msgid "%pB: symbol `%s' has unrecognized smclas %d"
 msgstr ""
 
-#: coff-sh.c:780 elf32-sh.c:521
+#: coff-sh.c:781 elf32-sh.c:521
 #, c-format
 msgid "%pB: %#<PRIx64>: warning: bad R_SH_USES offset"
 msgstr ""
 
-#: coff-sh.c:791
+#: coff-sh.c:792
 #, c-format
 msgid "%pB: %#<PRIx64>: warning: R_SH_USES points to unrecognized insn %#x"
 msgstr ""
 
-#: coff-sh.c:809 elf32-sh.c:552
+#: coff-sh.c:810 elf32-sh.c:552
 #, c-format
 msgid "%pB: %#<PRIx64>: warning: bad R_SH_USES load offset"
 msgstr ""
 
-#: coff-sh.c:834 elf32-sh.c:568
+#: coff-sh.c:835 elf32-sh.c:568
 #, c-format
 msgid "%pB: %#<PRIx64>: warning: could not find expected reloc"
 msgstr ""
 
-#: coff-sh.c:851 elf32-sh.c:597
+#: coff-sh.c:852 elf32-sh.c:597
 #, c-format
 msgid "%pB: %#<PRIx64>: warning: symbol in unexpected section"
 msgstr ""
 
-#: coff-sh.c:972 elf32-sh.c:727
+#: coff-sh.c:973 elf32-sh.c:727
 #, c-format
 msgid "%pB: %#<PRIx64>: warning: could not find expected COUNT reloc"
 msgstr ""
 
-#: coff-sh.c:982 elf32-sh.c:738
+#: coff-sh.c:983 elf32-sh.c:738
 #, c-format
 msgid "%pB: %#<PRIx64>: warning: bad count"
 msgstr ""
 
-#: coff-sh.c:1348 coff-sh.c:2635 elf32-sh.c:1138 elf32-sh.c:1506
+#: coff-sh.c:1349 coff-sh.c:2636 elf32-sh.c:1138 elf32-sh.c:1506
 #, c-format
 msgid "%pB: %#<PRIx64>: fatal: reloc overflow while relaxing"
 msgstr ""
 
-#: coff-sh.c:1442
+#: coff-sh.c:1443
 #, c-format
 msgid "%pB: fatal: generic symbols retrieved before relaxing"
 msgstr ""
 
-#: coff-sh.c:2772 cofflink.c:2947
+#: coff-sh.c:2773 cofflink.c:2947
 #, c-format
 msgid "%pB: illegal symbol index %ld in relocs"
 msgstr ""
 
 #: coff-tic30.c:172 coff-tic4x.c:228 coff-tic54x.c:338 coff-z80.c:325
-#: coff-z8k.c:188 coffcode.h:5224
+#: coff-z8k.c:188 coffcode.h:5297
 #, c-format
 msgid "%pB: warning: illegal symbol index %ld in relocs"
 msgstr ""
 
-#: coff-x86_64.c:152
+#: coff-x86_64.c:147
 msgid "R_AMD64_IMAGEBASE with __ImageBase undefined"
 msgstr ""
 
-#: coff-z80.c:351 coff-z8k.c:214 elf32-nds32.c:13189 elfxx-mips.c:13513
-#: reloc.c:8495 reloc16.c:314
-#, c-format
-msgid "%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"
-msgstr ""
-
-#: coff-z80.c:477 coff-z8k.c:378 elfxx-mips.c:13523 reloc.c:8505
-#, c-format
-msgid "%X%P: %pB(%pA): relocation \"%pR\" is not supported\n"
-msgstr ""
-
 #: coff64-rs6000.c:447 coff64-rs6000.c:554
 #, c-format
 msgid "%pB: C_STAT isn't supported by XCOFF64"
@@ -423,107 +433,105 @@ msgstr ""
 msgid "%pB: relocation (%d) at (0x%<PRIx64>) has wrong r_rsize (0x%x)\n"
 msgstr ""
 
-#: coffcode.h:935
+#: coffcode.h:951
 #, c-format
 msgid "%pB: unable to load COMDAT section name"
 msgstr ""
 
-#. Malformed input files can trigger this test.
-#. cf PR 21781.
-#: coffcode.h:970
+#: coffcode.h:976
 #, c-format
-msgid "%pB: error: unexpected symbol '%s' in COMDAT section"
+msgid "%pB: warning: no symbol for section '%s' found"
 msgstr ""
 
-#: coffcode.h:982
+#: coffcode.h:1148
 #, c-format
-msgid "%pB: warning: COMDAT symbol '%s' does not match section name '%s'"
+msgid "%pB: error: unexpected symbol '%s' in COMDAT section"
 msgstr ""
 
-#: coffcode.h:1005
+#: coffcode.h:1159
 #, c-format
-msgid "%pB: warning: no symbol for section '%s' found"
+msgid "%pB: warning: COMDAT symbol '%s' does not match section name '%s'"
 msgstr ""
 
 #. Generate a warning message rather using the 'unhandled'
 #. variable as this will allow some .sys files generate by
 #. other toolchains to be processed.  See bugzilla issue 196.
-#: coffcode.h:1214
+#: coffcode.h:1267
 #, c-format
 msgid "%pB: warning: ignoring section flag %s in section %s"
 msgstr ""
 
-#: coffcode.h:1284
+#: coffcode.h:1337
 #, c-format
 msgid "%pB (%s): section flag %s (%#lx) ignored"
 msgstr ""
 
-#: coffcode.h:1901
+#: coffcode.h:1954
 #, c-format
 msgid "%pB: overflow reloc count too small"
 msgstr ""
 
-#: coffcode.h:1910 coffcode.h:1975
+#: coffcode.h:1963 coffcode.h:2028
 #, c-format
 msgid "%pB: warning: claims to have 0xffff relocs, without overflow"
 msgstr ""
 
-#: coffcode.h:2352
+#: coffcode.h:2405
 #, c-format
 msgid "unrecognized TI COFF target id '0x%x'"
 msgstr ""
 
-#: coffcode.h:2631
+#: coffcode.h:2684
 #, c-format
 msgid "%pB: reloc against a non-existent symbol index: %ld"
 msgstr ""
 
-#: coffcode.h:3097
+#: coffcode.h:3150
 #, c-format
 msgid "%pB: too many sections (%d)"
 msgstr ""
 
-#: coffcode.h:3624
+#: coffcode.h:3678
 #, c-format
 msgid "%pB: section %pA: string table overflow at offset %ld"
 msgstr ""
 
-#: coffcode.h:3725
+#: coffcode.h:3779
 #, c-format
 msgid "%pB:%s section %s: alignment 2**%u not representable"
 msgstr ""
 
-#: coffcode.h:4449
+#: coffcode.h:4515
 #, c-format
 msgid "%pB: warning: line number table read failed"
 msgstr ""
 
-#: coffcode.h:4495 coffcode.h:4509
+#: coffcode.h:4561 coffcode.h:4575
 #, c-format
 msgid "%pB: warning: illegal symbol index 0x%lx in line number entry %d"
 msgstr ""
 
-#: coffcode.h:4523
+#: coffcode.h:4589
 #, c-format
 msgid "%pB: warning: illegal symbol in line number entry %d"
 msgstr ""
 
-#: coffcode.h:4536
+#: coffcode.h:4602
 #, c-format
 msgid "%pB: warning: duplicate line number information for `%s'"
 msgstr ""
 
-#: coffcode.h:4960
+#: coffcode.h:5026
 #, c-format
 msgid "%pB: unrecognized storage class %d for %s symbol `%s'"
 msgstr ""
 
-#: coffcode.h:5100
+#: coffcode.h:5166
 #, c-format
 msgid "warning: %pB: local symbol `%s' has no section"
 msgstr ""
 
-#: coffcode.h:5264
+#: coffcode.h:5337
 #, c-format
 msgid "%pB: illegal relocation type %d at address %#<PRIx64>"
 msgstr ""
@@ -538,31 +546,31 @@ msgstr ""
 msgid "%pB: unable to decompress section %s"
 msgstr ""
 
-#: coffgen.c:1786
+#: coffgen.c:1781
 #, c-format
 msgid "%pB: bad string table size %<PRIu64>"
 msgstr ""
 
-#: coffgen.c:1955 coffgen.c:2000 coffgen.c:2051 coffgen.c:2069 cofflink.c:2012
-#: elf.c:2476 xcofflink.c:5532
+#: coffgen.c:1931 coffgen.c:1981 coffgen.c:2031 coffgen.c:2050 cofflink.c:2012
+#: elf.c:2478 xcofflink.c:5532
 msgid "<corrupt>"
 msgstr ""
 
-#: coffgen.c:2207
+#: coffgen.c:2192
 #, c-format
 msgid "<corrupt info> %s"
 msgstr ""
 
-#: coffgen.c:2811 elflink.c:15165 linker.c:2974
+#: coffgen.c:2796 elflink.c:15168 linker.c:2977
 msgid "%F%P: already_linked_table: %E\n"
 msgstr ""
 
-#: coffgen.c:3153 elflink.c:14105
+#: coffgen.c:3138 elflink.c:14108
 #, c-format
 msgid "removing unused section '%pA' in file '%pB'"
 msgstr ""
 
-#: coffgen.c:3230 elflink.c:14335
+#: coffgen.c:3215 elflink.c:14338
 msgid "warning: gc-sections option ignored"
 msgstr ""
 
@@ -571,7 +579,7 @@ msgstr ""
 msgid "warning: symbol `%s' is both section and non-section"
 msgstr ""
 
-#: cofflink.c:503 elf64-ia64-vms.c:5197 elflink.c:5379
+#: cofflink.c:503 elf64-ia64-vms.c:5200 elflink.c:5382
 #, c-format
 msgid "warning: type of symbol `%s' changed from %d to %d in %pB"
 msgstr ""
@@ -581,11 +589,11 @@ msgstr ""
 msgid "%pB: relocs in section `%pA', but it has no contents"
 msgstr ""
 
-#: cofflink.c:2403 elflink.c:11546
+#: cofflink.c:2403 elflink.c:11549
 #, c-format
 msgid ""
-"%X`%s' referenced in section `%pA' of %pB: defined in discarded section `%"
-"pA' of %pB\n"
+"%X`%s' referenced in section `%pA' of %pB: defined in discarded section "
+"`%pA' of %pB\n"
 msgstr ""
 
 #: cofflink.c:2598
@@ -608,7 +616,7 @@ msgstr ""
 msgid "%pB: bad reloc address %#<PRIx64> in section `%pA'"
 msgstr ""
 
-#: coffswap.h:833
+#: coffswap.h:826
 #, c-format
 msgid "%pB: %s: reloc overflow: 0x%lx > 0xffff"
 msgstr ""
@@ -829,24 +837,28 @@ msgid ""
 "      Type: %s"
 msgstr ""
 
-#: elf-attrs.c:477
+#: elf-attrs.c:417 elf-attrs.c:447 elf-attrs.c:623
+msgid "error adding attribute"
+msgstr ""
+
+#: elf-attrs.c:503
 #, c-format
 msgid "%pB: error: attribute section '%pA' too big: %#llx"
 msgstr ""
 
-#: elf-attrs.c:514
+#: elf-attrs.c:540
 #, c-format
 msgid "%pB: error: attribute section length too small: %ld"
 msgstr ""
 
-#: elf-attrs.c:644
+#: elf-attrs.c:673
 #, c-format
 msgid ""
 "error: %pB: object has vendor-specific contents that must be processed by "
 "the '%s' toolchain"
 msgstr ""
 
-#: elf-attrs.c:654
+#: elf-attrs.c:683
 #, c-format
 msgid "error: %pB: object tag '%d, %s' is incompatible with tag '%d, %s'"
 msgstr ""
@@ -923,10 +935,10 @@ msgstr ""
 #: elf32-fr30.c:594 elf32-frv.c:4049 elf32-ft32.c:492 elf32-h8300.c:523
 #: elf32-ip2k.c:1478 elf32-iq2000.c:691 elf32-lm32.c:1070 elf32-m32c.c:624
 #: elf32-m32r.c:2837 elf32-m68hc1x.c:1271 elf32-mep.c:522 elf32-metag.c:1984
-#: elf32-microblaze.c:1664 elf32-moxie.c:288 elf32-mt.c:402 elf32-nds32.c:6093
+#: elf32-microblaze.c:1682 elf32-moxie.c:288 elf32-mt.c:402 elf32-nds32.c:6093
 #: elf32-or1k.c:1897 elf32-score.c:2734 elf32-score7.c:2545 elf32-spu.c:5085
 #: elf32-tilepro.c:3372 elf32-v850.c:2294 elf32-visium.c:680
-#: elf32-xstormy16.c:930 elf64-bpf.c:335 elf64-mmix.c:1541 elfxx-tilegx.c:3742
+#: elf32-xstormy16.c:930 elf64-bpf.c:338 elf64-mmix.c:1541 elfxx-tilegx.c:3742
 msgid "internal error: out of range error"
 msgstr ""
 
@@ -934,18 +946,17 @@ msgstr ""
 #: elf32-cris.c:2038 elf32-crx.c:926 elf32-d10v.c:514 elf32-fr30.c:598
 #: elf32-frv.c:4053 elf32-ft32.c:496 elf32-h8300.c:527 elf32-iq2000.c:695
 #: elf32-lm32.c:1074 elf32-m32c.c:628 elf32-m32r.c:2841 elf32-m68hc1x.c:1275
-#: elf32-mep.c:526 elf32-metag.c:1988 elf32-microblaze.c:1668
-#: elf32-moxie.c:292 elf32-msp430.c:1510 elf32-nds32.c:6097 elf32-or1k.c:1901
-#: elf32-score.c:2738 elf32-score7.c:2549 elf32-spu.c:5089
-#: elf32-tilepro.c:3376 elf32-v850.c:2298 elf32-visium.c:684
-#: elf32-xstormy16.c:934 elf64-mmix.c:1545 elfxx-mips.c:10651
-#: elfxx-tilegx.c:3746
+#: elf32-mep.c:526 elf32-metag.c:1988 elf32-microblaze.c:1686 elf32-moxie.c:292
+#: elf32-msp430.c:1510 elf32-nds32.c:6097 elf32-or1k.c:1901 elf32-score.c:2738
+#: elf32-score7.c:2549 elf32-spu.c:5089 elf32-tilepro.c:3376 elf32-v850.c:2298
+#: elf32-visium.c:684 elf32-xstormy16.c:934 elf64-mmix.c:1545
+#: elfxx-mips.c:10653 elfxx-tilegx.c:3746
 msgid "internal error: unsupported relocation error"
 msgstr ""
 
 #: elf-m10200.c:442 elf32-cr16.c:1437 elf32-crx.c:930 elf32-d10v.c:518
 #: elf32-h8300.c:531 elf32-lm32.c:1078 elf32-m32r.c:2845 elf32-m68hc1x.c:1279
-#: elf32-microblaze.c:1672 elf32-nds32.c:6101 elf32-score.c:2742
+#: elf32-microblaze.c:1690 elf32-nds32.c:6101 elf32-score.c:2742
 #: elf32-score7.c:2553 elf32-spu.c:5093
 msgid "internal error: dangerous error"
 msgstr ""
@@ -955,11 +966,10 @@ msgstr ""
 #: elf32-fr30.c:606 elf32-frv.c:4061 elf32-ft32.c:504 elf32-h8300.c:535
 #: elf32-ip2k.c:1493 elf32-iq2000.c:703 elf32-lm32.c:1082 elf32-m32c.c:636
 #: elf32-m32r.c:2849 elf32-m68hc1x.c:1283 elf32-mep.c:534 elf32-metag.c:1996
-#: elf32-microblaze.c:1676 elf32-moxie.c:300 elf32-msp430.c:1518
-#: elf32-mt.c:410 elf32-nds32.c:6105 elf32-or1k.c:1909 elf32-score.c:2751
-#: elf32-score7.c:2557 elf32-spu.c:5097 elf32-tilepro.c:3384 elf32-v850.c:2318
-#: elf32-visium.c:692 elf32-xstormy16.c:942 elf64-bpf.c:348 elf64-mmix.c:1553
-#: elfxx-tilegx.c:3754
+#: elf32-microblaze.c:1694 elf32-moxie.c:300 elf32-msp430.c:1518 elf32-mt.c:410
+#: elf32-nds32.c:6105 elf32-or1k.c:1909 elf32-score.c:2751 elf32-score7.c:2557
+#: elf32-spu.c:5097 elf32-tilepro.c:3384 elf32-v850.c:2318 elf32-visium.c:692
+#: elf32-xstormy16.c:942 elf64-bpf.c:351 elf64-mmix.c:1553 elfxx-tilegx.c:3754
 msgid "internal error: unknown error"
 msgstr ""
 
@@ -973,11 +983,13 @@ msgstr ""
 msgid "%pB: %s' accessed both as normal and thread local symbol"
 msgstr ""
 
-#: elf-m10300.c:2093 elf32-arm.c:13398 elf32-i386.c:3484 elf32-m32r.c:2331
+#: elf-m10300.c:2093 elf32-arm.c:13398 elf32-i386.c:3490 elf32-m32r.c:2331
 #: elf32-m68k.c:3929 elf32-s390.c:3080 elf32-sh.c:3673 elf32-tilepro.c:3275
-#: elf32-xtensa.c:3023 elf64-s390.c:3042 elf64-x86-64.c:4209
-#: elfxx-sparc.c:2917 elfxx-sparc.c:3814 elfxx-tilegx.c:3665
-#: elfnn-aarch64.c:5682 elfnn-aarch64.c:7291
+#: elf32-xtensa.c:3023 elf64-s390.c:3042 elf64-x86-64.c:4209 elfxx-sparc.c:2917
+#: elfxx-sparc.c:3814 elfxx-tilegx.c:3665
+#: elfnn-aarch64.c:5682
+#: elfnn-aarch64.c:7291
+#: elfnn-kvx.c:2775
 #, c-format
 msgid "%pB(%pA+%#<PRIx64>): unresolvable %s relocation against symbol `%s'"
 msgstr ""
@@ -1000,7 +1012,8 @@ msgid "internal error: suspicious relocation type used in shared library"
 msgstr ""
 
 #: elf-m10300.c:2650 elf32-avr.c:2488 elf32-frv.c:5621 elf64-ia64-vms.c:365
-#: elfxx-sparc.c:2684 reloc.c:8269 reloc16.c:155 elfnn-ia64.c:365
+#: elfxx-sparc.c:2684 reloc.c:8415 reloc16.c:155
+#: elfnn-ia64.c:365
 msgid "%P%F: --relax and -r may not be used together\n"
 msgstr ""
 
@@ -1067,11 +1080,11 @@ msgstr ""
 msgid "Removed property %W to merge %pB (not found) and %pB (0x%v)\n"
 msgstr ""
 
-#: elf-properties.c:668 elfxx-aarch64.c:758 elfxx-x86.c:4103
+#: elf-properties.c:668 elfxx-aarch64.c:758 elfxx-x86.c:4147
 msgid "%F%P: failed to create GNU property section\n"
 msgstr ""
 
-#: elf-properties.c:672 elfxx-aarch64.c:762 elfxx-x86.c:4108
+#: elf-properties.c:672 elfxx-aarch64.c:762 elfxx-x86.c:4152
 #, c-format
 msgid "%F%pA: failed to align section\n"
 msgstr ""
@@ -1111,7 +1124,9 @@ msgstr ""
 msgid "%pB: invalid string offset %u >= %<PRIu64> for section `%s'"
 msgstr ""
 
-#: elf.c:517 elf32-arm.c:17730 elfnn-aarch64.c:8291 elfnn-loongarch.c:4391
+#: elf.c:517 elf32-arm.c:17731
+#: elfnn-aarch64.c:8291
+#: elfnn-loongarch.c:4427
 #, c-format
 msgid "%pB symbol number %lu references nonexistent SHT_SYMTAB_SHNDX section"
 msgstr ""
@@ -1217,104 +1232,104 @@ msgstr ""
 msgid "  required from %s:\n"
 msgstr ""
 
-#: elf.c:2612
+#: elf.c:2614
 #, c-format
 msgid "%pB: warning: loop in section dependencies detected"
 msgstr ""
 
-#: elf.c:2719
+#: elf.c:2721
 #, c-format
 msgid ""
 "%pB: warning: multiple symbol tables detected - ignoring the table in "
 "section %u"
 msgstr ""
 
-#: elf.c:2804
+#: elf.c:2806
 #, c-format
 msgid ""
 "%pB: warning: multiple dynamic symbol tables detected - ignoring the table "
 "in section %u"
 msgstr ""
 
-#: elf.c:2923
+#: elf.c:2925
 #, c-format
 msgid "%pB: invalid link %u for reloc section %s (index %u)"
 msgstr ""
 
-#: elf.c:2980
+#: elf.c:2982
 #, c-format
 msgid ""
 "%pB: warning: secondary relocation section '%s' for section %pA found - "
 "ignoring"
 msgstr ""
 
-#: elf.c:3068 elf.c:3082 elf.c:3093 elf.c:3106
+#: elf.c:3070 elf.c:3084 elf.c:3095 elf.c:3108
 #, c-format
 msgid "%pB: unknown type [%#x] section `%s'"
 msgstr ""
 
-#: elf.c:3766
+#: elf.c:3770
 #, c-format
 msgid "%pB: error: alignment power %d of section `%pA' is too big"
 msgstr ""
 
-#: elf.c:3801
+#: elf.c:3805
 #, c-format
 msgid "warning: section `%pA' type changed to PROGBITS"
 msgstr ""
 
-#: elf.c:4307
+#: elf.c:4311
 #, c-format
 msgid "%pB: too many sections: %u"
 msgstr ""
 
-#: elf.c:4393
+#: elf.c:4397
 #, c-format
 msgid ""
 "%pB: sh_link of section `%pA' points to discarded section `%pA' of `%pB'"
 msgstr ""
 
-#: elf.c:4411
+#: elf.c:4415
 #, c-format
 msgid "%pB: sh_link of section `%pA' points to removed section `%pA' of `%pB'"
 msgstr ""
 
-#: elf.c:5005
+#: elf.c:5009
 #, c-format
 msgid "%pB: GNU_MBIND section `%pA' has invalid sh_info field: %d"
 msgstr ""
 
-#: elf.c:5188
+#: elf.c:5192
 msgid "%F%P: failed to size relative relocations\n"
 msgstr ""
 
-#: elf.c:5613
+#: elf.c:5617
 #, c-format
 msgid "%pB: TLS sections are not adjacent:"
 msgstr ""
 
-#: elf.c:5620
+#: elf.c:5624
 #, c-format
 msgid "\t    TLS: %pA"
 msgstr ""
 
-#: elf.c:5624
+#: elf.c:5628
 #, c-format
 msgid "\tnon-TLS: %pA"
 msgstr ""
 
-#: elf.c:6252
+#: elf.c:6256
 #, c-format
 msgid ""
 "%pB: The first section in the PT_DYNAMIC segment is not the .dynamic section"
 msgstr ""
 
-#: elf.c:6278
+#: elf.c:6282
 #, c-format
 msgid "%pB: not enough room for program headers, try linking with -N"
 msgstr ""
 
-#: elf.c:6395
+#: elf.c:6399
 #, c-format
 msgid "%pB: section %pA lma %#<PRIx64> adjusted to %#<PRIx64>"
 msgstr ""
@@ -1322,196 +1337,195 @@ msgstr ""
 #. The fix for this error is usually to edit the linker script being
 #. used and set up the program headers manually.  Either that or
 #. leave room for the headers at the start of the SECTIONS.
-#: elf.c:6535
+#: elf.c:6539
 #, c-format
 msgid "%pB: error: PHDR segment not covered by LOAD segment"
 msgstr ""
 
-#: elf.c:6575
+#: elf.c:6579
 #, c-format
 msgid "%pB: section `%pA' can't be allocated in segment %d"
 msgstr ""
 
-#: elf.c:6716
+#: elf.c:6720
 #, c-format
 msgid "%pB: warning: allocated section `%s' not in segment"
 msgstr ""
 
-#: elf.c:6851
+#: elf.c:6855
 #, c-format
 msgid "%pB: warning: unable to allocate any sections to PT_GNU_RELRO segment"
 msgstr ""
 
-#: elf.c:6882
+#: elf.c:6886
 #, c-format
 msgid ""
 "%pB: error: non-load segment %d includes file header and/or program header"
 msgstr ""
 
-#: elf.c:7022
+#: elf.c:7026
 #, c-format
 msgid "warning: %pB has a TLS segment with execute permission"
 msgstr ""
 
-#: elf.c:7028
+#: elf.c:7032
 #, c-format
 msgid "warning: %pB has a LOAD segment with RWX permissions"
 msgstr ""
 
-#: elf.c:7416
+#: elf.c:7420
 #, c-format
 msgid "%pB: symbol `%s' required but not present"
 msgstr ""
 
-#: elf.c:7794
+#: elf.c:7798
 #, c-format
 msgid ""
 "%pB: warning: empty loadable segment detected at vaddr=%#<PRIx64>, is this "
 "intentional?"
 msgstr ""
 
-#: elf.c:8454
+#: elf.c:8458
 #, c-format
 msgid "%pB: warning: segment alignment of %#<PRIx64> is too large"
 msgstr ""
 
-#: elf.c:8962
+#: elf.c:8966
 #, c-format
 msgid ""
 "%pB: Unable to handle section index %x in ELF symbol.  Using ABS instead."
 msgstr ""
 
-#: elf.c:8992
+#: elf.c:8996
 #, c-format
 msgid ""
 "unable to find equivalent output section for symbol '%s' from section '%s'"
 msgstr ""
 
-#: elf.c:9426
+#: elf.c:9431
 #, c-format
 msgid "%pB: .gnu.version_r invalid entry"
 msgstr ""
 
-#: elf.c:9587
+#: elf.c:9607
 #, c-format
 msgid "%pB: .gnu.version_d invalid entry"
 msgstr ""
 
-#: elf.c:10080
+#: elf.c:10107
 #, c-format
 msgid "%pB:%pA: error: attempting to write over the end of the section"
 msgstr ""
 
-#: elf.c:10092
+#: elf.c:10119
 #, c-format
 msgid "%pB:%pA: error: attempting to write section into an empty buffer"
 msgstr ""
 
-#: elf.c:10999
+#: elf.c:11047
 #, c-format
 msgid "%pB: warning: win32pstatus %s of size %lu bytes is too small"
 msgstr ""
 
-#: elf.c:11078
+#: elf.c:11126
 #, c-format
 msgid ""
 "%pB: win32pstatus NOTE_INFO_MODULE of size %lu is too small to contain a "
 "name of size %u"
 msgstr ""
 
-#: elf.c:13642
+#: elf.c:13764
 msgid "GNU_MBIND section is supported only by GNU and FreeBSD targets"
 msgstr ""
 
-#: elf.c:13645
+#: elf.c:13767
 msgid "symbol type STT_GNU_IFUNC is supported only by GNU and FreeBSD targets"
 msgstr ""
 
-#: elf.c:13648
+#: elf.c:13770
 msgid ""
 "symbol binding STB_GNU_UNIQUE is supported only by GNU and FreeBSD targets"
 msgstr ""
 
-#: elf.c:13651
+#: elf.c:13773
 msgid "GNU_RETAIN section is supported only by GNU and FreeBSD targets"
 msgstr ""
 
-#: elf.c:13870
+#: elf.c:13991
 #, c-format
 msgid "%pB(%pA): relocation %zu has invalid symbol index %lu"
 msgstr ""
 
-#: elf.c:13946
+#: elf.c:14067
 #, c-format
 msgid ""
 "%pB(%pA): link section cannot be set because the output file does not have a "
 "symbol table"
 msgstr ""
 
-#: elf.c:13960
+#: elf.c:14081
 #, c-format
 msgid "%pB(%pA): info section index is invalid"
 msgstr ""
 
-#: elf.c:13974
+#: elf.c:14095
 #, c-format
 msgid ""
 "%pB(%pA): info section index cannot be set because the section is not in the "
 "output"
 msgstr ""
 
-#: elf.c:14050
+#: elf.c:14171
 #, c-format
 msgid "%pB(%pA): error: secondary reloc section processed twice"
 msgstr ""
 
-#: elf.c:14062
+#: elf.c:14183
 #, c-format
 msgid "%pB(%pA): error: secondary reloc section has zero sized entries"
 msgstr ""
 
-#: elf.c:14074
+#: elf.c:14195
 #, c-format
 msgid "%pB(%pA): error: secondary reloc section has non-standard sized entries"
 msgstr ""
 
-#: elf.c:14088
+#: elf.c:14209
 #, c-format
 msgid "%pB(%pA): error: secondary reloc section is empty!"
 msgstr ""
 
-#: elf.c:14111
+#: elf.c:14232
 #, c-format
 msgid "%pB(%pA): error: internal relocs missing for secondary reloc section"
 msgstr ""
 
-#: elf.c:14131
+#: elf.c:14252
 #, c-format
 msgid "%pB(%pA): error: reloc table entry %zu is empty"
 msgstr ""
 
-#: elf.c:14156
+#: elf.c:14277
 #, c-format
 msgid "%pB(%pA): error: secondary reloc %zu references a missing symbol"
 msgstr ""
 
-#: elf.c:14174
+#: elf.c:14295
 #, c-format
 msgid "%pB(%pA): error: secondary reloc %zu references a deleted symbol"
 msgstr ""
 
-#: elf.c:14188
+#: elf.c:14309
 #, c-format
 msgid "%pB(%pA): error: secondary reloc %zu is of an unknown type"
 msgstr ""
 
 #. Ignore init flag - it may not be set, despite the flags field
 #. containing valid data.
-#. Ignore init flag - it may not be set, despite the flags field
-#. containing valid data.
-#: elf32-arc.c:455 elf32-arm.c:15124 elf32-frv.c:6612 elf32-iq2000.c:868
+#: elf32-arc.c:455 elf32-arm.c:15125 elf32-frv.c:6612 elf32-iq2000.c:868
 #: elf32-m32c.c:914 elf32-mt.c:560 elf32-rl78.c:1275 elf32-rx.c:3218
-#: elf32-visium.c:844 elf64-ppc.c:5513 elfnn-aarch64.c:7521
+#: elf32-visium.c:844 elf64-ppc.c:5513
+#: elfnn-aarch64.c:7521
 #, c-format
 msgid "private flags = 0x%lx:"
 msgstr ""
@@ -1558,7 +1572,7 @@ msgid ""
 msgstr ""
 
 #: elf32-arc.c:938 elf32-iq2000.c:844 elf32-m32c.c:889 elf32-m68hc1x.c:1390
-#: elf32-ppc.c:3856 elf64-sparc.c:737 elfxx-mips.c:15685
+#: elf32-ppc.c:3856 elf64-sparc.c:737 elfxx-mips.c:15687
 #, c-format
 msgid "%pB: uses different e_flags (%#x) fields than previous modules (%#x)"
 msgstr ""
@@ -1574,8 +1588,8 @@ msgstr ""
 #: elf32-arc.c:1159
 #, c-format
 msgid ""
-"%pB(%pA+%#<PRIx64>): CMEM relocation to `%s' is invalid, 16 MSB should be %"
-"#x (value is %#<PRIx64>)"
+"%pB(%pA+%#<PRIx64>): CMEM relocation to `%s' is invalid, 16 MSB should be "
+"%#x (value is %#<PRIx64>)"
 msgstr ""
 
 #: elf32-arc.c:1170
@@ -1585,50 +1599,51 @@ msgid ""
 "should be %#x (value is %#<PRIx64>)"
 msgstr ""
 
-#: elf32-arc.c:1885
+#: elf32-arc.c:1898
 msgid "GOT and PLT relocations cannot be fixed with a non dynamic linker"
 msgstr ""
 
-#: elf32-arc.c:1909 elf32-rx.c:1486
+#: elf32-arc.c:1922 elf32-rx.c:1486
 #, c-format
 msgid ""
 "%pB(%pA): warning: unaligned access to symbol '%s' in the small data area"
 msgstr ""
 
-#: elf32-arc.c:1914 elf32-rx.c:1491
+#: elf32-arc.c:1927 elf32-rx.c:1491
 #, c-format
 msgid "%pB(%pA): internal error: out of range error"
 msgstr ""
 
-#: elf32-arc.c:1919 elf32-rx.c:1496
+#: elf32-arc.c:1932 elf32-rx.c:1496
 #, c-format
 msgid "%pB(%pA): internal error: unsupported relocation error"
 msgstr ""
 
-#: elf32-arc.c:1924 elf32-rx.c:1501
+#: elf32-arc.c:1937 elf32-rx.c:1501
 #, c-format
 msgid "%pB(%pA): internal error: dangerous relocation"
 msgstr ""
 
-#: elf32-arc.c:1929 elf32-rx.c:1506
+#: elf32-arc.c:1942 elf32-rx.c:1506
 #, c-format
 msgid "%pB(%pA): internal error: unknown error"
 msgstr ""
 
-#: elf32-arc.c:2023 elf32-arc.c:2091 elf32-arm.c:15579 elf32-metag.c:2251
-#: elf32-nds32.c:5543 elfnn-aarch64.c:7928 elfnn-riscv.c:723
+#: elf32-arc.c:2036 elf32-arc.c:2104 elf32-arm.c:15580 elf32-metag.c:2251
+#: elf32-nds32.c:5543 elfnn-aarch64.c:7928
+#: elfnn-riscv.c:723
 #, c-format
 msgid ""
 "%pB: relocation %s against `%s' can not be used when making a shared object; "
 "recompile with -fPIC"
 msgstr ""
 
-#: elf32-arc.c:2910
+#: elf32-arc.c:2923
 #, c-format
 msgid "%pB: unknown mandatory ARC object attribute %d"
 msgstr ""
 
-#: elf32-arc.c:2918
+#: elf32-arc.c:2931
 #, c-format
 msgid "warning: %pB: unknown ARC object attribute %d"
 msgstr ""
@@ -1651,8 +1666,8 @@ msgstr ""
 #: elf32-arm.c:4591
 #, c-format
 msgid ""
-"ERROR: CMSE stub (%s section) too far (%#<PRIx64>) from destination (%"
-"#<PRIx64>)"
+"ERROR: CMSE stub (%s section) too far (%#<PRIx64>) from destination "
+"(%#<PRIx64>)"
 msgstr ""
 
 #: elf32-arm.c:4760
@@ -1662,14 +1677,15 @@ msgstr ""
 
 #: elf32-arm.c:4835 elf32-arm.c:6984 elf32-csky.c:3389 elf32-hppa.c:582
 #: elf32-m68hc1x.c:164 elf32-metag.c:1180 elf32-nios2.c:2201 elf64-ppc.c:3907
-#: elf64-ppc.c:14142 elfnn-aarch64.c:3203
+#: elf64-ppc.c:14157 elfnn-aarch64.c:3203
+#: elfnn-kvx.c:895
 #, c-format
 msgid "%pB: cannot create stub entry %s"
 msgstr ""
 
 #: elf32-arm.c:5056 elf32-csky.c:3731 elf32-hppa.c:732 elf32-hppa.c:761
 #: elf32-hppa.c:842 elf32-m68hc11.c:422 elf32-m68hc12.c:542 elf32-metag.c:3345
-#: elf32-nios2.c:2494 elf64-ppc.c:12258 elf64-ppc.c:12266 xcofflink.c:4684
+#: elf32-nios2.c:2494 elf64-ppc.c:12273 elf64-ppc.c:12281 xcofflink.c:4684
 #: elfnn-aarch64.c:3275
 msgid ""
 "%F%P: Could not assign `%pA' to an output section. Retry without --enable-"
@@ -1831,12 +1847,7 @@ msgid ""
 "when making a %s; recompile with -fPIC"
 msgstr ""
 
-#: elf32-arm.c:10649
-#, c-format
-msgid "\\%pB: warning: %s BLX instruction targets %s function '%s'"
-msgstr ""
-
-#: elf32-arm.c:11066
+#: elf32-arm.c:10649 elf32-arm.c:11066
 #, c-format
 msgid "%pB: warning: %s BLX instruction targets %s function '%s'"
 msgstr ""
@@ -1898,27 +1909,33 @@ msgstr ""
 
 #: elf32-arm.c:13343 elf32-m68k.c:3966 elf32-xtensa.c:2761
 #: elfnn-aarch64.c:7018
+#: elfnn-kvx.c:2571
 #, c-format
 msgid "%pB(%pA+%#<PRIx64>): %s used with TLS symbol %s"
 msgstr ""
 
 #: elf32-arm.c:13345 elf32-m68k.c:3968 elf32-xtensa.c:2763
 #: elfnn-aarch64.c:7020
+#: elfnn-kvx.c:2573
 #, c-format
 msgid "%pB(%pA+%#<PRIx64>): %s used with non-TLS symbol %s"
 msgstr ""
 
-#: elf32-arm.c:13428 elf32-tic6x.c:2649 elfnn-aarch64.c:7355
+#: elf32-arm.c:13428 elf32-tic6x.c:2649
+#: elfnn-aarch64.c:7355
+#: elfnn-kvx.c:2800
 msgid "out of range"
 msgstr ""
 
 #: elf32-arm.c:13432 elf32-nios2.c:4511 elf32-pru.c:936 elf32-tic6x.c:2653
 #: elfnn-aarch64.c:7359
+#: elfnn-kvx.c:2804
 msgid "unsupported relocation"
 msgstr ""
 
 #: elf32-arm.c:13440 elf32-nios2.c:4521 elf32-pru.c:946 elf32-tic6x.c:2661
 #: elfnn-aarch64.c:7367
+#: elfnn-kvx.c:2812
 msgid "unknown error"
 msgstr ""
 
@@ -1956,9 +1973,9 @@ msgstr ""
 msgid "error: %pB: unknown CPU architecture"
 msgstr ""
 
-#: elf32-arm.c:14439 elf32-nios2.c:2950
+#: elf32-arm.c:14439
 #, c-format
-msgid "error: %pB: conflicting CPU architectures %d/%d"
+msgid "error: conflicting CPU architectures %s vs %s in %pB"
 msgstr ""
 
 #: elf32-arm.c:14536
@@ -1972,306 +1989,308 @@ msgstr ""
 msgid "error: %pB uses VFP register arguments, %pB does not"
 msgstr ""
 
-#: elf32-arm.c:14742
+#: elf32-arm.c:14743
 #, c-format
 msgid "error: %pB: unable to merge virtualization attributes with %pB"
 msgstr ""
 
-#: elf32-arm.c:14768
+#: elf32-arm.c:14769
 #, c-format
 msgid "error: %pB: conflicting architecture profiles %c/%c"
 msgstr ""
 
-#: elf32-arm.c:14907
+#: elf32-arm.c:14908
 #, c-format
 msgid "warning: %pB: conflicting platform configuration"
 msgstr ""
 
-#: elf32-arm.c:14916
+#: elf32-arm.c:14917
 #, c-format
 msgid "error: %pB: conflicting use of R9"
 msgstr ""
 
-#: elf32-arm.c:14928
+#: elf32-arm.c:14929
 #, c-format
 msgid "error: %pB: SB relative addressing conflicts with use of R9"
 msgstr ""
 
-#: elf32-arm.c:14941
+#: elf32-arm.c:14942
 #, c-format
 msgid ""
 "warning: %pB uses %u-byte wchar_t yet the output is to use %u-byte wchar_t; "
 "use of wchar_t values across objects may fail"
 msgstr ""
 
-#: elf32-arm.c:14972
+#: elf32-arm.c:14973
 #, c-format
 msgid ""
 "warning: %pB uses %s enums yet the output is to use %s enums; use of enum "
 "values across objects may fail"
 msgstr ""
 
-#: elf32-arm.c:14984
+#: elf32-arm.c:14985
 #, c-format
 msgid "error: %pB uses iWMMXt register arguments, %pB does not"
 msgstr ""
 
-#: elf32-arm.c:15001
+#: elf32-arm.c:15002
 #, c-format
 msgid "error: fp16 format mismatch between %pB and %pB"
 msgstr ""
 
-#: elf32-arm.c:15037
+#: elf32-arm.c:15038
 #, c-format
 msgid "%pB has both the current and legacy Tag_MPextension_use attributes"
 msgstr ""
 
-#: elf32-arm.c:15133
+#: elf32-arm.c:15134
 #, c-format
 msgid " [interworking enabled]"
 msgstr ""
 
-#: elf32-arm.c:15141
+#: elf32-arm.c:15142
 #, c-format
 msgid " [VFP float format]"
 msgstr ""
 
-#: elf32-arm.c:15143
+#: elf32-arm.c:15144
 #, c-format
 msgid " [Maverick float format]"
 msgstr ""
 
-#: elf32-arm.c:15145
+#: elf32-arm.c:15146
 #, c-format
 msgid " [FPA float format]"
 msgstr ""
 
-#: elf32-arm.c:15148
+#: elf32-arm.c:15149
 #, c-format
 msgid " [floats passed in float registers]"
 msgstr ""
 
-#: elf32-arm.c:15151 elf32-arm.c:15237
+#: elf32-arm.c:15152 elf32-arm.c:15238
 #, c-format
 msgid " [position independent]"
 msgstr ""
 
-#: elf32-arm.c:15154
+#: elf32-arm.c:15155
 #, c-format
 msgid " [new ABI]"
 msgstr ""
 
-#: elf32-arm.c:15157
+#: elf32-arm.c:15158
 #, c-format
 msgid " [old ABI]"
 msgstr ""
 
-#: elf32-arm.c:15160
+#: elf32-arm.c:15161
 #, c-format
 msgid " [software FP]"
 msgstr ""
 
-#: elf32-arm.c:15169
+#: elf32-arm.c:15170
 #, c-format
 msgid " [Version1 EABI]"
 msgstr ""
 
-#: elf32-arm.c:15172 elf32-arm.c:15183
+#: elf32-arm.c:15173 elf32-arm.c:15184
 #, c-format
 msgid " [sorted symbol table]"
 msgstr ""
 
-#: elf32-arm.c:15174 elf32-arm.c:15185
+#: elf32-arm.c:15175 elf32-arm.c:15186
 #, c-format
 msgid " [unsorted symbol table]"
 msgstr ""
 
-#: elf32-arm.c:15180
+#: elf32-arm.c:15181
 #, c-format
 msgid " [Version2 EABI]"
 msgstr ""
 
-#: elf32-arm.c:15188
+#: elf32-arm.c:15189
 #, c-format
 msgid " [dynamic symbols use segment index]"
 msgstr ""
 
-#: elf32-arm.c:15191
+#: elf32-arm.c:15192
 #, c-format
 msgid " [mapping symbols precede others]"
 msgstr ""
 
-#: elf32-arm.c:15198
+#: elf32-arm.c:15199
 #, c-format
 msgid " [Version3 EABI]"
 msgstr ""
 
-#: elf32-arm.c:15202
+#: elf32-arm.c:15203
 #, c-format
 msgid " [Version4 EABI]"
 msgstr ""
 
-#: elf32-arm.c:15206
+#: elf32-arm.c:15207
 #, c-format
 msgid " [Version5 EABI]"
 msgstr ""
 
-#: elf32-arm.c:15209
+#: elf32-arm.c:15210
 #, c-format
 msgid " [soft-float ABI]"
 msgstr ""
 
-#: elf32-arm.c:15212
+#: elf32-arm.c:15213
 #, c-format
 msgid " [hard-float ABI]"
 msgstr ""
 
-#: elf32-arm.c:15218
+#: elf32-arm.c:15219
 #, c-format
 msgid " [BE8]"
 msgstr ""
 
-#: elf32-arm.c:15221
+#: elf32-arm.c:15222
 #, c-format
 msgid " [LE8]"
 msgstr ""
 
-#: elf32-arm.c:15227
+#: elf32-arm.c:15228
 #, c-format
 msgid " <EABI version unrecognised>"
 msgstr ""
 
-#: elf32-arm.c:15234
+#: elf32-arm.c:15235
 #, c-format
 msgid " [relocatable executable]"
 msgstr ""
 
-#: elf32-arm.c:15240
+#: elf32-arm.c:15241
 #, c-format
 msgid " [FDPIC ABI supplement]"
 msgstr ""
 
-#: elf32-arm.c:15245 elfnn-aarch64.c:7524
+#: elf32-arm.c:15246 elfnn-aarch64.c:7524
 #, c-format
 msgid " <Unrecognised flag bits set>"
 msgstr ""
 
-#: elf32-arm.c:15362 elf32-arm.c:15496 elf32-i386.c:1525 elf32-s390.c:923
-#: elf32-tic6x.c:2724 elf32-tilepro.c:1435 elf32-xtensa.c:1090
-#: elf64-s390.c:845 elf64-x86-64.c:1975 elfxx-sparc.c:1386 elfxx-tilegx.c:1662
-#: elfxx-x86.c:970 elfnn-aarch64.c:7795 elfnn-loongarch.c:637
+#: elf32-arm.c:15363 elf32-arm.c:15497 elf32-i386.c:1531 elf32-s390.c:923
+#: elf32-tic6x.c:2724 elf32-tilepro.c:1435 elf32-xtensa.c:1090 elf64-s390.c:845
+#: elf64-x86-64.c:1975 elfxx-sparc.c:1386 elfxx-tilegx.c:1662 elfxx-x86.c:970
+#: elfnn-aarch64.c:7795
+#: elfnn-kvx.c:3250
+#: elfnn-loongarch.c:637
 #: elfnn-riscv.c:767
 #, c-format
 msgid "%pB: bad symbol index: %d"
 msgstr ""
 
-#: elf32-arm.c:15752
+#: elf32-arm.c:15753
 #, c-format
 msgid ""
 "FDPIC does not yet support %s relocation to become dynamic for executable"
 msgstr ""
 
-#: elf32-arm.c:17026
+#: elf32-arm.c:17027
 #, c-format
 msgid "errors encountered processing file %pB"
 msgstr ""
 
-#: elf32-arm.c:17399 elflink.c:13271 elflink.c:13318
+#: elf32-arm.c:17400 elflink.c:13274 elflink.c:13321
 #, c-format
 msgid "could not find section %s"
 msgstr ""
 
-#: elf32-arm.c:18354
+#: elf32-arm.c:18355
 #, c-format
 msgid "%pB: Number of symbols in input file has increased from %lu to %u\n"
 msgstr ""
 
-#: elf32-arm.c:18618
+#: elf32-arm.c:18619
 #, c-format
 msgid "%pB: error: Cortex-A8 erratum stub is allocated in unsafe location"
 msgstr ""
 
 #. There's not much we can do apart from complain if this
 #. happens.
-#: elf32-arm.c:18645
+#: elf32-arm.c:18646
 #, c-format
 msgid "%pB: error: Cortex-A8 erratum stub out of range (input file too large)"
 msgstr ""
 
-#: elf32-arm.c:19472 elf32-arm.c:19494
+#: elf32-arm.c:19473 elf32-arm.c:19495
 #, c-format
 msgid "%pB: error: VFP11 veneer out of range"
 msgstr ""
 
-#: elf32-arm.c:19545
+#: elf32-arm.c:19546
 #, c-format
 msgid ""
 "%pB(%#<PRIx64>): error: cannot create STM32L4XX veneer; jump out of range by "
 "%<PRId64> bytes; cannot encode branch instruction"
 msgstr ""
 
-#: elf32-arm.c:19584
+#: elf32-arm.c:19585
 #, c-format
 msgid "%pB: error: cannot create STM32L4XX veneer"
 msgstr ""
 
-#: elf32-arm.c:20659
+#: elf32-arm.c:20668
 #, c-format
 msgid "error: %pB is already in final BE8 format"
 msgstr ""
 
-#: elf32-arm.c:20735
+#: elf32-arm.c:20745
 #, c-format
 msgid ""
 "error: source object %pB has EABI version %d, but target %pB has EABI "
 "version %d"
 msgstr ""
 
-#: elf32-arm.c:20750
+#: elf32-arm.c:20760
 #, c-format
 msgid "error: %pB is compiled for APCS-%d, whereas target %pB uses APCS-%d"
 msgstr ""
 
-#: elf32-arm.c:20760
+#: elf32-arm.c:20770
 #, c-format
 msgid ""
 "error: %pB passes floats in float registers, whereas %pB passes them in "
 "integer registers"
 msgstr ""
 
-#: elf32-arm.c:20764
+#: elf32-arm.c:20774
 #, c-format
 msgid ""
 "error: %pB passes floats in integer registers, whereas %pB passes them in "
 "float registers"
 msgstr ""
 
-#: elf32-arm.c:20774 elf32-arm.c:20778 elf32-arm.c:20788
+#: elf32-arm.c:20784 elf32-arm.c:20788 elf32-arm.c:20798
 #, c-format
 msgid "error: %pB uses %s instructions, whereas %pB does not"
 msgstr ""
 
-#: elf32-arm.c:20792
+#: elf32-arm.c:20802
 #, c-format
 msgid "error: %pB does not use %s instructions, whereas %pB does"
 msgstr ""
 
-#: elf32-arm.c:20811
+#: elf32-arm.c:20821
 #, c-format
 msgid "error: %pB uses software FP, whereas %pB uses hardware FP"
 msgstr ""
 
-#: elf32-arm.c:20815
+#: elf32-arm.c:20825
 #, c-format
 msgid "error: %pB uses hardware FP, whereas %pB uses software FP"
 msgstr ""
 
-#: elf32-arm.c:20829
+#: elf32-arm.c:20839
 #, c-format
 msgid "warning: %pB supports interworking, whereas %pB does not"
 msgstr ""
 
-#: elf32-arm.c:20835
+#: elf32-arm.c:20845
 #, c-format
 msgid "warning: %pB does not support interworking, whereas %pB does"
 msgstr ""
@@ -2303,7 +2322,7 @@ msgstr ""
 msgid "%pB(%pA+%#<PRIx64>): unresolvable relocation against symbol `%s'"
 msgstr ""
 
-#: elf32-bfin.c:1621 elf32-i386.c:3524 elf32-m68k.c:4006 elf32-s390.c:3138
+#: elf32-bfin.c:1621 elf32-i386.c:3530 elf32-m68k.c:4006 elf32-s390.c:3138
 #: elf64-s390.c:3118 elf64-x86-64.c:4264
 #, c-format
 msgid "%pB(%pA+%#<PRIx64>): reloc against `%s': error %d"
@@ -2348,7 +2367,7 @@ msgstr ""
 #: elf32-frv.c:4057 elf32-ft32.c:500 elf32-ip2k.c:1489 elf32-iq2000.c:699
 #: elf32-m32c.c:632 elf32-mep.c:530 elf32-metag.c:1992 elf32-moxie.c:296
 #: elf32-msp430.c:1514 elf32-mt.c:406 elf32-or1k.c:1905 elf32-tilepro.c:3380
-#: elf32-v850.c:2302 elf32-visium.c:688 elf32-xstormy16.c:938 elf64-bpf.c:344
+#: elf32-v850.c:2302 elf32-visium.c:688 elf32-xstormy16.c:938 elf64-bpf.c:347
 #: elf64-mmix.c:1549 elfxx-tilegx.c:3750
 msgid "internal error: dangerous relocation"
 msgstr ""
@@ -2356,7 +2375,7 @@ msgstr ""
 #. Ignore init flag - it may not be set, despite the flags field containing valid data.
 #: elf32-bfin.c:4728 elf32-cris.c:3862 elf32-m68hc1x.c:1415 elf32-m68k.c:1265
 #: elf32-score.c:3987 elf32-score7.c:3794 elf32-vax.c:536 elf32-xgate.c:494
-#: elfxx-mips.c:16371
+#: elfxx-mips.c:16373
 #, c-format
 msgid "private flags = %lx:"
 msgstr ""
@@ -2749,85 +2768,89 @@ msgstr ""
 #: elf32-i386.c:1177 elf64-x86-64.c:1462
 #, c-format
 msgid ""
-"%pB: TLS transition from %s to %s against `%s' at %#<PRIx64> in section `%"
-"pA' failed"
+"%pB: TLS transition from %s to %s against `%s' at %#<PRIx64> in section "
+"`%pA' failed"
 msgstr ""
 
-#: elf32-i386.c:1280
+#: elf32-i386.c:1286
 #, c-format
 msgid ""
 "%pB: direct GOT relocation R_386_GOT32X against `%s' without base register "
 "can not be used when making a shared object"
 msgstr ""
 
-#: elf32-i386.c:1709 elf32-s390.c:1151 elf32-sh.c:5499 elf32-tilepro.c:1548
-#: elf32-xtensa.c:1263 elf64-s390.c:1083 elfxx-sparc.c:1556
-#: elfxx-tilegx.c:1767 elfnn-loongarch.c:591 elfnn-riscv.c:674
+#: elf32-i386.c:1715 elf32-s390.c:1151 elf32-sh.c:5499 elf32-tilepro.c:1548
+#: elf32-xtensa.c:1263 elf64-s390.c:1083 elfxx-sparc.c:1556 elfxx-tilegx.c:1767
+#: elfnn-loongarch.c:591
+#: elfnn-riscv.c:674
 #, c-format
 msgid "%pB: `%s' accessed both as normal and thread local symbol"
 msgstr ""
 
-#: elf32-i386.c:1781
+#: elf32-i386.c:1787
 #, c-format
 msgid "%pB: unsupported non-PIC call to IFUNC `%s'"
 msgstr ""
 
-#: elf32-i386.c:1836 elf64-x86-64.c:2355
+#: elf32-i386.c:1842 elf64-x86-64.c:2355
 #, c-format
 msgid ""
 "%pB: non-canonical reference to canonical protected function `%s' in %pB"
 msgstr ""
 
-#: elf32-i386.c:2400 elf64-x86-64.c:2818 elfnn-riscv.c:2458
+#: elf32-i386.c:2406 elf64-x86-64.c:2818
+#: elfnn-riscv.c:2458
 #, c-format
 msgid "%pB: relocation %s against STT_GNU_IFUNC symbol `%s' isn't supported"
 msgstr ""
 
-#: elf32-i386.c:2433 elf32-i386.c:3735 elf32-i386.c:3883 elf64-x86-64.c:2875
-#: elf64-x86-64.c:4437 elf64-x86-64.c:4600 elfnn-riscv.c:2331
-#: elfnn-riscv.c:3161 elfnn-riscv.c:3235
+#: elf32-i386.c:2439 elf32-i386.c:3741 elf32-i386.c:3889 elf64-x86-64.c:2875
+#: elf64-x86-64.c:4437 elf64-x86-64.c:4605
+#: elfnn-riscv.c:2331
+#: elfnn-riscv.c:3161
+#: elfnn-riscv.c:3235
 #, c-format
 msgid "Local IFUNC function `%s' in %pB\n"
 msgstr ""
 
-#: elf32-i386.c:2611
+#: elf32-i386.c:2617
 #, c-format
 msgid ""
 "%pB: direct GOT relocation %s against `%s' without base register can not be "
 "used when making a shared object"
 msgstr ""
 
-#: elf32-i386.c:2646 elf64-x86-64.c:3089
+#: elf32-i386.c:2652 elf64-x86-64.c:3089
 msgid "hidden symbol"
 msgstr ""
 
-#: elf32-i386.c:2649 elf64-x86-64.c:3092
+#: elf32-i386.c:2655 elf64-x86-64.c:3092
 msgid "internal symbol"
 msgstr ""
 
-#: elf32-i386.c:2652 elf64-x86-64.c:3095
+#: elf32-i386.c:2658 elf64-x86-64.c:3095
 msgid "protected symbol"
 msgstr ""
 
-#: elf32-i386.c:2655 elf64-x86-64.c:3098
+#: elf32-i386.c:2661 elf64-x86-64.c:3098
 msgid "symbol"
 msgstr ""
 
-#: elf32-i386.c:2661
+#: elf32-i386.c:2667
 #, c-format
 msgid ""
 "%pB: relocation R_386_GOTOFF against undefined %s `%s' can not be used when "
 "making a shared object"
 msgstr ""
 
-#: elf32-i386.c:2674
+#: elf32-i386.c:2680
 #, c-format
 msgid ""
 "%pB: relocation R_386_GOTOFF against protected %s `%s' can not be used when "
 "making a shared object"
 msgstr ""
 
-#: elf32-i386.c:4086 elf64-x86-64.c:4811
+#: elf32-i386.c:4092 elf64-x86-64.c:4816
 msgid "%F%P: discarded output section: `%pA'\n"
 msgstr ""
 
@@ -2868,7 +2891,7 @@ msgstr ""
 msgid "SDA relocation when _SDA_BASE_ not defined"
 msgstr ""
 
-#: elf32-m32r.c:2776 elf32-microblaze.c:1134 elf32-microblaze.c:1182
+#: elf32-m32r.c:2776 elf32-microblaze.c:1152 elf32-microblaze.c:1200
 #, c-format
 msgid "%pB: the target (%s) of an %s relocation is in the wrong section (%pA)"
 msgstr ""
@@ -2922,8 +2945,8 @@ msgstr ""
 #: elf32-m68hc1x.c:1197
 #, c-format
 msgid ""
-"reference to a banked address [%lx:%04lx] in the normal address space at %"
-"04lx"
+"reference to a banked address [%lx:%04lx] in the normal address space at "
+"%04lx"
 msgstr ""
 
 #: elf32-m68hc1x.c:1233
@@ -3007,7 +3030,7 @@ msgstr ""
 msgid "%pB uses hard float, %pB uses soft float"
 msgstr ""
 
-#: elf32-m68k.c:1280 elf32-m68k.c:1281 vms-alpha.c:8061 vms-alpha.c:8077
+#: elf32-m68k.c:1280 elf32-m68k.c:1281 vms-alpha.c:8085 vms-alpha.c:8101
 msgid "unknown"
 msgstr ""
 
@@ -3059,7 +3082,7 @@ msgid ""
 "link"
 msgstr ""
 
-#: elf32-microblaze.c:1577 elf32-tilepro.c:3021 elfxx-sparc.c:3446
+#: elf32-microblaze.c:1595 elf32-tilepro.c:3021 elfxx-sparc.c:3446
 #: elfxx-tilegx.c:3415
 #, c-format
 msgid "%pB: probably compiled without -fPIC?"
@@ -3225,6 +3248,11 @@ msgstr ""
 msgid "error: %pB: big-endian R2 is not supported"
 msgstr ""
 
+#: elf32-nios2.c:2950
+#, c-format
+msgid "error: %pB: conflicting CPU architectures %d/%d"
+msgstr ""
+
 #: elf32-nios2.c:3825
 #, c-format
 msgid ""
@@ -3414,36 +3442,36 @@ msgstr ""
 msgid "%H arg lost __tls_get_addr, TLS optimization disabled\n"
 msgstr ""
 
-#: elf32-ppc.c:5567 elf32-sh.c:3019 elf32-tilepro.c:2248 elfxx-sparc.c:2454
+#: elf32-ppc.c:5565 elf32-sh.c:3019 elf32-tilepro.c:2248 elfxx-sparc.c:2454
 #: elfxx-tilegx.c:2494
 #, c-format
 msgid "%pB: dynamic relocation in read-only section `%pA'\n"
 msgstr ""
 
-#: elf32-ppc.c:7443
+#: elf32-ppc.c:7458
 msgid "%P: %H: error: %s with unexpected instruction %x\n"
 msgstr ""
 
-#: elf32-ppc.c:7481
+#: elf32-ppc.c:7496
 msgid "%H: fixup branch overflow\n"
 msgstr ""
 
-#: elf32-ppc.c:7521 elf32-ppc.c:7559
+#: elf32-ppc.c:7536 elf32-ppc.c:7574
 #, c-format
 msgid "%pB(%pA+%#<PRIx64>): error: %s with unexpected instruction %#x"
 msgstr ""
 
-#: elf32-ppc.c:7623
+#: elf32-ppc.c:7638
 #, c-format
 msgid "%X%H: unsupported bss-plt -fPIC ifunc %s\n"
 msgstr ""
 
-#: elf32-ppc.c:7659
+#: elf32-ppc.c:7674
 #, c-format
 msgid "%pB: reloc %#x unsupported"
 msgstr ""
 
-#: elf32-ppc.c:7947
+#: elf32-ppc.c:7957
 #, c-format
 msgid "%H: non-zero addend on %s reloc against `%s'\n"
 msgstr ""
@@ -3456,54 +3484,54 @@ msgstr ""
 #. local won't have the +32k reloc addend trick marking
 #. -fPIC code, so the linker won't know whether r30 is
 #. _GLOBAL_OFFSET_TABLE_ or pointing into a .got2 section.
-#: elf32-ppc.c:7979
+#: elf32-ppc.c:7989
 #, c-format
 msgid "%X%H: @local call to ifunc %s\n"
 msgstr ""
 
-#: elf32-ppc.c:8158
+#: elf32-ppc.c:8167
 #, c-format
 msgid "%H: relocation %s for indirect function %s unsupported\n"
 msgstr ""
 
-#: elf32-ppc.c:8497 elf32-ppc.c:8528 elf32-ppc.c:8631 elf32-ppc.c:8731
+#: elf32-ppc.c:8505 elf32-ppc.c:8536 elf32-ppc.c:8639 elf32-ppc.c:8739
 #, c-format
 msgid ""
 "%pB: the target (%s) of a %s relocation is in the wrong output section (%s)"
 msgstr ""
 
-#: elf32-ppc.c:8909 elf32-ppc.c:8930
+#: elf32-ppc.c:8917 elf32-ppc.c:8938
 msgid "%X%P: %H: %s relocation unsupported for bss-plt\n"
 msgstr ""
 
-#: elf32-ppc.c:9012
+#: elf32-ppc.c:9020
 #, c-format
 msgid "%H: error: %s against `%s' not a multiple of %u\n"
 msgstr ""
 
-#: elf32-ppc.c:9041
+#: elf32-ppc.c:9049
 #, c-format
 msgid "%H: unresolvable %s relocation against symbol `%s'\n"
 msgstr ""
 
-#: elf32-ppc.c:9123
+#: elf32-ppc.c:9131
 #, c-format
 msgid "%H: %s reloc against `%s': error %d\n"
 msgstr ""
 
-#: elf32-ppc.c:10004
+#: elf32-ppc.c:10013
 msgid ""
 "%X%P: text relocations and GNU indirect functions will result in a segfault "
 "at runtime\n"
 msgstr ""
 
-#: elf32-ppc.c:10008 elf64-ppc.c:18302
+#: elf32-ppc.c:10017 elf64-ppc.c:18302
 msgid ""
 "%P: warning: text relocations and GNU indirect functions may result in a "
 "segfault at runtime\n"
 msgstr ""
 
-#: elf32-ppc.c:10053
+#: elf32-ppc.c:10062
 #, c-format
 msgid "%s not defined in linker created %pA"
 msgstr ""
@@ -3698,8 +3726,8 @@ msgstr ""
 #: elf32-sh.c:4579
 #, c-format
 msgid ""
-"%pB(%pA): offset in relocation for GD->LE translation is too small: %"
-"#<PRIx64>"
+"%pB(%pA): offset in relocation for GD->LE translation is too small: "
+"%#<PRIx64>"
 msgstr ""
 
 #. The backslash is to prevent bogus trigraph detection.
@@ -3736,8 +3764,8 @@ msgstr ""
 #: elf32-sh.c:4668
 #, c-format
 msgid ""
-"%pB(%pA): offset in relocation for IE->LE translation is too small: %"
-"#<PRIx64>"
+"%pB(%pA): offset in relocation for IE->LE translation is too small: "
+"%#<PRIx64>"
 msgstr ""
 
 #: elf32-sh.c:4686
@@ -3761,25 +3789,25 @@ msgstr ""
 #: elf32-sh.c:4817
 #, c-format
 msgid ""
-"%pB(%pA): offset in relocation for GD->IE translation is too small: %"
-"#<PRIx64>"
+"%pB(%pA): offset in relocation for GD->IE translation is too small: "
+"%#<PRIx64>"
 msgstr ""
 
 #: elf32-sh.c:4885
 #, c-format
 msgid ""
-"%pB(%pA): offset in relocation for LD->LE translation is too small: %"
-"#<PRIx64>"
+"%pB(%pA): offset in relocation for LD->LE translation is too small: "
+"%#<PRIx64>"
 msgstr ""
 
 #: elf32-sh.c:5013
 #, c-format
-msgid "%X%C: relocation to \"%s\" references a different segment\n"
+msgid "%X%H: relocation to \"%s\" references a different segment\n"
 msgstr ""
 
 #: elf32-sh.c:5020
 #, c-format
-msgid "%C: warning: relocation to \"%s\" references a different segment\n"
+msgid "%H: warning: relocation to \"%s\" references a different segment\n"
 msgstr ""
 
 #: elf32-sh.c:5488 elf32-sh.c:5570
@@ -3888,7 +3916,7 @@ msgstr ""
 msgid "overlay stub relocation overflow"
 msgstr ""
 
-#: elf32-spu.c:1992 elf64-ppc.c:15328
+#: elf32-spu.c:1992 elf64-ppc.c:15341
 msgid "stubs don't match calculated size"
 msgstr ""
 
@@ -4035,8 +4063,11 @@ msgstr ""
 msgid "warning: %pB and %pB differ in whether code is compiled for DSBT"
 msgstr ""
 
-#: elf32-tilepro.c:3627 elfxx-tilegx.c:4017 elfxx-x86.c:2710
-#: elfnn-aarch64.c:9999 elfnn-loongarch.c:4317 elfnn-riscv.c:3458
+#: elf32-tilepro.c:3627 elfxx-tilegx.c:4017 elfxx-x86.c:2729
+#: elfnn-aarch64.c:9999
+#: elfnn-kvx.c:4636
+#: elfnn-loongarch.c:4357
+#: elfnn-riscv.c:3458
 #, c-format
 msgid "discarded output section: `%pA'"
 msgstr ""
@@ -4311,7 +4342,8 @@ msgstr ""
 msgid "error reading cpu type from elf private data"
 msgstr ""
 
-#: elf32-xstormy16.c:457 elf64-ia64-vms.c:2077 elfnn-ia64.c:2346
+#: elf32-xstormy16.c:457 elf64-ia64-vms.c:2077
+#: elfnn-ia64.c:2346
 msgid "non-zero addend in @fptr reloc"
 msgstr ""
 
@@ -4392,10 +4424,10 @@ msgstr ""
 msgid "GPDISP relocation did not find ldah and lda instructions"
 msgstr ""
 
-#: elf64-alpha.c:1985 elf64-alpha.c:2680 elflink.c:15427
-#: elfnn-loongarch.c:1573
+#: elf64-alpha.c:1985
 #, c-format
-msgid "%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"
+msgid ""
+"%pB: dynamic relocation against a local symbol in read-only section `%pA'\n"
 msgstr ""
 
 #: elf64-alpha.c:2437
@@ -4403,6 +4435,13 @@ msgstr ""
 msgid "%pB: .got subsegment exceeds 64K (size %d)"
 msgstr ""
 
+#: elf64-alpha.c:2680 elflink.c:15430
+#: elfnn-kvx.c:4022
+#: elfnn-loongarch.c:1573
+#, c-format
+msgid "%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"
+msgstr ""
+
 #: elf64-alpha.c:2975 elf64-alpha.c:3170
 #, c-format
 msgid "%pB: %pA+%#<PRIx64>: warning: %s relocation against unexpected insn"
@@ -4418,7 +4457,9 @@ msgstr ""
 msgid "%pB: change in gp: BRSGP %s"
 msgstr ""
 
-#: elf64-alpha.c:4464 mach-o.c:625 elfnn-riscv.c:725 elfnn-riscv.c:924
+#: elf64-alpha.c:4464 mach-o.c:625
+#: elfnn-riscv.c:725
+#: elfnn-riscv.c:924
 #: elfnn-riscv.c:966
 msgid "<unknown>"
 msgstr ""
@@ -4449,7 +4490,7 @@ msgid "%pB: tp-relative relocation against dynamic symbol %s"
 msgstr ""
 
 #. Only if it's not an unresolved symbol.
-#: elf64-bpf.c:340
+#: elf64-bpf.c:343
 msgid "internal error: relocation not supported"
 msgstr ""
 
@@ -4533,8 +4574,8 @@ msgstr ""
 #: elf64-ia64-vms.c:3967 elfnn-ia64.c:4481
 #, c-format
 msgid ""
-"%pB: Can't relax br (%s) to `%s' at %#<PRIx64> in section `%pA' with size %"
-"#<PRIx64> (> 0x1000000)."
+"%pB: Can't relax br (%s) to `%s' at %#<PRIx64> in section `%pA' with size "
+"%#<PRIx64> (> 0x1000000)."
 msgstr ""
 
 #: elf64-ia64-vms.c:4263 elfnn-ia64.c:4742
@@ -4562,23 +4603,23 @@ msgstr ""
 msgid "%pB: linking auto-pic files with non-auto-pic files"
 msgstr ""
 
-#: elf64-ia64-vms.c:5147 elflink.c:5310
+#: elf64-ia64-vms.c:5150 elflink.c:5313
 #, c-format
 msgid ""
 "warning: alignment %u of common symbol `%s' in %pB is greater than the "
 "alignment (%u) of its section %pA"
 msgstr ""
 
-#: elf64-ia64-vms.c:5154
+#: elf64-ia64-vms.c:5157
 #, c-format
 msgid "warning: alignment %u of symbol `%s' in %pB is smaller than %u in %pB"
 msgstr ""
 
-#: elf64-ia64-vms.c:5170 elflink.c:5339
+#: elf64-ia64-vms.c:5173 elflink.c:5342
 #, c-format
 msgid ""
-"warning: size of symbol `%s' changed from %<PRIu64> in %pB to %<PRIu64> in %"
-"pB"
+"warning: size of symbol `%s' changed from %<PRIu64> in %pB to %<PRIu64> in "
+"%pB"
 msgstr ""
 
 #: elf64-mips.c:4102
@@ -4768,52 +4809,52 @@ msgstr ""
 msgid "warning: discarding dynamic section %s"
 msgstr ""
 
-#: elf64-ppc.c:11650
+#: elf64-ppc.c:11668
 msgid "%P: cannot find opd entry toc for `%pT'\n"
 msgstr ""
 
-#: elf64-ppc.c:11800
+#: elf64-ppc.c:11818
 #, c-format
 msgid "long branch stub `%s' offset overflow"
 msgstr ""
 
-#: elf64-ppc.c:11827
+#: elf64-ppc.c:11845
 #, c-format
 msgid "can't find branch stub `%s'"
 msgstr ""
 
-#: elf64-ppc.c:11891 elf64-ppc.c:12143 elf64-ppc.c:14709
+#: elf64-ppc.c:11906 elf64-ppc.c:12158 elf64-ppc.c:14724
 #, c-format
 msgid "%P: linkage table error against `%pT'\n"
 msgstr ""
 
-#: elf64-ppc.c:12342
+#: elf64-ppc.c:12357
 #, c-format
 msgid "can't build branch stub `%s'"
 msgstr ""
 
-#: elf64-ppc.c:13369
+#: elf64-ppc.c:13384
 #, c-format
 msgid "%pB section %pA exceeds stub group size"
 msgstr ""
 
-#: elf64-ppc.c:14891
+#: elf64-ppc.c:14904
 msgid "__tls_get_addr call offset overflow"
 msgstr ""
 
-#: elf64-ppc.c:15231 elf64-ppc.c:15250
+#: elf64-ppc.c:15244 elf64-ppc.c:15263
 #, c-format
 msgid "%s offset too large for .eh_frame sdata4 encoding"
 msgstr ""
 
-#: elf64-ppc.c:15336
+#: elf64-ppc.c:15349
 #, c-format
 msgid "linker stubs in %u group"
 msgid_plural "linker stubs in %u groups"
 msgstr[0] ""
 msgstr[1] ""
 
-#: elf64-ppc.c:15343
+#: elf64-ppc.c:15356
 #, c-format
 msgid ""
 "%s, iter %u\n"
@@ -4823,59 +4864,59 @@ msgid ""
 "  global entry   %lu"
 msgstr ""
 
-#: elf64-ppc.c:15725
+#: elf64-ppc.c:15738
 #, c-format
 msgid "%H: %s used with TLS symbol `%pT'\n"
 msgstr ""
 
-#: elf64-ppc.c:15727
+#: elf64-ppc.c:15740
 #, c-format
 msgid "%H: %s used with non-TLS symbol `%pT'\n"
 msgstr ""
 
-#: elf64-ppc.c:16511
+#: elf64-ppc.c:16524
 #, c-format
 msgid "%H: call to `%pT' lacks nop, can't restore toc; (plt call stub)\n"
 msgstr ""
 
-#: elf64-ppc.c:16517
+#: elf64-ppc.c:16530
 #, c-format
 msgid ""
 "%H: call to `%pT' lacks nop, can't restore toc; (toc save/adjust stub)\n"
 msgstr ""
 
-#: elf64-ppc.c:17174
+#: elf64-ppc.c:17181
 #, c-format
 msgid "%H: %s against %pT is not supported\n"
 msgstr ""
 
-#: elf64-ppc.c:17450
+#: elf64-ppc.c:17457
 #, c-format
 msgid "%H: %s for indirect function `%pT' unsupported\n"
 msgstr ""
 
-#: elf64-ppc.c:17542
+#: elf64-ppc.c:17545
 #, c-format
 msgid ""
 "%X%P: %pB: %s against %pT is not supported by glibc as a dynamic relocation\n"
 msgstr ""
 
-#: elf64-ppc.c:17597
+#: elf64-ppc.c:17600
 #, c-format
 msgid "%P: %pB: %s is not supported for `%pT'\n"
 msgstr ""
 
-#: elf64-ppc.c:17866
+#: elf64-ppc.c:17869
 #, c-format
 msgid "%H: error: %s not a multiple of %u\n"
 msgstr ""
 
-#: elf64-ppc.c:17889
+#: elf64-ppc.c:17892
 #, c-format
 msgid "%H: unresolvable %s against `%pT'\n"
 msgstr ""
 
-#: elf64-ppc.c:18034
+#: elf64-ppc.c:18037
 #, c-format
 msgid "%H: %s against `%pT': error %d\n"
 msgstr ""
@@ -4893,7 +4934,7 @@ msgid ""
 "%pB(%pA+%#<PRIx64>): misaligned symbol `%s' (%#<PRIx64>) for relocation %s"
 msgstr ""
 
-#: elf64-sparc.c:134 elfcode.h:1582
+#: elf64-sparc.c:134 elfcode.h:1596
 #, c-format
 msgid "%pB(%pA): relocation %d has invalid symbol index %ld"
 msgstr ""
@@ -4978,11 +5019,12 @@ msgstr ""
 msgid "%pB: '%s' accessed both as normal and thread local symbol"
 msgstr ""
 
-#: elf64-x86-64.c:2844 elfnn-aarch64.c:5723 elfnn-riscv.c:2298
+#: elf64-x86-64.c:2844 elfnn-aarch64.c:5723
+#: elfnn-riscv.c:2298
 #, c-format
 msgid ""
-"%pB: relocation %s against STT_GNU_IFUNC symbol `%s' has non-zero addend: %"
-"<PRId64>"
+"%pB: relocation %s against STT_GNU_IFUNC symbol `%s' has non-zero addend: "
+"%<PRId64>"
 msgstr ""
 
 #: elf64-x86-64.c:3104
@@ -5006,7 +5048,7 @@ msgid ""
 "section `%pA' is out of range"
 msgstr ""
 
-#: elf64-x86-64.c:3556 elflink.c:13742
+#: elf64-x86-64.c:3556 elflink.c:13745
 msgid "%F%P: corrupt input: %pB\n"
 msgstr ""
 
@@ -5021,12 +5063,12 @@ msgstr ""
 msgid "%F%pB: PC-relative offset overflow in PLT entry for `%s'\n"
 msgstr ""
 
-#: elf64-x86-64.c:4479
+#: elf64-x86-64.c:4484
 #, c-format
 msgid "%F%pB: branch displacement overflow in PLT entry for `%s'\n"
 msgstr ""
 
-#: elf64-x86-64.c:4532
+#: elf64-x86-64.c:4537
 #, c-format
 msgid "%F%pB: PC-relative offset overflow in GOT PLT entry for `%s'\n"
 msgstr ""
@@ -5041,17 +5083,17 @@ msgstr ""
 msgid "warning: %pB has a corrupt string table index"
 msgstr ""
 
-#: elfcode.h:837
+#: elfcode.h:838
 #, c-format
 msgid "warning: %pB has a program header with invalid alignment"
 msgstr ""
 
-#: elfcode.h:1039
+#: elfcode.h:1050
 #, c-format
 msgid "%pB: %pA+%<PRIx64>: relocation addend %<PRIx64> too large"
 msgstr ""
 
-#: elfcode.h:1302
+#: elfcode.h:1316
 #, c-format
 msgid "%pB: version count (%<PRId64>) does not match symbol count (%ld)"
 msgstr ""
@@ -5105,8 +5147,8 @@ msgstr ""
 #: elflink.c:2704
 #, c-format
 msgid ""
-"%pB: non-zero symbol index (%#<PRIx64>) for offset %#<PRIx64> in section `%"
-"pA' when the object file has no symbol table"
+"%pB: non-zero symbol index (%#<PRIx64>) for offset %#<PRIx64> in section "
+"`%pA' when the object file has no symbol table"
 msgstr ""
 
 #: elflink.c:2915
@@ -5123,278 +5165,278 @@ msgstr ""
 msgid "%P: copy reloc against protected `%pT' is dangerous\n"
 msgstr ""
 
-#: elflink.c:4278
+#: elflink.c:4281
 #, c-format
 msgid "alternate ELF machine code found (%d) in %pB, expecting %d"
 msgstr ""
 
-#: elflink.c:4761
+#: elflink.c:4764
 #, c-format
 msgid "%pB: invalid version offset %lx (max %lx)"
 msgstr ""
 
-#: elflink.c:4829
+#: elflink.c:4832
 #, c-format
 msgid "%pB: %s local symbol at index %lu (>= sh_info of %lu)"
 msgstr ""
 
-#: elflink.c:4977
+#: elflink.c:4980
 #, c-format
 msgid "%pB: not enough version information"
 msgstr ""
 
-#: elflink.c:5015
+#: elflink.c:5018
 #, c-format
 msgid "%pB: %s: invalid version %u (max %d)"
 msgstr ""
 
-#: elflink.c:5052
+#: elflink.c:5055
 #, c-format
 msgid "%pB: %s: invalid needed version %d"
 msgstr ""
 
-#: elflink.c:5317
+#: elflink.c:5320
 #, c-format
 msgid ""
 "warning: alignment %u of normal symbol `%s' in %pB is smaller than %u used "
 "by the common definition in %pB"
 msgstr ""
 
-#: elflink.c:5324
+#: elflink.c:5327
 msgid ""
 "warning: NOTE: alignment discrepancies can cause real problems.  "
 "Investigation is advised."
 msgstr ""
 
-#: elflink.c:5346
+#: elflink.c:5349
 msgid ""
 "warning: NOTE: size discrepancies can cause real problems.  Investigation is "
 "advised."
 msgstr ""
 
-#: elflink.c:5488
+#: elflink.c:5491
 #, c-format
 msgid "%pB: undefined reference to symbol '%s'"
 msgstr ""
 
-#: elflink.c:6548
+#: elflink.c:6551
 #, c-format
 msgid "%pB: stack size specified and %s set"
 msgstr ""
 
-#: elflink.c:6552
+#: elflink.c:6555
 #, c-format
 msgid "%pB: %s not absolute"
 msgstr ""
 
-#: elflink.c:6764
+#: elflink.c:6767
 #, c-format
 msgid "%s: undefined version: %s"
 msgstr ""
 
-#: elflink.c:7153
+#: elflink.c:7156
 msgid ""
 "warning: enabling an executable stack because of -z execstack command line "
 "option"
 msgstr ""
 
-#: elflink.c:7210
+#: elflink.c:7213
 #, c-format
 msgid ""
 "warning: %s: requires executable stack (because the .note.GNU-stack section "
 "is executable)"
 msgstr ""
 
-#: elflink.c:7215
+#: elflink.c:7218
 #, c-format
 msgid "warning: %s: missing .note.GNU-stack section implies executable stack"
 msgstr ""
 
-#: elflink.c:7218
+#: elflink.c:7221
 msgid ""
 "NOTE: This behaviour is deprecated and will be removed in a future version "
 "of the linker"
 msgstr ""
 
-#: elflink.c:7372
+#: elflink.c:7375
 #, c-format
 msgid "%pB: .preinit_array section is not allowed in DSO"
 msgstr ""
 
-#: elflink.c:8963
+#: elflink.c:8966
 #, c-format
 msgid "undefined %s reference in complex symbol: %s"
 msgstr ""
 
-#: elflink.c:9126 elflink.c:9134
+#: elflink.c:9129 elflink.c:9137
 msgid "division by zero"
 msgstr ""
 
-#: elflink.c:9148
+#: elflink.c:9151
 #, c-format
 msgid "unknown operator '%c' in complex symbol"
 msgstr ""
 
 #. PR 21524: Let the user know if a symbol was removed by garbage collection.
-#: elflink.c:9484
+#: elflink.c:9487
 #, c-format
 msgid ""
 "%pB:%pA: error: relocation references symbol %s which was removed by garbage "
 "collection"
 msgstr ""
 
-#: elflink.c:9487
+#: elflink.c:9490
 #, c-format
 msgid "%pB:%pA: error: try relinking with --gc-keep-exported enabled"
 msgstr ""
 
-#: elflink.c:9738 elflink.c:9756 elflink.c:9795 elflink.c:9813
+#: elflink.c:9741 elflink.c:9759 elflink.c:9798 elflink.c:9816
 #, c-format
 msgid "%pB: unable to sort relocs - they are in more than one size"
 msgstr ""
 
 #. The section size is not divisible by either -
 #. something is wrong.
-#: elflink.c:9772 elflink.c:9829
+#: elflink.c:9775 elflink.c:9832
 #, c-format
 msgid "%pB: unable to sort relocs - they are of an unknown size"
 msgstr ""
 
-#: elflink.c:9881
+#: elflink.c:9884
 msgid "not enough memory to sort relocations"
 msgstr ""
 
-#: elflink.c:10219
+#: elflink.c:10222
 #, c-format
 msgid "%pB: too many sections: %d (>= %d)"
 msgstr ""
 
-#: elflink.c:10495
+#: elflink.c:10498
 #, c-format
 msgid "%pB: internal symbol `%s' in %pB is referenced by DSO"
 msgstr ""
 
-#: elflink.c:10498
+#: elflink.c:10501
 #, c-format
 msgid "%pB: hidden symbol `%s' in %pB is referenced by DSO"
 msgstr ""
 
-#: elflink.c:10501
+#: elflink.c:10504
 #, c-format
 msgid "%pB: local symbol `%s' in %pB is referenced by DSO"
 msgstr ""
 
-#: elflink.c:10587
+#: elflink.c:10590
 #, c-format
 msgid "%pB: could not find output section %pA for input section %pA"
 msgstr ""
 
-#: elflink.c:10741
+#: elflink.c:10744
 #, c-format
 msgid "%pB: protected symbol `%s' isn't defined"
 msgstr ""
 
-#: elflink.c:10744
+#: elflink.c:10747
 #, c-format
 msgid "%pB: internal symbol `%s' isn't defined"
 msgstr ""
 
-#: elflink.c:10747
+#: elflink.c:10750
 #, c-format
 msgid "%pB: hidden symbol `%s' isn't defined"
 msgstr ""
 
-#: elflink.c:10779
+#: elflink.c:10782
 #, c-format
 msgid "%pB: no symbol version section for versioned symbol `%s'"
 msgstr ""
 
-#: elflink.c:11460
+#: elflink.c:11463
 #, c-format
 msgid ""
 "error: %pB contains a reloc (%#<PRIx64>) for section %pA that references a "
 "non-existent global symbol"
 msgstr ""
 
-#: elflink.c:11930
+#: elflink.c:11933
 #, c-format
 msgid "error: %pB: size of section %pA is not multiple of address size"
 msgstr ""
 
-#: elflink.c:12207
+#: elflink.c:12210
 #, c-format
 msgid "%pB: no symbol found for import library"
 msgstr ""
 
-#: elflink.c:12782
+#: elflink.c:12785
 msgid "%F%P: %pB: failed to finish relative relocations\n"
 msgstr ""
 
-#: elflink.c:12859
+#: elflink.c:12862
 #, c-format
 msgid "%pB: file class %s incompatible with %s"
 msgstr ""
 
-#: elflink.c:13108
+#: elflink.c:13111
 #, c-format
 msgid "%pB: failed to generate import library"
 msgstr ""
 
-#: elflink.c:13276
+#: elflink.c:13279
 #, c-format
 msgid "warning: %s section has zero size"
 msgstr ""
 
-#: elflink.c:13324
+#: elflink.c:13327
 #, c-format
 msgid "warning: section '%s' is being made into a note"
 msgstr ""
 
-#: elflink.c:13418
+#: elflink.c:13421
 msgid "%P%X: read-only segment has dynamic relocations\n"
 msgstr ""
 
-#: elflink.c:13421
+#: elflink.c:13424
 msgid "%P: warning: creating DT_TEXTREL in a shared object\n"
 msgstr ""
 
-#: elflink.c:13424
+#: elflink.c:13427
 msgid "%P: warning: creating DT_TEXTREL in a PDE\n"
 msgstr ""
 
-#: elflink.c:13427
+#: elflink.c:13430
 msgid "%P: warning: creating DT_TEXTREL in a PIE\n"
 msgstr ""
 
-#: elflink.c:13563
+#: elflink.c:13566
 msgid "%P%X: can not read symbols: %E\n"
 msgstr ""
 
-#: elflink.c:13988
+#: elflink.c:13991
 msgid "%F%P: %pB(%pA): error: need linked-to section for --gc-sections\n"
 msgstr ""
 
-#: elflink.c:14466
+#: elflink.c:14469
 #, c-format
 msgid "%pB: %pA+%#<PRIx64>: no symbol found for INHERIT"
 msgstr ""
 
-#: elflink.c:14507
+#: elflink.c:14510
 #, c-format
 msgid "%pB: section '%pA': corrupt VTENTRY entry"
 msgstr ""
 
-#: elflink.c:14650
+#: elflink.c:14653
 #, c-format
 msgid "unrecognized INPUT_SECTION_FLAG %s\n"
 msgstr ""
 
-#: elflink.c:15433
+#: elflink.c:15436
 #, c-format
 msgid "%P: %pB: warning: relocation against `%s' in read-only section `%pA'\n"
 msgstr ""
 
-#: elflink.c:15522
+#: elflink.c:15525
 msgid ""
 "%P: warning: GNU indirect functions with DT_TEXTREL may result in a segfault "
 "at runtime; recompile with %s\n"
@@ -5406,7 +5448,8 @@ msgid ""
 "%pB: warning: Weak TLS is implementation defined and may not work as expected"
 msgstr ""
 
-#: elfxx-aarch64.c:738 elfnn-aarch64.c:10200 elfnn-aarch64.c:10207
+#: elfxx-aarch64.c:738 elfnn-aarch64.c:10200
+#: elfnn-aarch64.c:10207
 #, c-format
 msgid ""
 "%pB: warning: BTI turned on by -z force-bti when all inputs do not have BTI "
@@ -5418,17 +5461,17 @@ msgstr ""
 msgid "error: %pB: <corrupt AArch64 used size: 0x%x>"
 msgstr ""
 
-#: elfxx-loongarch.c:1590
+#: elfxx-loongarch.c:1584
 #, c-format
 msgid "%pB: unsupported relocation type %s"
 msgstr ""
 
-#: elfxx-loongarch.c:1619
+#: elfxx-loongarch.c:1613
 #, c-format
 msgid "%pB: unsupported bfd relocation type %#x"
 msgstr ""
 
-#: elfxx-loongarch.c:1638
+#: elfxx-loongarch.c:1632
 #, c-format
 msgid "%pB: unsupported relocation type name %s"
 msgstr ""
@@ -5438,8 +5481,7 @@ msgstr ""
 msgid "%pB: relocation %s right shift %d error 0x%lx"
 msgstr ""
 
-#: elfxx-loongarch.c:1699 elfxx-loongarch.c:1735 elfxx-loongarch.c:1770
-#: elfxx-loongarch.c:1807
+#: elfxx-loongarch.c:1708
 #, c-format
 msgid "%pB: relocation %s overflow 0x%lx"
 msgstr ""
@@ -5472,533 +5514,565 @@ msgstr ""
 msgid "%X%H: unsupported branch between ISA modes\n"
 msgstr ""
 
-#: elfxx-mips.c:7344
+#: elfxx-mips.c:7345
 #, c-format
 msgid ""
 "%pB: incorrect `.reginfo' section size; expected %<PRIu64>, got %<PRIu64>"
 msgstr ""
 
-#: elfxx-mips.c:7388
+#: elfxx-mips.c:7389
 #, c-format
 msgid "%pB: warning: bad `%s' option size %u smaller than its header"
 msgstr ""
 
-#: elfxx-mips.c:7624
+#: elfxx-mips.c:7625
 #, c-format
 msgid "%pB: warning: truncated `%s' option"
 msgstr ""
 
-#: elfxx-mips.c:8447 elfxx-mips.c:8573
+#: elfxx-mips.c:8449 elfxx-mips.c:8575
 #, c-format
 msgid ""
 "%pB: warning: cannot determine the target function for stub section `%s'"
 msgstr ""
 
-#: elfxx-mips.c:8705
+#: elfxx-mips.c:8707
 #, c-format
 msgid "%pB: malformed reloc detected for section %s"
 msgstr ""
 
-#: elfxx-mips.c:8805
+#: elfxx-mips.c:8807
 #, c-format
 msgid "%pB: GOT reloc at %#<PRIx64> not expected in executables"
 msgstr ""
 
-#: elfxx-mips.c:8945
+#: elfxx-mips.c:8947
 #, c-format
 msgid "%pB: CALL16 reloc at %#<PRIx64> not against global symbol"
 msgstr ""
 
-#: elfxx-mips.c:9248
+#: elfxx-mips.c:9250
 #, c-format
 msgid ""
 "%X%H: relocation %s against `%s' cannot be used when making a shared object; "
 "recompile with -fPIC\n"
 msgstr ""
 
-#: elfxx-mips.c:9374
+#: elfxx-mips.c:9376
 #, c-format
 msgid "IFUNC symbol %s in dynamic symbol table - IFUNCS are not supported"
 msgstr ""
 
-#: elfxx-mips.c:9377
+#: elfxx-mips.c:9379
 #, c-format
 msgid "non-dynamic symbol %s in dynamic symbol table"
 msgstr ""
 
-#: elfxx-mips.c:9597
+#: elfxx-mips.c:9599
 #, c-format
 msgid "non-dynamic relocations refer to dynamic symbol %s"
 msgstr ""
 
-#: elfxx-mips.c:10532
+#: elfxx-mips.c:10534
 #, c-format
 msgid ""
 "%pB: can't find matching LO16 reloc against `%s' for %s at %#<PRIx64> in "
 "section `%pA'"
 msgstr ""
 
-#: elfxx-mips.c:10672
+#: elfxx-mips.c:10674
 msgid ""
 "small-data section exceeds 64KB; lower small-data size limit (see option -G)"
 msgstr ""
 
-#: elfxx-mips.c:10691
+#: elfxx-mips.c:10693
 msgid "cannot convert a jump to JALX for a non-word-aligned address"
 msgstr ""
 
-#: elfxx-mips.c:10694
+#: elfxx-mips.c:10696
 msgid "jump to a non-word-aligned address"
 msgstr ""
 
-#: elfxx-mips.c:10695
+#: elfxx-mips.c:10697
 msgid "jump to a non-instruction-aligned address"
 msgstr ""
 
-#: elfxx-mips.c:10698
+#: elfxx-mips.c:10700
 msgid "cannot convert a branch to JALX for a non-word-aligned address"
 msgstr ""
 
-#: elfxx-mips.c:10700
+#: elfxx-mips.c:10702
 msgid "branch to a non-instruction-aligned address"
 msgstr ""
 
-#: elfxx-mips.c:10702
+#: elfxx-mips.c:10704
 msgid "PC-relative load from unaligned address"
 msgstr ""
 
-#: elfxx-mips.c:11002
+#: elfxx-mips.c:11004
 #, c-format
 msgid ""
 "%pB: `%pA' entry VMA of %#<PRIx64> outside the 32-bit range supported; "
 "consider using `-Ttext-segment=...'"
 msgstr ""
 
-#: elfxx-mips.c:11117 elfxx-mips.c:11704
+#: elfxx-mips.c:11119 elfxx-mips.c:11706
 #, c-format
 msgid "%pB: `%pA' offset of %<PRId64> from `%pA' beyond the range of ADDIUPC"
 msgstr ""
 
-#: elfxx-mips.c:11676
+#: elfxx-mips.c:11678
 #, c-format
 msgid ""
 "%pB: `%pA' start VMA of %#<PRIx64> outside the 32-bit range supported; "
 "consider using `-Ttext-segment=...'"
 msgstr ""
 
-#: elfxx-mips.c:13422 reloc.c:8417
+#: elfxx-mips.c:13424 reloc.c:8563
 #, c-format
 msgid "%X%P: %pB(%pA): error: relocation for offset %V has no value\n"
 msgstr ""
 
-#: elfxx-mips.c:13532 reloc.c:8514
-#, c-format
-msgid "%X%P: %pB(%pA): relocation \"%pR\" returns an unrecognized value %x\n"
-msgstr ""
-
-#: elfxx-mips.c:14734
+#: elfxx-mips.c:14736
 #, c-format
 msgid "%pB: unknown architecture %s"
 msgstr ""
 
-#: elfxx-mips.c:15262
+#: elfxx-mips.c:15264
 #, c-format
 msgid "%pB: illegal section name `%pA'"
 msgstr ""
 
-#: elfxx-mips.c:15539
+#: elfxx-mips.c:15541
 #, c-format
 msgid "%pB: warning: linking abicalls files with non-abicalls files"
 msgstr ""
 
-#: elfxx-mips.c:15556
+#: elfxx-mips.c:15558
 #, c-format
 msgid "%pB: linking 32-bit code with 64-bit code"
 msgstr ""
 
-#: elfxx-mips.c:15588 elfxx-mips.c:15654 elfxx-mips.c:15669
+#: elfxx-mips.c:15590 elfxx-mips.c:15656 elfxx-mips.c:15671
 #, c-format
 msgid "%pB: linking %s module with previous %s modules"
 msgstr ""
 
-#: elfxx-mips.c:15612
+#: elfxx-mips.c:15614
 #, c-format
 msgid "%pB: ABI mismatch: linking %s module with previous %s modules"
 msgstr ""
 
-#: elfxx-mips.c:15637
+#: elfxx-mips.c:15639
 #, c-format
 msgid "%pB: ASE mismatch: linking %s module with previous %s modules"
 msgstr ""
 
-#: elfxx-mips.c:15771
+#: elfxx-mips.c:15773
 #, c-format
 msgid ""
 "warning: %pB uses unknown floating point ABI %d (set by %pB), %pB uses "
 "unknown floating point ABI %d"
 msgstr ""
 
-#: elfxx-mips.c:15777
+#: elfxx-mips.c:15779
 #, c-format
 msgid ""
 "warning: %pB uses unknown floating point ABI %d (set by %pB), %pB uses %s"
 msgstr ""
 
-#: elfxx-mips.c:15783
+#: elfxx-mips.c:15785
 #, c-format
 msgid ""
 "warning: %pB uses %s (set by %pB), %pB uses unknown floating point ABI %d"
 msgstr ""
 
-#: elfxx-mips.c:15797
+#: elfxx-mips.c:15799
 #, c-format
 msgid "warning: %pB uses %s (set by %pB), %pB uses %s"
 msgstr ""
 
-#: elfxx-mips.c:15816
+#: elfxx-mips.c:15818
 #, c-format
 msgid "warning: %pB uses %s (set by %pB), %pB uses unknown MSA ABI %d"
 msgstr ""
 
-#: elfxx-mips.c:15828
+#: elfxx-mips.c:15830
 #, c-format
 msgid "warning: %pB uses unknown MSA ABI %d (set by %pB), %pB uses %s"
 msgstr ""
 
-#: elfxx-mips.c:15837
+#: elfxx-mips.c:15839
 #, c-format
 msgid ""
-"warning: %pB uses unknown MSA ABI %d (set by %pB), %pB uses unknown MSA ABI %"
-"d"
+"warning: %pB uses unknown MSA ABI %d (set by %pB), %pB uses unknown MSA ABI "
+"%d"
 msgstr ""
 
-#: elfxx-mips.c:15899
+#: elfxx-mips.c:15901
 #, c-format
 msgid "%pB: endianness incompatible with that of the selected emulation"
 msgstr ""
 
-#: elfxx-mips.c:15913
+#: elfxx-mips.c:15915
 #, c-format
 msgid "%pB: ABI is incompatible with that of the selected emulation"
 msgstr ""
 
-#: elfxx-mips.c:15966
+#: elfxx-mips.c:15968
 #, c-format
 msgid "%pB: warning: inconsistent ISA between e_flags and .MIPS.abiflags"
 msgstr ""
 
-#: elfxx-mips.c:15971
+#: elfxx-mips.c:15973
 #, c-format
 msgid ""
 "%pB: warning: inconsistent FP ABI between .gnu.attributes and .MIPS.abiflags"
 msgstr ""
 
-#: elfxx-mips.c:15975
+#: elfxx-mips.c:15977
 #, c-format
 msgid "%pB: warning: inconsistent ASEs between e_flags and .MIPS.abiflags"
 msgstr ""
 
-#: elfxx-mips.c:15982
+#: elfxx-mips.c:15984
 #, c-format
 msgid ""
 "%pB: warning: inconsistent ISA extensions between e_flags and .MIPS.abiflags"
 msgstr ""
 
-#: elfxx-mips.c:15986
+#: elfxx-mips.c:15988
 #, c-format
 msgid ""
 "%pB: warning: unexpected flag in the flags2 field of .MIPS.abiflags (0x%lx)"
 msgstr ""
 
-#: elfxx-mips.c:16177
+#: elfxx-mips.c:16179
 msgid "-mips32r2 -mfp64 (12 callee-saved)"
 msgstr ""
 
-#: elfxx-mips.c:16239 elfxx-mips.c:16250
+#: elfxx-mips.c:16241 elfxx-mips.c:16252
 msgid "None"
 msgstr ""
 
-#: elfxx-mips.c:16241 elfxx-mips.c:16310
+#: elfxx-mips.c:16243 elfxx-mips.c:16312
 msgid "Unknown"
 msgstr ""
 
-#: elfxx-mips.c:16321
+#: elfxx-mips.c:16323
 #, c-format
 msgid "Hard or soft float\n"
 msgstr ""
 
-#: elfxx-mips.c:16324
+#: elfxx-mips.c:16326
 #, c-format
 msgid "Hard float (double precision)\n"
 msgstr ""
 
-#: elfxx-mips.c:16327
+#: elfxx-mips.c:16329
 #, c-format
 msgid "Hard float (single precision)\n"
 msgstr ""
 
-#: elfxx-mips.c:16330
+#: elfxx-mips.c:16332
 #, c-format
 msgid "Soft float\n"
 msgstr ""
 
-#: elfxx-mips.c:16333
+#: elfxx-mips.c:16335
 #, c-format
 msgid "Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"
 msgstr ""
 
-#: elfxx-mips.c:16336
+#: elfxx-mips.c:16338
 #, c-format
 msgid "Hard float (32-bit CPU, Any FPU)\n"
 msgstr ""
 
-#: elfxx-mips.c:16339
+#: elfxx-mips.c:16341
 #, c-format
 msgid "Hard float (32-bit CPU, 64-bit FPU)\n"
 msgstr ""
 
-#: elfxx-mips.c:16342
+#: elfxx-mips.c:16344
 #, c-format
 msgid "Hard float compat (32-bit CPU, 64-bit FPU)\n"
 msgstr ""
 
-#: elfxx-mips.c:16374
+#: elfxx-mips.c:16376
 #, c-format
 msgid " [abi=O32]"
 msgstr ""
 
-#: elfxx-mips.c:16376
+#: elfxx-mips.c:16378
 #, c-format
 msgid " [abi=O64]"
 msgstr ""
 
-#: elfxx-mips.c:16378
+#: elfxx-mips.c:16380
 #, c-format
 msgid " [abi=EABI32]"
 msgstr ""
 
-#: elfxx-mips.c:16380
+#: elfxx-mips.c:16382
 #, c-format
 msgid " [abi=EABI64]"
 msgstr ""
 
-#: elfxx-mips.c:16382
+#: elfxx-mips.c:16384
 #, c-format
 msgid " [abi unknown]"
 msgstr ""
 
-#: elfxx-mips.c:16384
+#: elfxx-mips.c:16386
 #, c-format
 msgid " [abi=N32]"
 msgstr ""
 
-#: elfxx-mips.c:16386
+#: elfxx-mips.c:16388
 #, c-format
 msgid " [abi=64]"
 msgstr ""
 
-#: elfxx-mips.c:16388
+#: elfxx-mips.c:16390
 #, c-format
 msgid " [no abi set]"
 msgstr ""
 
-#: elfxx-mips.c:16413
+#: elfxx-mips.c:16415
 #, c-format
 msgid " [unknown ISA]"
 msgstr ""
 
-#: elfxx-mips.c:16433
+#: elfxx-mips.c:16435
 #, c-format
 msgid " [not 32bitmode]"
 msgstr ""
 
-#: elfxx-riscv.c:1657
+#: elfxx-riscv.c:1678
 #, c-format
 msgid "x ISA extension `%s' must be set with the versions"
 msgstr ""
 
-#: elfxx-riscv.c:1663
+#: elfxx-riscv.c:1684
 #, c-format
 msgid "cannot find default versions of the ISA extension `%s'"
 msgstr ""
 
-#: elfxx-riscv.c:1769
+#: elfxx-riscv.c:1790
 #, c-format
 msgid "%s: first ISA extension must be `e', `i' or `g'"
 msgstr ""
 
-#: elfxx-riscv.c:1793
+#: elfxx-riscv.c:1814
 #, c-format
 msgid "%s: unknown standard ISA extension or prefix class `%c'"
 msgstr ""
 
-#: elfxx-riscv.c:1829
+#: elfxx-riscv.c:1850
 #, c-format
 msgid "%s: invalid prefixed ISA extension `%s' ends with <number>p"
 msgstr ""
 
-#: elfxx-riscv.c:1853
+#: elfxx-riscv.c:1874
 #, c-format
 msgid "%s: unknown prefixed ISA extension `%s'"
 msgstr ""
 
-#: elfxx-riscv.c:1877
+#: elfxx-riscv.c:1898
 #, c-format
 msgid "%s: prefixed ISA extension must separate with _"
 msgstr ""
 
-#: elfxx-riscv.c:1931
+#: elfxx-riscv.c:1952
 #, c-format
-msgid "rv%d does not support the `e' extension"
+msgid "rv%de does not support the `h' extension"
 msgstr ""
 
-#: elfxx-riscv.c:1939
+#: elfxx-riscv.c:1960
 #, c-format
 msgid "rv%d does not support the `q' extension"
 msgstr ""
 
-#: elfxx-riscv.c:1946
+#: elfxx-riscv.c:1967
+#, c-format
+msgid "rv%d does not support the `zcf' extension"
+msgstr ""
+
+#: elfxx-riscv.c:1974
 msgid "`zfinx' is conflict with the `f/d/q/zfh/zfhmin' extension"
 msgstr ""
 
-#: elfxx-riscv.c:1967
+#: elfxx-riscv.c:1995
 msgid "zvl*b extensions need to enable either `v' or `zve' extension"
 msgstr ""
 
-#: elfxx-riscv.c:2029
+#: elfxx-riscv.c:2057
 #, c-format
 msgid "%s: ISA string cannot contain uppercase letters"
 msgstr ""
 
-#: elfxx-riscv.c:2057
+#: elfxx-riscv.c:2085
 #, c-format
 msgid "%s: ISA string must begin with rv32 or rv64"
 msgstr ""
 
-#: elfxx-riscv.c:2283
+#: elfxx-riscv.c:2311
 #, c-format
 msgid "invalid ISA extension ends with <number>p in .option arch `%s'"
 msgstr ""
 
-#: elfxx-riscv.c:2306
+#: elfxx-riscv.c:2334
 #, c-format
 msgid "unknown ISA extension `%s' in .option arch `%s'"
 msgstr ""
 
-#: elfxx-riscv.c:2317
+#: elfxx-riscv.c:2345
 #, c-format
 msgid "cannot + or - base extension `%s' in .option arch `%s'"
 msgstr ""
 
-#: elfxx-riscv.c:2525 elfxx-riscv.c:2727
+#: elfxx-riscv.c:2573 elfxx-riscv.c:2811
 msgid "internal: unreachable INSN_CLASS_*"
 msgstr ""
 
-#: elfxx-riscv.c:2558
+#: elfxx-riscv.c:2608
+msgid "zihintntl' and `c', or `zihintntl' and `zca"
+msgstr ""
+
+#: elfxx-riscv.c:2613 elfxx-riscv.c:2631
+msgid "c' or `zca"
+msgstr ""
+
+#: elfxx-riscv.c:2619
 msgid "m' or `zmmul"
 msgstr ""
 
-#: elfxx-riscv.c:2574
-msgid "f' and `c"
+#: elfxx-riscv.c:2637
+msgid "f' and `c', or `f' and `zcf"
+msgstr ""
+
+#: elfxx-riscv.c:2642
+msgid "c' or `zcf"
 msgstr ""
 
-#: elfxx-riscv.c:2582
-msgid "d' and `c"
+#: elfxx-riscv.c:2648
+msgid "d' and `c', or `d' and `zcd"
 msgstr ""
 
-#: elfxx-riscv.c:2588
+#: elfxx-riscv.c:2653
+msgid "c' or `zcd"
+msgstr ""
+
+#: elfxx-riscv.c:2655
 msgid "f' or `zfinx"
 msgstr ""
 
-#: elfxx-riscv.c:2590
+#: elfxx-riscv.c:2657
 msgid "d' or `zdinx"
 msgstr ""
 
-#: elfxx-riscv.c:2592
+#: elfxx-riscv.c:2659
 msgid "q' or `zqinx"
 msgstr ""
 
-#: elfxx-riscv.c:2594
+#: elfxx-riscv.c:2661
 msgid "zfh' or `zhinx"
 msgstr ""
 
-#: elfxx-riscv.c:2598
+#: elfxx-riscv.c:2665
 msgid "zfhmin' or `zhinxmin"
 msgstr ""
 
-#: elfxx-riscv.c:2609
+#: elfxx-riscv.c:2676
 msgid "zfhmin' and `d', or `zhinxmin' and `zdinx"
 msgstr ""
 
-#: elfxx-riscv.c:2620
+#: elfxx-riscv.c:2687
 msgid "zfhmin' and `q', or `zhinxmin' and `zqinx"
 msgstr ""
 
-#: elfxx-riscv.c:2626
+#: elfxx-riscv.c:2693
 msgid "d' and `zfa"
 msgstr ""
 
-#: elfxx-riscv.c:2634
+#: elfxx-riscv.c:2701
 msgid "q' and `zfa"
 msgstr ""
 
-#: elfxx-riscv.c:2642
+#: elfxx-riscv.c:2709
 msgid "zfh' and `zfa"
 msgstr ""
 
-#: elfxx-riscv.c:2662
+#: elfxx-riscv.c:2719
+msgid "zfh' and `zfa', or `zvfh' and `zfa"
+msgstr ""
+
+#: elfxx-riscv.c:2724
+msgid "zfh' or `zvfh"
+msgstr ""
+
+#: elfxx-riscv.c:2740
 msgid "zbb' or `zbkb"
 msgstr ""
 
-#: elfxx-riscv.c:2664
+#: elfxx-riscv.c:2742
 msgid "zbc' or `zbkc"
 msgstr ""
 
-#: elfxx-riscv.c:2672
+#: elfxx-riscv.c:2750
 msgid "zknd' or `zkne"
 msgstr ""
 
-#: elfxx-riscv.c:2678
+#: elfxx-riscv.c:2756
 msgid "v' or `zve64x' or `zve32x"
 msgstr ""
 
-#: elfxx-riscv.c:2680
+#: elfxx-riscv.c:2758
 msgid "v' or `zve64d' or `zve64f' or `zve32f"
 msgstr ""
 
-#: elfxx-riscv.c:2682
+#: elfxx-riscv.c:2760
 msgid "zvbb"
 msgstr ""
 
-#: elfxx-riscv.c:2684
+#: elfxx-riscv.c:2762
 msgid "zvbc"
 msgstr ""
 
-#: elfxx-riscv.c:2686
+#: elfxx-riscv.c:2764
 msgid "zvkg"
 msgstr ""
 
-#: elfxx-riscv.c:2688
+#: elfxx-riscv.c:2766
 msgid "zvkned"
 msgstr ""
 
-#: elfxx-riscv.c:2690
-msgid "zvknha"
-msgstr ""
-
-#: elfxx-riscv.c:2692
-msgid "zvknhb"
+#: elfxx-riscv.c:2768
+msgid "zvknha' or `zvknhb"
 msgstr ""
 
-#: elfxx-riscv.c:2694
+#: elfxx-riscv.c:2770
 msgid "zvksed"
 msgstr ""
 
-#: elfxx-riscv.c:2696
+#: elfxx-riscv.c:2772
 msgid "zvksh"
 msgstr ""
 
-#: elfxx-riscv.c:2700
+#: elfxx-riscv.c:2776
+msgid "zcb' and `zba"
+msgstr ""
+
+#: elfxx-riscv.c:2778
+msgid "zcb' and `zbb"
+msgstr ""
+
+#: elfxx-riscv.c:2780
+msgid "zcb' and `zmmul', or `zcb' and `m"
+msgstr ""
+
+#: elfxx-riscv.c:2784
 msgid "h"
 msgstr ""
 
@@ -6013,11 +6087,11 @@ msgstr ""
 msgid "%pB: cannot link together %s and %s objects"
 msgstr ""
 
-#: elfxx-x86.c:536 elfxx-x86.c:3401
+#: elfxx-x86.c:536 elfxx-x86.c:3440
 #, c-format
 msgid ""
-"%F%P: %pB: copy relocation against non-copyable protected symbol `%s' in %"
-"pB\n"
+"%F%P: %pB: copy relocation against non-copyable protected symbol `%s' in "
+"%pB\n"
 msgstr ""
 
 #: elfxx-x86.c:1043
@@ -6063,91 +6137,91 @@ msgstr ""
 msgid "%P: %pB: warning: relocation in read-only section `%pA'\n"
 msgstr ""
 
-#: elfxx-x86.c:3154
+#: elfxx-x86.c:3193
 msgid ""
-"%pB: %s (offset: 0x%v, info: 0x%v, addend: 0x%v) against '%s' for section '%"
-"pA' in %pB\n"
+"%pB: %s (offset: 0x%v, info: 0x%v, addend: 0x%v) against '%s' for section "
+"'%pA' in %pB\n"
 msgstr ""
 
-#: elfxx-x86.c:3160
+#: elfxx-x86.c:3199
 msgid ""
 "%pB: %s (offset: 0x%v, info: 0x%v) against '%s' for section '%pA' in %pB\n"
 msgstr ""
 
-#: elfxx-x86.c:3775
+#: elfxx-x86.c:3819
 #, c-format
 msgid "error: %pB: <corrupt x86 property (0x%x) size: 0x%x>"
 msgstr ""
 
-#: elfxx-x86.c:4122
+#: elfxx-x86.c:4166
 msgid "%P: %pB: warning: missing %s\n"
 msgstr ""
 
-#: elfxx-x86.c:4123
+#: elfxx-x86.c:4167
 msgid "%X%P: %pB: error: missing %s\n"
 msgstr ""
 
-#: elfxx-x86.c:4186
+#: elfxx-x86.c:4230
 msgid "IBT and SHSTK properties"
 msgstr ""
 
-#: elfxx-x86.c:4188
+#: elfxx-x86.c:4232
 msgid "IBT property"
 msgstr ""
 
-#: elfxx-x86.c:4190
+#: elfxx-x86.c:4234
 msgid "SHSTK property"
 msgstr ""
 
-#: elfxx-x86.c:4195
+#: elfxx-x86.c:4239
 msgid "LAM_U48 property"
 msgstr ""
 
-#: elfxx-x86.c:4200
+#: elfxx-x86.c:4244
 msgid "LAM_U57 property"
 msgstr ""
 
-#: elfxx-x86.c:4367
+#: elfxx-x86.c:4413
 msgid "%F%P: failed to create VxWorks dynamic sections\n"
 msgstr ""
 
-#: elfxx-x86.c:4376
+#: elfxx-x86.c:4422
 msgid "%F%P: failed to create GOT sections\n"
 msgstr ""
 
-#: elfxx-x86.c:4394
+#: elfxx-x86.c:4440
 msgid "%F%P: failed to create ifunc sections\n"
 msgstr ""
 
-#: elfxx-x86.c:4431
+#: elfxx-x86.c:4477
 msgid "%F%P: failed to create GOT PLT section\n"
 msgstr ""
 
-#: elfxx-x86.c:4450
+#: elfxx-x86.c:4496
 msgid "%F%P: failed to create IBT-enabled PLT section\n"
 msgstr ""
 
-#: elfxx-x86.c:4470
+#: elfxx-x86.c:4516
 msgid "%F%P: failed to create PLT .eh_frame section\n"
 msgstr ""
 
-#: elfxx-x86.c:4483
+#: elfxx-x86.c:4529
 msgid "%F%P: failed to create GOT PLT .eh_frame section\n"
 msgstr ""
 
-#: elfxx-x86.c:4497
+#: elfxx-x86.c:4543
 msgid "%F%P: failed to create the second PLT .eh_frame section\n"
 msgstr ""
 
-#: elfxx-x86.c:4517
+#: elfxx-x86.c:4563
 msgid "%F%P: failed to create PLT .sframe section\n"
 msgstr ""
 
-#: elfxx-x86.c:4532
+#: elfxx-x86.c:4578
 msgid "%F%P: failed to create second PLT .sframe section\n"
 msgstr ""
 
-#: elfxx-x86.c:4572
+#: elfxx-x86.c:4618
 msgid "%X%P: attempted static link of dynamic object `%pB'\n"
 msgstr ""
 
@@ -6206,47 +6280,47 @@ msgstr ""
 msgid "%pB: address %#<PRIx64> out of range for Intel Hex file"
 msgstr ""
 
-#: libbfd.c:1051
+#: libbfd.c:1058
 #, c-format
 msgid "%pB: unable to get decompressed section %pA"
 msgstr ""
 
-#: linker.c:1710
+#: linker.c:1713
 #, c-format
 msgid "%pB: indirect symbol `%s' to `%s' is a loop"
 msgstr ""
 
-#: linker.c:2580
+#: linker.c:2583
 #, c-format
 msgid "attempt to do relocatable link with %s input and %s output"
 msgstr ""
 
-#: linker.c:2859
+#: linker.c:2862
 #, c-format
 msgid "%pB: ignoring duplicate section `%pA'\n"
 msgstr ""
 
-#: linker.c:2869 linker.c:2879
+#: linker.c:2872 linker.c:2882
 #, c-format
 msgid "%pB: duplicate section `%pA' has different size\n"
 msgstr ""
 
-#: linker.c:2893 linker.c:2901
+#: linker.c:2896 linker.c:2904
 #, c-format
 msgid "%pB: could not read contents of section `%pA'\n"
 msgstr ""
 
-#: linker.c:2910
+#: linker.c:2913
 #, c-format
 msgid "%pB: duplicate section `%pA' has different contents\n"
 msgstr ""
 
-#: linker.c:3429
+#: linker.c:3432
 #, c-format
 msgid "%pB: compiled for a big endian system and target is little endian"
 msgstr ""
 
-#: linker.c:3432
+#: linker.c:3435
 #, c-format
 msgid "%pB: compiled for a little endian system and target is big endian"
 msgstr ""
@@ -6415,8 +6489,8 @@ msgstr ""
 #: mach-o.c:3876
 #, c-format
 msgid ""
-"bfd_mach_o_read_symtab_symbol: symbol \"%s\" specified invalid type field 0x%"
-"x: setting to undefined"
+"bfd_mach_o_read_symtab_symbol: symbol \"%s\" specified invalid type field "
+"0x%x: setting to undefined"
 msgstr ""
 
 #: mach-o.c:5075
@@ -6583,8 +6657,8 @@ msgstr ""
 #: mmo.c:3276
 #, c-format
 msgid ""
-"%pB: invalid start address for initialized registers of length %<PRId64>: %"
-"#<PRIx64>"
+"%pB: invalid start address for initialized registers of length %<PRId64>: "
+"%#<PRIx64>"
 msgstr ""
 
 #: osf-core.c:127
@@ -6592,7 +6666,7 @@ msgstr ""
 msgid "unhandled OSF/1 core file section type %d"
 msgstr ""
 
-#: pdp11.c:1589
+#: pdp11.c:1588
 #, c-format
 msgid "%pB: symbol indicates overlay (not supported)"
 msgstr ""
@@ -6602,57 +6676,57 @@ msgstr ""
 msgid "bfd_pef_scan: unknown architecture 0x%lx"
 msgstr ""
 
-#: pei-x86_64.c:178 pei-x86_64.c:232 pei-x86_64.c:242 pei-x86_64.c:267
-#: pei-x86_64.c:279 pei-x86_64.c:293 pei-x86_64.c:311 pei-x86_64.c:323
-#: pei-x86_64.c:335
+#: pei-x86_64.c:174 pei-x86_64.c:228 pei-x86_64.c:238 pei-x86_64.c:263
+#: pei-x86_64.c:275 pei-x86_64.c:289 pei-x86_64.c:307 pei-x86_64.c:319
+#: pei-x86_64.c:331
 #, c-format
 msgid "warning: corrupt unwind data\n"
 msgstr ""
 
 #. PR 17512: file: 2245-7442-0.004.
-#: pei-x86_64.c:356
+#: pei-x86_64.c:352
 #, c-format
 msgid "Unknown: %x"
 msgstr ""
 
-#: pei-x86_64.c:407 pei-x86_64.c:417 pei-x86_64.c:426
+#: pei-x86_64.c:403 pei-x86_64.c:413 pei-x86_64.c:422
 #, c-format
 msgid "warning: xdata section corrupt\n"
 msgstr ""
 
-#: pei-x86_64.c:481
+#: pei-x86_64.c:477
 #, c-format
 msgid "Too many unwind codes (%ld)\n"
 msgstr ""
 
-#: pei-x86_64.c:567
+#: pei-x86_64.c:563
 #, c-format
 msgid "Warning: %s section size (%ld) is not a multiple of %d\n"
 msgstr ""
 
-#: pei-x86_64.c:574
+#: pei-x86_64.c:570
 #, c-format
 msgid "Warning: %s section size is zero\n"
 msgstr ""
 
-#: pei-x86_64.c:589
+#: pei-x86_64.c:585
 #, c-format
 msgid "Warning: %s section size (%ld) is smaller than virtual size (%ld)\n"
 msgstr ""
 
-#: pei-x86_64.c:598
+#: pei-x86_64.c:594
 #, c-format
 msgid ""
 "\n"
 "The Function Table (interpreted %s section contents)\n"
 msgstr ""
 
-#: pei-x86_64.c:601
+#: pei-x86_64.c:597
 #, c-format
 msgid "vma:\t\t\tBeginAddress\t EndAddress\t  UnwindData\n"
 msgstr ""
 
-#: pei-x86_64.c:726
+#: pei-x86_64.c:722
 #, c-format
 msgid ""
 "\n"
@@ -6660,59 +6734,59 @@ msgid ""
 msgstr ""
 
 #. XXX code yet to be written.
-#: peicode.h:822
+#: peicode.h:810
 #, c-format
 msgid "%pB: unhandled import type; %x"
 msgstr ""
 
-#: peicode.h:828
+#: peicode.h:816
 #, c-format
 msgid "%pB: unrecognized import type; %x"
 msgstr ""
 
-#: peicode.h:843
+#: peicode.h:831
 #, c-format
 msgid "%pB: unrecognized import name type; %x"
 msgstr ""
 
-#: peicode.h:1274
+#: peicode.h:1264
 #, c-format
 msgid "%pB: unrecognised machine type (0x%x) in Import Library Format archive"
 msgstr ""
 
-#: peicode.h:1287
+#: peicode.h:1277
 #, c-format
 msgid ""
 "%pB: recognised but unhandled machine type (0x%x) in Import Library Format "
 "archive"
 msgstr ""
 
-#: peicode.h:1305
+#: peicode.h:1295
 #, c-format
 msgid "%pB: size field is zero in Import Library Format header"
 msgstr ""
 
-#: peicode.h:1331
+#: peicode.h:1321
 #, c-format
 msgid "%pB: string not null terminated in ILF object file"
 msgstr ""
 
-#: peicode.h:1387
+#: peicode.h:1377
 #, c-format
 msgid "%pB: error: debug data ends beyond end of debug directory"
 msgstr ""
 
-#: peicode.h:1559
+#: peicode.h:1547
 #, c-format
 msgid "%pB: adjusting invalid SectionAlignment"
 msgstr ""
 
-#: peicode.h:1569
+#: peicode.h:1557
 #, c-format
 msgid "%pB: adjusting invalid FileAlignment"
 msgstr ""
 
-#: peicode.h:1577
+#: peicode.h:1565
 #, c-format
 msgid "%pB: invalid NumberOfRvaAndSizes"
 msgstr ""
@@ -6722,66 +6796,66 @@ msgid ""
 "plugin framework: out of file descriptors. Try using fewer objects/archives\n"
 msgstr ""
 
-#: ppcboot.c:393
+#: ppcboot.c:392
 #, c-format
 msgid ""
 "\n"
 "ppcboot header:\n"
 msgstr ""
 
-#: ppcboot.c:394
+#: ppcboot.c:393
 #, c-format
 msgid "Entry offset        = 0x%.8lx (%ld)\n"
 msgstr ""
 
-#: ppcboot.c:396
+#: ppcboot.c:395
 #, c-format
 msgid "Length              = 0x%.8lx (%ld)\n"
 msgstr ""
 
-#: ppcboot.c:400
+#: ppcboot.c:399
 #, c-format
 msgid "Flag field          = 0x%.2x\n"
 msgstr ""
 
-#: ppcboot.c:406
+#: ppcboot.c:405
 #, c-format
 msgid "Partition name      = \"%s\"\n"
 msgstr ""
 
-#: ppcboot.c:426
+#: ppcboot.c:425
 #, c-format
 msgid ""
 "\n"
 "Partition[%d] start  = { 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x }\n"
 msgstr ""
 
-#: ppcboot.c:433
+#: ppcboot.c:432
 #, c-format
 msgid "Partition[%d] end    = { 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x }\n"
 msgstr ""
 
-#: ppcboot.c:440
+#: ppcboot.c:439
 #, c-format
 msgid "Partition[%d] sector = 0x%.8lx (%ld)\n"
 msgstr ""
 
-#: ppcboot.c:444
+#: ppcboot.c:443
 #, c-format
 msgid "Partition[%d] length = 0x%.8lx (%ld)\n"
 msgstr ""
 
-#: reloc.c:8316
+#: reloc.c:8462
 msgid "INPUT_SECTION_FLAGS are not supported"
 msgstr ""
 
-#: reloc.c:8582
+#: reloc.c:8728
 #, c-format
 msgid "%pB: unrecognized relocation type %#x in section `%pA'"
 msgstr ""
 
 #. PR 21803: Suggest the most likely cause of this error.
-#: reloc.c:8586
+#: reloc.c:8732
 #, c-format
 msgid "is this version of the linker - %s - out of date ?"
 msgstr ""
@@ -6802,19 +6876,19 @@ msgid "%pB(%pA+%#<PRIx64>): %s relocation offset out of range"
 msgstr ""
 
 #. User has specified a subspace without its containing space.
-#: som.c:5488
+#: som.c:5405
 #, c-format
 msgid "%pB[%pA]: no output section for space %pA"
 msgstr ""
 
-#: som.c:5534
+#: som.c:5451
 #, c-format
 msgid ""
 "\n"
 "Exec Auxiliary Header\n"
 msgstr ""
 
-#: som.c:5843
+#: som.c:5760
 msgid "som_sizeof_headers unimplemented"
 msgstr ""
 
@@ -6964,1901 +7038,1901 @@ msgstr ""
 msgid "object module not error-free !"
 msgstr ""
 
-#: vms-alpha.c:4004
+#: vms-alpha.c:4012
 #, c-format
 msgid "SEC_RELOC with no relocs in section %pA"
 msgstr ""
 
-#: vms-alpha.c:4056 vms-alpha.c:4271
+#: vms-alpha.c:4064 vms-alpha.c:4292
 #, c-format
 msgid "size error in section %pA"
 msgstr ""
 
-#: vms-alpha.c:4216
+#: vms-alpha.c:4235
 msgid "spurious ALPHA_R_BSR reloc"
 msgstr ""
 
-#: vms-alpha.c:4257
+#: vms-alpha.c:4278
 #, c-format
 msgid "unhandled relocation %s"
 msgstr ""
 
-#: vms-alpha.c:4619
+#: vms-alpha.c:4643
 #, c-format
 msgid "unknown source command %d"
 msgstr ""
 
-#: vms-alpha.c:4771 vms-alpha.c:4776 vms-alpha.c:4781 vms-alpha.c:4786
-#: vms-alpha.c:4791 vms-alpha.c:4814 vms-alpha.c:4819 vms-alpha.c:4824
-#: vms-alpha.c:4829
+#: vms-alpha.c:4795 vms-alpha.c:4800 vms-alpha.c:4805 vms-alpha.c:4810
+#: vms-alpha.c:4815 vms-alpha.c:4838 vms-alpha.c:4843 vms-alpha.c:4848
+#: vms-alpha.c:4853
 #, c-format
 msgid "%s not implemented"
 msgstr ""
 
-#: vms-alpha.c:4865
+#: vms-alpha.c:4889
 #, c-format
 msgid "unknown line command %d"
 msgstr ""
 
-#: vms-alpha.c:5304
+#: vms-alpha.c:5328
 msgid "corrupt reloc record"
 msgstr ""
 
-#: vms-alpha.c:5334 vms-alpha.c:5352 vms-alpha.c:5369 vms-alpha.c:5387
-#: vms-alpha.c:5400 vms-alpha.c:5412 vms-alpha.c:5425
+#: vms-alpha.c:5358 vms-alpha.c:5376 vms-alpha.c:5393 vms-alpha.c:5411
+#: vms-alpha.c:5424 vms-alpha.c:5436 vms-alpha.c:5449
 #, c-format
 msgid "unknown reloc %s + %s"
 msgstr ""
 
-#: vms-alpha.c:5484
+#: vms-alpha.c:5508
 #, c-format
 msgid "unknown reloc %s"
 msgstr ""
 
-#: vms-alpha.c:5498
+#: vms-alpha.c:5522
 msgid "invalid section index in ETIR"
 msgstr ""
 
-#: vms-alpha.c:5507
+#: vms-alpha.c:5531
 msgid "relocation for non-REL psect"
 msgstr ""
 
-#: vms-alpha.c:5560
+#: vms-alpha.c:5584
 #, c-format
 msgid "unknown symbol in command %s"
 msgstr ""
 
-#: vms-alpha.c:5979
+#: vms-alpha.c:6003
 #, c-format
 msgid "reloc (%d) is *UNKNOWN*"
 msgstr ""
 
-#: vms-alpha.c:6095
+#: vms-alpha.c:6119
 #, c-format
 msgid "  EMH %u (len=%u): "
 msgstr ""
 
-#: vms-alpha.c:6100
+#: vms-alpha.c:6124
 #, c-format
 msgid "   Error: The length is less than the length of an EMH record\n"
 msgstr ""
 
-#: vms-alpha.c:6117
+#: vms-alpha.c:6141
 #, c-format
 msgid ""
 "   Error: The record length is less than the size of an EMH_MHD record\n"
 msgstr ""
 
-#: vms-alpha.c:6120
+#: vms-alpha.c:6144
 #, c-format
 msgid "Module header\n"
 msgstr ""
 
-#: vms-alpha.c:6121
+#: vms-alpha.c:6145
 #, c-format
 msgid "   structure level: %u\n"
 msgstr ""
 
-#: vms-alpha.c:6122
+#: vms-alpha.c:6146
 #, c-format
 msgid "   max record size: %u\n"
 msgstr ""
 
-#: vms-alpha.c:6128
+#: vms-alpha.c:6152
 #, c-format
 msgid "   Error: The module name is missing\n"
 msgstr ""
 
-#: vms-alpha.c:6134
+#: vms-alpha.c:6158
 #, c-format
 msgid "   Error: The module name is too long\n"
 msgstr ""
 
-#: vms-alpha.c:6137
+#: vms-alpha.c:6161
 #, c-format
 msgid "   module name    : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6141
+#: vms-alpha.c:6165
 #, c-format
 msgid "   Error: The module version is missing\n"
 msgstr ""
 
-#: vms-alpha.c:6147
+#: vms-alpha.c:6171
 #, c-format
 msgid "   Error: The module version is too long\n"
 msgstr ""
 
-#: vms-alpha.c:6150
+#: vms-alpha.c:6174
 #, c-format
 msgid "   module version : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6153
+#: vms-alpha.c:6177
 #, c-format
 msgid "   Error: The compile date is truncated\n"
 msgstr ""
 
-#: vms-alpha.c:6155
+#: vms-alpha.c:6179
 #, c-format
 msgid "   compile date   : %.17s\n"
 msgstr ""
 
-#: vms-alpha.c:6160
+#: vms-alpha.c:6184
 #, c-format
 msgid "Language Processor Name\n"
 msgstr ""
 
-#: vms-alpha.c:6161
+#: vms-alpha.c:6185
 #, c-format
 msgid "   language name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6165
+#: vms-alpha.c:6189
 #, c-format
 msgid "Source Files Header\n"
 msgstr ""
 
-#: vms-alpha.c:6166
+#: vms-alpha.c:6190
 #, c-format
 msgid "   file: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6170
+#: vms-alpha.c:6194
 #, c-format
 msgid "Title Text Header\n"
 msgstr ""
 
-#: vms-alpha.c:6171
+#: vms-alpha.c:6195
 #, c-format
 msgid "   title: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6175
+#: vms-alpha.c:6199
 #, c-format
 msgid "Copyright Header\n"
 msgstr ""
 
-#: vms-alpha.c:6176
+#: vms-alpha.c:6200
 #, c-format
 msgid "   copyright: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6180
+#: vms-alpha.c:6204
 #, c-format
 msgid "unhandled emh subtype %u\n"
 msgstr ""
 
-#: vms-alpha.c:6190
+#: vms-alpha.c:6214
 #, c-format
 msgid "  EEOM (len=%u):\n"
 msgstr ""
 
-#: vms-alpha.c:6195
+#: vms-alpha.c:6219
 #, c-format
 msgid "   Error: The length is less than the length of an EEOM record\n"
 msgstr ""
 
-#: vms-alpha.c:6199
+#: vms-alpha.c:6223
 #, c-format
 msgid "   number of cond linkage pairs: %u\n"
 msgstr ""
 
-#: vms-alpha.c:6201
+#: vms-alpha.c:6225
 #, c-format
 msgid "   completion code: %u\n"
 msgstr ""
 
-#: vms-alpha.c:6205
+#: vms-alpha.c:6229
 #, c-format
 msgid "   transfer addr flags: 0x%02x\n"
 msgstr ""
 
-#: vms-alpha.c:6206
+#: vms-alpha.c:6230
 #, c-format
 msgid "   transfer addr psect: %u\n"
 msgstr ""
 
-#: vms-alpha.c:6208
+#: vms-alpha.c:6232
 #, c-format
 msgid "   transfer address   : 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6217
+#: vms-alpha.c:6241
 msgid " WEAK"
 msgstr ""
 
-#: vms-alpha.c:6219
+#: vms-alpha.c:6243
 msgid " DEF"
 msgstr ""
 
-#: vms-alpha.c:6221
+#: vms-alpha.c:6245
 msgid " UNI"
 msgstr ""
 
-#: vms-alpha.c:6223 vms-alpha.c:6244
+#: vms-alpha.c:6247 vms-alpha.c:6268
 msgid " REL"
 msgstr ""
 
-#: vms-alpha.c:6225
+#: vms-alpha.c:6249
 msgid " COMM"
 msgstr ""
 
-#: vms-alpha.c:6227
+#: vms-alpha.c:6251
 msgid " VECEP"
 msgstr ""
 
-#: vms-alpha.c:6229
+#: vms-alpha.c:6253
 msgid " NORM"
 msgstr ""
 
-#: vms-alpha.c:6231
+#: vms-alpha.c:6255
 msgid " QVAL"
 msgstr ""
 
-#: vms-alpha.c:6238
+#: vms-alpha.c:6262
 msgid " PIC"
 msgstr ""
 
-#: vms-alpha.c:6240
+#: vms-alpha.c:6264
 msgid " LIB"
 msgstr ""
 
-#: vms-alpha.c:6242
+#: vms-alpha.c:6266
 msgid " OVR"
 msgstr ""
 
-#: vms-alpha.c:6246
+#: vms-alpha.c:6270
 msgid " GBL"
 msgstr ""
 
-#: vms-alpha.c:6248
+#: vms-alpha.c:6272
 msgid " SHR"
 msgstr ""
 
-#: vms-alpha.c:6250
+#: vms-alpha.c:6274
 msgid " EXE"
 msgstr ""
 
-#: vms-alpha.c:6252
+#: vms-alpha.c:6276
 msgid " RD"
 msgstr ""
 
-#: vms-alpha.c:6254
+#: vms-alpha.c:6278
 msgid " WRT"
 msgstr ""
 
-#: vms-alpha.c:6256
+#: vms-alpha.c:6280
 msgid " VEC"
 msgstr ""
 
-#: vms-alpha.c:6258
+#: vms-alpha.c:6282
 msgid " NOMOD"
 msgstr ""
 
-#: vms-alpha.c:6260
+#: vms-alpha.c:6284
 msgid " COM"
 msgstr ""
 
-#: vms-alpha.c:6262
+#: vms-alpha.c:6286
 msgid " 64B"
 msgstr ""
 
-#: vms-alpha.c:6271
+#: vms-alpha.c:6295
 #, c-format
 msgid "  EGSD (len=%u):\n"
 msgstr ""
 
-#: vms-alpha.c:6286
+#: vms-alpha.c:6310
 #, c-format
 msgid "  EGSD entry %2u (type: %u, len: %u): "
 msgstr ""
 
-#: vms-alpha.c:6292 vms-alpha.c:6587
+#: vms-alpha.c:6316 vms-alpha.c:6611
 #, c-format
 msgid "   Erroneous length\n"
 msgstr ""
 
-#: vms-alpha.c:6305
+#: vms-alpha.c:6329
 #, c-format
 msgid "PSC - Program section definition\n"
 msgstr ""
 
-#: vms-alpha.c:6306 vms-alpha.c:6326
+#: vms-alpha.c:6330 vms-alpha.c:6350
 #, c-format
 msgid "   alignment  : 2**%u\n"
 msgstr ""
 
-#: vms-alpha.c:6307 vms-alpha.c:6327
+#: vms-alpha.c:6331 vms-alpha.c:6351
 #, c-format
 msgid "   flags      : 0x%04x"
 msgstr ""
 
-#: vms-alpha.c:6311
+#: vms-alpha.c:6335
 #, c-format
 msgid "   alloc (len): %u (0x%08x)\n"
 msgstr ""
 
-#: vms-alpha.c:6313 vms-alpha.c:6379 vms-alpha.c:6447
+#: vms-alpha.c:6337 vms-alpha.c:6403 vms-alpha.c:6471
 #, c-format
 msgid "   name       : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6325
+#: vms-alpha.c:6349
 #, c-format
 msgid "SPSC - Shared Image Program section def\n"
 msgstr ""
 
-#: vms-alpha.c:6331
+#: vms-alpha.c:6355
 #, c-format
 msgid "   alloc (len)   : %u (0x%08x)\n"
 msgstr ""
 
-#: vms-alpha.c:6332
+#: vms-alpha.c:6356
 #, c-format
 msgid "   image offset  : 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6334
+#: vms-alpha.c:6358
 #, c-format
 msgid "   symvec offset : 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6337
+#: vms-alpha.c:6361
 #, c-format
 msgid "   name          : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6353
+#: vms-alpha.c:6377
 #, c-format
 msgid "SYM - Global symbol definition\n"
 msgstr ""
 
-#: vms-alpha.c:6354 vms-alpha.c:6435 vms-alpha.c:6459 vms-alpha.c:6482
+#: vms-alpha.c:6378 vms-alpha.c:6459 vms-alpha.c:6483 vms-alpha.c:6506
 #, c-format
 msgid "   flags: 0x%04x"
 msgstr ""
 
-#: vms-alpha.c:6357
+#: vms-alpha.c:6381
 #, c-format
 msgid "   psect offset: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6361
+#: vms-alpha.c:6385
 #, c-format
 msgid "   code address: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6363
+#: vms-alpha.c:6387
 #, c-format
 msgid "   psect index for entry point : %u\n"
 msgstr ""
 
-#: vms-alpha.c:6366 vms-alpha.c:6466 vms-alpha.c:6489
+#: vms-alpha.c:6390 vms-alpha.c:6490 vms-alpha.c:6513
 #, c-format
 msgid "   psect index : %u\n"
 msgstr ""
 
-#: vms-alpha.c:6369 vms-alpha.c:6469 vms-alpha.c:6492
+#: vms-alpha.c:6393 vms-alpha.c:6493 vms-alpha.c:6516
 #, c-format
 msgid "   name        : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6377
+#: vms-alpha.c:6401
 #, c-format
 msgid "SYM - Global symbol reference\n"
 msgstr ""
 
-#: vms-alpha.c:6392
+#: vms-alpha.c:6416
 #, c-format
 msgid "IDC - Ident Consistency check\n"
 msgstr ""
 
-#: vms-alpha.c:6393
+#: vms-alpha.c:6417
 #, c-format
 msgid "   flags         : 0x%08x"
 msgstr ""
 
-#: vms-alpha.c:6397
+#: vms-alpha.c:6421
 #, c-format
 msgid "   id match      : %x\n"
 msgstr ""
 
-#: vms-alpha.c:6399
+#: vms-alpha.c:6423
 #, c-format
 msgid "   error severity: %x\n"
 msgstr ""
 
-#: vms-alpha.c:6403
+#: vms-alpha.c:6427
 #, c-format
 msgid "   entity name   : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6409
+#: vms-alpha.c:6433
 #, c-format
 msgid "   object name   : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6418
+#: vms-alpha.c:6442
 #, c-format
 msgid "   binary ident  : 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6422
+#: vms-alpha.c:6446
 #, c-format
 msgid "   ascii ident   : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6434
+#: vms-alpha.c:6458
 #, c-format
 msgid "SYMG - Universal symbol definition\n"
 msgstr ""
 
-#: vms-alpha.c:6438
+#: vms-alpha.c:6462
 #, c-format
 msgid "   symbol vector offset: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6440
+#: vms-alpha.c:6464
 #, c-format
 msgid "   entry point: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6442
+#: vms-alpha.c:6466
 #, c-format
 msgid "   proc descr : 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6444
+#: vms-alpha.c:6468
 #, c-format
 msgid "   psect index: %u\n"
 msgstr ""
 
-#: vms-alpha.c:6458
+#: vms-alpha.c:6482
 #, c-format
 msgid "SYMV - Vectored symbol definition\n"
 msgstr ""
 
-#: vms-alpha.c:6462
+#: vms-alpha.c:6486
 #, c-format
 msgid "   vector      : 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6464 vms-alpha.c:6487
+#: vms-alpha.c:6488 vms-alpha.c:6511
 #, c-format
 msgid "   psect offset: %u\n"
 msgstr ""
 
-#: vms-alpha.c:6481
+#: vms-alpha.c:6505
 #, c-format
 msgid "SYMM - Global symbol definition with version\n"
 msgstr ""
 
-#: vms-alpha.c:6485
+#: vms-alpha.c:6509
 #, c-format
 msgid "   version mask: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6498
+#: vms-alpha.c:6522
 #, c-format
 msgid "unhandled egsd entry type %u\n"
 msgstr ""
 
-#: vms-alpha.c:6537
+#: vms-alpha.c:6561
 #, c-format
 msgid "    linkage index: %u, replacement insn: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:6541
+#: vms-alpha.c:6565
 #, c-format
 msgid "    psect idx 1: %u, offset 1: 0x%08x %08x\n"
 msgstr ""
 
-#: vms-alpha.c:6546
+#: vms-alpha.c:6570
 #, c-format
 msgid "    psect idx 2: %u, offset 2: 0x%08x %08x\n"
 msgstr ""
 
-#: vms-alpha.c:6552
+#: vms-alpha.c:6576
 #, c-format
 msgid "    psect idx 3: %u, offset 3: 0x%08x %08x\n"
 msgstr ""
 
-#: vms-alpha.c:6557
+#: vms-alpha.c:6581
 #, c-format
 msgid "    global name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6569
+#: vms-alpha.c:6593
 #, c-format
 msgid "  %s (len=%u):\n"
 msgstr ""
 
-#: vms-alpha.c:6592
+#: vms-alpha.c:6616
 #, c-format
 msgid "   (type: %3u, size: %3u): "
 msgstr ""
 
-#: vms-alpha.c:6598
+#: vms-alpha.c:6622
 #, c-format
 msgid "STA_GBL (stack global) %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6602
+#: vms-alpha.c:6626
 #, c-format
 msgid "STA_LW (stack longword)"
 msgstr ""
 
-#: vms-alpha.c:6608
+#: vms-alpha.c:6632
 #, c-format
 msgid "STA_QW (stack quadword)"
 msgstr ""
 
-#: vms-alpha.c:6615
+#: vms-alpha.c:6639
 #, c-format
 msgid "STA_PQ (stack psect base + offset)\n"
 msgstr ""
 
-#: vms-alpha.c:6618
+#: vms-alpha.c:6642
 #, c-format
 msgid "    psect: %u, offset: 0x%08x %08x\n"
 msgstr ""
 
-#: vms-alpha.c:6624
+#: vms-alpha.c:6648
 #, c-format
 msgid "STA_LI (stack literal)\n"
 msgstr ""
 
-#: vms-alpha.c:6627
+#: vms-alpha.c:6651
 #, c-format
 msgid "STA_MOD (stack module)\n"
 msgstr ""
 
-#: vms-alpha.c:6630
+#: vms-alpha.c:6654
 #, c-format
 msgid "STA_CKARG (compare procedure argument)\n"
 msgstr ""
 
-#: vms-alpha.c:6634
+#: vms-alpha.c:6658
 #, c-format
 msgid "STO_B (store byte)\n"
 msgstr ""
 
-#: vms-alpha.c:6637
+#: vms-alpha.c:6661
 #, c-format
 msgid "STO_W (store word)\n"
 msgstr ""
 
-#: vms-alpha.c:6640
+#: vms-alpha.c:6664
 #, c-format
 msgid "STO_LW (store longword)\n"
 msgstr ""
 
-#: vms-alpha.c:6643
+#: vms-alpha.c:6667
 #, c-format
 msgid "STO_QW (store quadword)\n"
 msgstr ""
 
-#: vms-alpha.c:6650
+#: vms-alpha.c:6674
 #, c-format
 msgid "STO_IMMR (store immediate repeat) %u bytes\n"
 msgstr ""
 
-#: vms-alpha.c:6659
+#: vms-alpha.c:6683
 #, c-format
 msgid "STO_GBL (store global) %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6664
+#: vms-alpha.c:6688
 #, c-format
 msgid "STO_CA (store code address) %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6668
+#: vms-alpha.c:6692
 #, c-format
 msgid "STO_RB (store relative branch)\n"
 msgstr ""
 
-#: vms-alpha.c:6671
+#: vms-alpha.c:6695
 #, c-format
 msgid "STO_AB (store absolute branch)\n"
 msgstr ""
 
-#: vms-alpha.c:6674
+#: vms-alpha.c:6698
 #, c-format
 msgid "STO_OFF (store offset to psect)\n"
 msgstr ""
 
-#: vms-alpha.c:6681
+#: vms-alpha.c:6705
 #, c-format
 msgid "STO_IMM (store immediate) %u bytes\n"
 msgstr ""
 
-#: vms-alpha.c:6690
+#: vms-alpha.c:6714
 #, c-format
 msgid "STO_GBL_LW (store global longword) %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6694
+#: vms-alpha.c:6718
 #, c-format
 msgid "STO_OFF (store LP with procedure signature)\n"
 msgstr ""
 
-#: vms-alpha.c:6697
+#: vms-alpha.c:6721
 #, c-format
 msgid "STO_BR_GBL (store branch global) *todo*\n"
 msgstr ""
 
-#: vms-alpha.c:6700
+#: vms-alpha.c:6724
 #, c-format
 msgid "STO_BR_PS (store branch psect + offset) *todo*\n"
 msgstr ""
 
-#: vms-alpha.c:6704
+#: vms-alpha.c:6728
 #, c-format
 msgid "OPR_NOP (no-operation)\n"
 msgstr ""
 
-#: vms-alpha.c:6707
+#: vms-alpha.c:6731
 #, c-format
 msgid "OPR_ADD (add)\n"
 msgstr ""
 
-#: vms-alpha.c:6710
+#: vms-alpha.c:6734
 #, c-format
 msgid "OPR_SUB (subtract)\n"
 msgstr ""
 
-#: vms-alpha.c:6713
+#: vms-alpha.c:6737
 #, c-format
 msgid "OPR_MUL (multiply)\n"
 msgstr ""
 
-#: vms-alpha.c:6716
+#: vms-alpha.c:6740
 #, c-format
 msgid "OPR_DIV (divide)\n"
 msgstr ""
 
-#: vms-alpha.c:6719
+#: vms-alpha.c:6743
 #, c-format
 msgid "OPR_AND (logical and)\n"
 msgstr ""
 
-#: vms-alpha.c:6722
+#: vms-alpha.c:6746
 #, c-format
 msgid "OPR_IOR (logical inclusive or)\n"
 msgstr ""
 
-#: vms-alpha.c:6725
+#: vms-alpha.c:6749
 #, c-format
 msgid "OPR_EOR (logical exclusive or)\n"
 msgstr ""
 
-#: vms-alpha.c:6728
+#: vms-alpha.c:6752
 #, c-format
 msgid "OPR_NEG (negate)\n"
 msgstr ""
 
-#: vms-alpha.c:6731
+#: vms-alpha.c:6755
 #, c-format
 msgid "OPR_COM (complement)\n"
 msgstr ""
 
-#: vms-alpha.c:6734
+#: vms-alpha.c:6758
 #, c-format
 msgid "OPR_INSV (insert field)\n"
 msgstr ""
 
-#: vms-alpha.c:6737
+#: vms-alpha.c:6761
 #, c-format
 msgid "OPR_ASH (arithmetic shift)\n"
 msgstr ""
 
-#: vms-alpha.c:6740
+#: vms-alpha.c:6764
 #, c-format
 msgid "OPR_USH (unsigned shift)\n"
 msgstr ""
 
-#: vms-alpha.c:6743
+#: vms-alpha.c:6767
 #, c-format
 msgid "OPR_ROT (rotate)\n"
 msgstr ""
 
-#: vms-alpha.c:6746
+#: vms-alpha.c:6770
 #, c-format
 msgid "OPR_SEL (select)\n"
 msgstr ""
 
-#: vms-alpha.c:6749
+#: vms-alpha.c:6773
 #, c-format
 msgid "OPR_REDEF (redefine symbol to curr location)\n"
 msgstr ""
 
-#: vms-alpha.c:6752
+#: vms-alpha.c:6776
 #, c-format
 msgid "OPR_REDEF (define a literal)\n"
 msgstr ""
 
-#: vms-alpha.c:6756
+#: vms-alpha.c:6780
 #, c-format
 msgid "STC_LP (store cond linkage pair)\n"
 msgstr ""
 
-#: vms-alpha.c:6760
+#: vms-alpha.c:6784
 #, c-format
 msgid "STC_LP_PSB (store cond linkage pair + signature)\n"
 msgstr ""
 
-#: vms-alpha.c:6764
+#: vms-alpha.c:6788
 #, c-format
 msgid "   linkage index: %u, procedure: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6771
+#: vms-alpha.c:6795
 #, c-format
 msgid "   signature: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6777
+#: vms-alpha.c:6801
 #, c-format
 msgid "STC_GBL (store cond global)\n"
 msgstr ""
 
-#: vms-alpha.c:6780
+#: vms-alpha.c:6804
 #, c-format
 msgid "   linkage index: %u, global: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6785
+#: vms-alpha.c:6809
 #, c-format
 msgid "STC_GCA (store cond code address)\n"
 msgstr ""
 
-#: vms-alpha.c:6788
+#: vms-alpha.c:6812
 #, c-format
 msgid "   linkage index: %u, procedure name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:6793
+#: vms-alpha.c:6817
 #, c-format
 msgid "STC_PS (store cond psect + offset)\n"
 msgstr ""
 
-#: vms-alpha.c:6797
+#: vms-alpha.c:6821
 #, c-format
 msgid "   linkage index: %u, psect: %u, offset: 0x%08x %08x\n"
 msgstr ""
 
-#: vms-alpha.c:6804
+#: vms-alpha.c:6828
 #, c-format
 msgid "STC_NOP_GBL (store cond NOP at global addr)\n"
 msgstr ""
 
-#: vms-alpha.c:6808
+#: vms-alpha.c:6832
 #, c-format
 msgid "STC_NOP_PS (store cond NOP at psect + offset)\n"
 msgstr ""
 
-#: vms-alpha.c:6812
+#: vms-alpha.c:6836
 #, c-format
 msgid "STC_BSR_GBL (store cond BSR at global addr)\n"
 msgstr ""
 
-#: vms-alpha.c:6816
+#: vms-alpha.c:6840
 #, c-format
 msgid "STC_BSR_PS (store cond BSR at psect + offset)\n"
 msgstr ""
 
-#: vms-alpha.c:6820
+#: vms-alpha.c:6844
 #, c-format
 msgid "STC_LDA_GBL (store cond LDA at global addr)\n"
 msgstr ""
 
-#: vms-alpha.c:6824
+#: vms-alpha.c:6848
 #, c-format
 msgid "STC_LDA_PS (store cond LDA at psect + offset)\n"
 msgstr ""
 
-#: vms-alpha.c:6828
+#: vms-alpha.c:6852
 #, c-format
 msgid "STC_BOH_GBL (store cond BOH at global addr)\n"
 msgstr ""
 
-#: vms-alpha.c:6832
+#: vms-alpha.c:6856
 #, c-format
 msgid "STC_BOH_PS (store cond BOH at psect + offset)\n"
 msgstr ""
 
-#: vms-alpha.c:6837
+#: vms-alpha.c:6861
 #, c-format
 msgid "STC_NBH_GBL (store cond or hint at global addr)\n"
 msgstr ""
 
-#: vms-alpha.c:6841
+#: vms-alpha.c:6865
 #, c-format
 msgid "STC_NBH_PS (store cond or hint at psect + offset)\n"
 msgstr ""
 
-#: vms-alpha.c:6845
+#: vms-alpha.c:6869
 #, c-format
 msgid "CTL_SETRB (set relocation base)\n"
 msgstr ""
 
-#: vms-alpha.c:6851
+#: vms-alpha.c:6875
 #, c-format
 msgid "CTL_AUGRB (augment relocation base) %u\n"
 msgstr ""
 
-#: vms-alpha.c:6856
+#: vms-alpha.c:6880
 #, c-format
 msgid "CTL_DFLOC (define location)\n"
 msgstr ""
 
-#: vms-alpha.c:6859
+#: vms-alpha.c:6883
 #, c-format
 msgid "CTL_STLOC (set location)\n"
 msgstr ""
 
-#: vms-alpha.c:6862
+#: vms-alpha.c:6886
 #, c-format
 msgid "CTL_STKDL (stack defined location)\n"
 msgstr ""
 
-#: vms-alpha.c:6865 vms-alpha.c:7293 vms-alpha.c:7454
+#: vms-alpha.c:6889 vms-alpha.c:7317 vms-alpha.c:7478
 #, c-format
 msgid "*unhandled*\n"
 msgstr ""
 
-#: vms-alpha.c:6890
+#: vms-alpha.c:6914
 #, c-format
 msgid "cannot read GST record header\n"
 msgstr ""
 
 #. Ill-formed.
-#: vms-alpha.c:6913
+#: vms-alpha.c:6937
 #, c-format
 msgid "cannot find EMH in first GST record\n"
 msgstr ""
 
-#: vms-alpha.c:6937
+#: vms-alpha.c:6961
 #, c-format
 msgid "corrupted GST\n"
 msgstr ""
 
-#: vms-alpha.c:6950
+#: vms-alpha.c:6974
 #, c-format
 msgid "cannot read GST record\n"
 msgstr ""
 
-#: vms-alpha.c:6977
+#: vms-alpha.c:7001
 #, c-format
 msgid " unhandled EOBJ record type %u\n"
 msgstr ""
 
-#: vms-alpha.c:7002
+#: vms-alpha.c:7026
 #, c-format
 msgid "  bitcount: %u, base addr: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7016
+#: vms-alpha.c:7040
 #, c-format
 msgid "   bitmap: 0x%08x (count: %u):\n"
 msgstr ""
 
-#: vms-alpha.c:7023
+#: vms-alpha.c:7047
 #, c-format
 msgid " %08x"
 msgstr ""
 
-#: vms-alpha.c:7050
+#: vms-alpha.c:7074
 #, c-format
 msgid "  image %u (%u entries)\n"
 msgstr ""
 
-#: vms-alpha.c:7056
+#: vms-alpha.c:7080
 #, c-format
 msgid "   offset: 0x%08x, val: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7079
+#: vms-alpha.c:7103
 #, c-format
 msgid "  image %u (%u entries), offsets:\n"
 msgstr ""
 
-#: vms-alpha.c:7086
+#: vms-alpha.c:7110
 #, c-format
 msgid " 0x%08x"
 msgstr ""
 
 #. 64 bits.
-#: vms-alpha.c:7212
+#: vms-alpha.c:7236
 #, c-format
 msgid "64 bits *unhandled*\n"
 msgstr ""
 
-#: vms-alpha.c:7217
+#: vms-alpha.c:7241
 #, c-format
 msgid "class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7228
+#: vms-alpha.c:7252
 #, c-format
 msgid "non-contiguous array of %s\n"
 msgstr ""
 
-#: vms-alpha.c:7235
+#: vms-alpha.c:7259
 #, c-format
 msgid "dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"
 msgstr ""
 
-#: vms-alpha.c:7240
+#: vms-alpha.c:7264
 #, c-format
 msgid "arsize: %u, a0: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7244
+#: vms-alpha.c:7268
 #, c-format
 msgid "Strides:\n"
 msgstr ""
 
-#: vms-alpha.c:7258
+#: vms-alpha.c:7282
 #, c-format
 msgid "Bounds:\n"
 msgstr ""
 
-#: vms-alpha.c:7265
+#: vms-alpha.c:7289
 #, c-format
 msgid "[%u]: Lower: %u, upper: %u\n"
 msgstr ""
 
-#: vms-alpha.c:7279
+#: vms-alpha.c:7303
 #, c-format
 msgid "unaligned bit-string of %s\n"
 msgstr ""
 
-#: vms-alpha.c:7286
+#: vms-alpha.c:7310
 #, c-format
 msgid "base: %u, pos: %u\n"
 msgstr ""
 
-#: vms-alpha.c:7312
+#: vms-alpha.c:7336
 #, c-format
 msgid "vflags: 0x%02x, value: 0x%08x "
 msgstr ""
 
-#: vms-alpha.c:7319
+#: vms-alpha.c:7343
 #, c-format
 msgid "(no value)\n"
 msgstr ""
 
-#: vms-alpha.c:7322
+#: vms-alpha.c:7346
 #, c-format
 msgid "(not active)\n"
 msgstr ""
 
-#: vms-alpha.c:7325
+#: vms-alpha.c:7349
 #, c-format
 msgid "(not allocated)\n"
 msgstr ""
 
-#: vms-alpha.c:7328
+#: vms-alpha.c:7352
 #, c-format
 msgid "(descriptor)\n"
 msgstr ""
 
-#: vms-alpha.c:7333
+#: vms-alpha.c:7357
 #, c-format
 msgid "(trailing value)\n"
 msgstr ""
 
-#: vms-alpha.c:7336
+#: vms-alpha.c:7360
 #, c-format
 msgid "(value spec follows)\n"
 msgstr ""
 
-#: vms-alpha.c:7339
+#: vms-alpha.c:7363
 #, c-format
 msgid "(at bit offset %u)\n"
 msgstr ""
 
-#: vms-alpha.c:7343
+#: vms-alpha.c:7367
 #, c-format
 msgid "(reg: %u, disp: %u, indir: %u, kind: "
 msgstr ""
 
-#: vms-alpha.c:7350
+#: vms-alpha.c:7374
 msgid "literal"
 msgstr ""
 
-#: vms-alpha.c:7353
+#: vms-alpha.c:7377
 msgid "address"
 msgstr ""
 
-#: vms-alpha.c:7356
+#: vms-alpha.c:7380
 msgid "desc"
 msgstr ""
 
-#: vms-alpha.c:7359
+#: vms-alpha.c:7383
 msgid "reg"
 msgstr ""
 
-#: vms-alpha.c:7380
+#: vms-alpha.c:7404
 #, c-format
 msgid "len: %2u, kind: %2u "
 msgstr ""
 
-#: vms-alpha.c:7388
+#: vms-alpha.c:7412
 #, c-format
 msgid "atomic, type=0x%02x %s\n"
 msgstr ""
 
-#: vms-alpha.c:7393
+#: vms-alpha.c:7417
 #, c-format
 msgid "indirect, defined at 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7397
+#: vms-alpha.c:7421
 #, c-format
 msgid "typed pointer\n"
 msgstr ""
 
-#: vms-alpha.c:7401
+#: vms-alpha.c:7425
 #, c-format
 msgid "pointer\n"
 msgstr ""
 
-#: vms-alpha.c:7412
+#: vms-alpha.c:7436
 #, c-format
 msgid "array, dim: %u, bitmap: "
 msgstr ""
 
-#: vms-alpha.c:7427
+#: vms-alpha.c:7451
 #, c-format
 msgid "array descriptor:\n"
 msgstr ""
 
-#: vms-alpha.c:7438
+#: vms-alpha.c:7462
 #, c-format
 msgid "type spec for element:\n"
 msgstr ""
 
-#: vms-alpha.c:7440
+#: vms-alpha.c:7464
 #, c-format
 msgid "type spec for subscript %u:\n"
 msgstr ""
 
-#: vms-alpha.c:7465
+#: vms-alpha.c:7489
 #, c-format
 msgid "Debug symbol table:\n"
 msgstr ""
 
-#: vms-alpha.c:7476
+#: vms-alpha.c:7500
 #, c-format
 msgid "cannot read DST header\n"
 msgstr ""
 
-#: vms-alpha.c:7482
+#: vms-alpha.c:7506
 #, c-format
 msgid " type: %3u, len: %3u (at 0x%08x): "
 msgstr ""
 
-#: vms-alpha.c:7499
+#: vms-alpha.c:7523
 #, c-format
 msgid "cannot read DST symbol\n"
 msgstr ""
 
-#: vms-alpha.c:7543
+#: vms-alpha.c:7567
 #, c-format
 msgid "standard data: %s\n"
 msgstr ""
 
-#: vms-alpha.c:7547 vms-alpha.c:7671
+#: vms-alpha.c:7571 vms-alpha.c:7695
 #, c-format
 msgid "    name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:7555
+#: vms-alpha.c:7579
 #, c-format
 msgid "modbeg\n"
 msgstr ""
 
-#: vms-alpha.c:7559
+#: vms-alpha.c:7583
 #, c-format
 msgid "   flags: %d, language: %u, major: %u, minor: %u\n"
 msgstr ""
 
-#: vms-alpha.c:7569 vms-alpha.c:7935
+#: vms-alpha.c:7593 vms-alpha.c:7959
 #, c-format
 msgid "   module name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:7576
+#: vms-alpha.c:7600
 #, c-format
 msgid "   compiler   : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:7583
+#: vms-alpha.c:7607
 #, c-format
 msgid "modend\n"
 msgstr ""
 
-#: vms-alpha.c:7590
+#: vms-alpha.c:7614
 msgid "rtnbeg\n"
 msgstr ""
 
-#: vms-alpha.c:7594
+#: vms-alpha.c:7618
 #, c-format
 msgid "    flags: %u, address: 0x%08x, pd-address: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7603
+#: vms-alpha.c:7627
 #, c-format
 msgid "    routine name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:7614
+#: vms-alpha.c:7638
 #, c-format
 msgid "rtnend: size 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7624
+#: vms-alpha.c:7648
 #, c-format
 msgid "prolog: bkpt address 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7634
+#: vms-alpha.c:7658
 #, c-format
 msgid "epilog: flags: %u, count: %u\n"
 msgstr ""
 
-#: vms-alpha.c:7649
+#: vms-alpha.c:7673
 #, c-format
 msgid "blkbeg: address: 0x%08x, name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:7661
+#: vms-alpha.c:7685
 #, c-format
 msgid "blkend: size: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7667
+#: vms-alpha.c:7691
 #, c-format
 msgid "typspec (len: %u)\n"
 msgstr ""
 
-#: vms-alpha.c:7683
+#: vms-alpha.c:7707
 #, c-format
 msgid "septyp, name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:7699
+#: vms-alpha.c:7723
 #, c-format
 msgid "recbeg: name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:7703
+#: vms-alpha.c:7727
 #, c-format
 msgid "    len: %u bits\n"
 msgstr ""
 
-#: vms-alpha.c:7709
+#: vms-alpha.c:7733
 #, c-format
 msgid "recend\n"
 msgstr ""
 
-#: vms-alpha.c:7714
+#: vms-alpha.c:7738
 #, c-format
 msgid "enumbeg, len: %u, name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:7720
+#: vms-alpha.c:7744
 #, c-format
 msgid "enumelt, name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:7726
+#: vms-alpha.c:7750
 #, c-format
 msgid "enumend\n"
 msgstr ""
 
-#: vms-alpha.c:7733
+#: vms-alpha.c:7757
 #, c-format
 msgid "label, name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:7736
+#: vms-alpha.c:7760
 #, c-format
 msgid "    address: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7748
+#: vms-alpha.c:7772
 #, c-format
 msgid "discontiguous range (nbr: %u)\n"
 msgstr ""
 
-#: vms-alpha.c:7755
+#: vms-alpha.c:7779
 #, c-format
 msgid "    address: 0x%08x, size: %u\n"
 msgstr ""
 
-#: vms-alpha.c:7766
+#: vms-alpha.c:7790
 #, c-format
 msgid "line num  (len: %u)\n"
 msgstr ""
 
-#: vms-alpha.c:7785
+#: vms-alpha.c:7809
 #, c-format
 msgid "delta_pc_w %u\n"
 msgstr ""
 
-#: vms-alpha.c:7794
+#: vms-alpha.c:7818
 #, c-format
 msgid "incr_linum(b): +%u\n"
 msgstr ""
 
-#: vms-alpha.c:7802
+#: vms-alpha.c:7826
 #, c-format
 msgid "incr_linum_w: +%u\n"
 msgstr ""
 
-#: vms-alpha.c:7810
+#: vms-alpha.c:7834
 #, c-format
 msgid "incr_linum_l: +%u\n"
 msgstr ""
 
-#: vms-alpha.c:7818
+#: vms-alpha.c:7842
 #, c-format
 msgid "set_line_num(w) %u\n"
 msgstr ""
 
-#: vms-alpha.c:7825
+#: vms-alpha.c:7849
 #, c-format
 msgid "set_line_num_b %u\n"
 msgstr ""
 
-#: vms-alpha.c:7832
+#: vms-alpha.c:7856
 #, c-format
 msgid "set_line_num_l %u\n"
 msgstr ""
 
-#: vms-alpha.c:7839
+#: vms-alpha.c:7863
 #, c-format
 msgid "set_abs_pc: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7845
+#: vms-alpha.c:7869
 #, c-format
 msgid "delta_pc_l: +0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7852
+#: vms-alpha.c:7876
 #, c-format
 msgid "term(b): 0x%02x"
 msgstr ""
 
-#: vms-alpha.c:7854
+#: vms-alpha.c:7878
 #, c-format
 msgid "        pc: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7861
+#: vms-alpha.c:7885
 #, c-format
 msgid "term_w: 0x%04x"
 msgstr ""
 
-#: vms-alpha.c:7863
+#: vms-alpha.c:7887
 #, c-format
 msgid "    pc: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:7869
+#: vms-alpha.c:7893
 #, c-format
 msgid "delta pc +%-4d"
 msgstr ""
 
-#: vms-alpha.c:7873
+#: vms-alpha.c:7897
 #, c-format
 msgid "    pc: 0x%08x line: %5u\n"
 msgstr ""
 
-#: vms-alpha.c:7878
+#: vms-alpha.c:7902
 #, c-format
 msgid "    *unhandled* cmd %u\n"
 msgstr ""
 
-#: vms-alpha.c:7893
+#: vms-alpha.c:7917
 #, c-format
 msgid "source (len: %u)\n"
 msgstr ""
 
-#: vms-alpha.c:7912
+#: vms-alpha.c:7936
 #, c-format
 msgid "   declfile: len: %u, flags: %u, fileid: %u\n"
 msgstr ""
 
-#: vms-alpha.c:7917
+#: vms-alpha.c:7941
 #, c-format
 msgid "   rms: cdt: 0x%08x %08x, ebk: 0x%08x, ffb: 0x%04x, rfo: %u\n"
 msgstr ""
 
-#: vms-alpha.c:7929
+#: vms-alpha.c:7953
 #, c-format
 msgid "   filename   : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:7945
+#: vms-alpha.c:7969
 #, c-format
 msgid "   setfile %u\n"
 msgstr ""
 
-#: vms-alpha.c:7952 vms-alpha.c:7959
+#: vms-alpha.c:7976 vms-alpha.c:7983
 #, c-format
 msgid "   setrec %u\n"
 msgstr ""
 
-#: vms-alpha.c:7966 vms-alpha.c:7973
+#: vms-alpha.c:7990 vms-alpha.c:7997
 #, c-format
 msgid "   setlnum %u\n"
 msgstr ""
 
-#: vms-alpha.c:7980 vms-alpha.c:7987
+#: vms-alpha.c:8004 vms-alpha.c:8011
 #, c-format
 msgid "   deflines %u\n"
 msgstr ""
 
-#: vms-alpha.c:7991
+#: vms-alpha.c:8015
 #, c-format
 msgid "   formfeed\n"
 msgstr ""
 
-#: vms-alpha.c:7995
+#: vms-alpha.c:8019
 #, c-format
 msgid "   *unhandled* cmd %u\n"
 msgstr ""
 
-#: vms-alpha.c:8007
+#: vms-alpha.c:8031
 #, c-format
 msgid "*unhandled* dst type %u\n"
 msgstr ""
 
-#: vms-alpha.c:8039
+#: vms-alpha.c:8063
 #, c-format
 msgid "cannot read EIHD\n"
 msgstr ""
 
-#: vms-alpha.c:8043
+#: vms-alpha.c:8067
 #, c-format
 msgid "EIHD: (size: %u, nbr blocks: %u)\n"
 msgstr ""
 
-#: vms-alpha.c:8047
+#: vms-alpha.c:8071
 #, c-format
 msgid " majorid: %u, minorid: %u\n"
 msgstr ""
 
-#: vms-alpha.c:8055
+#: vms-alpha.c:8079
 msgid "executable"
 msgstr ""
 
-#: vms-alpha.c:8058
+#: vms-alpha.c:8082
 msgid "linkable image"
 msgstr ""
 
-#: vms-alpha.c:8065
+#: vms-alpha.c:8089
 #, c-format
 msgid " image type: %u (%s)"
 msgstr ""
 
-#: vms-alpha.c:8071
+#: vms-alpha.c:8095
 msgid "native"
 msgstr ""
 
-#: vms-alpha.c:8074
+#: vms-alpha.c:8098
 msgid "CLI"
 msgstr ""
 
-#: vms-alpha.c:8081
+#: vms-alpha.c:8105
 #, c-format
 msgid ", subtype: %u (%s)\n"
 msgstr ""
 
-#: vms-alpha.c:8088
+#: vms-alpha.c:8112
 #, c-format
 msgid " offsets: isd: %u, activ: %u, symdbg: %u, imgid: %u, patch: %u\n"
 msgstr ""
 
-#: vms-alpha.c:8092
+#: vms-alpha.c:8116
 #, c-format
 msgid " fixup info rva: "
 msgstr ""
 
-#: vms-alpha.c:8094
+#: vms-alpha.c:8118
 #, c-format
 msgid ", symbol vector rva: "
 msgstr ""
 
-#: vms-alpha.c:8097
+#: vms-alpha.c:8121
 #, c-format
 msgid ""
 "\n"
 " version array off: %u\n"
 msgstr ""
 
-#: vms-alpha.c:8102
+#: vms-alpha.c:8126
 #, c-format
 msgid " img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:8108
+#: vms-alpha.c:8132
 #, c-format
 msgid " linker flags: %08x:"
 msgstr ""
 
-#: vms-alpha.c:8139
+#: vms-alpha.c:8163
 #, c-format
 msgid " ident: 0x%08x, sysver: 0x%08x, match ctrl: %u, symvect_size: %u\n"
 msgstr ""
 
-#: vms-alpha.c:8145
+#: vms-alpha.c:8169
 #, c-format
 msgid " BPAGE: %u"
 msgstr ""
 
-#: vms-alpha.c:8152
+#: vms-alpha.c:8176
 #, c-format
 msgid ", ext fixup offset: %u, no_opt psect off: %u"
 msgstr ""
 
-#: vms-alpha.c:8155
+#: vms-alpha.c:8179
 #, c-format
 msgid ", alias: %u\n"
 msgstr ""
 
-#: vms-alpha.c:8163
+#: vms-alpha.c:8187
 #, c-format
 msgid "system version array information:\n"
 msgstr ""
 
-#: vms-alpha.c:8167
+#: vms-alpha.c:8191
 #, c-format
 msgid "cannot read EIHVN header\n"
 msgstr ""
 
-#: vms-alpha.c:8177
+#: vms-alpha.c:8201
 #, c-format
 msgid "cannot read EIHVN version\n"
 msgstr ""
 
-#: vms-alpha.c:8180
+#: vms-alpha.c:8204
 #, c-format
 msgid "   %02u "
 msgstr ""
 
-#: vms-alpha.c:8184
+#: vms-alpha.c:8208
 msgid "BASE_IMAGE       "
 msgstr ""
 
-#: vms-alpha.c:8187
+#: vms-alpha.c:8211
 msgid "MEMORY_MANAGEMENT"
 msgstr ""
 
-#: vms-alpha.c:8190
+#: vms-alpha.c:8214
 msgid "IO               "
 msgstr ""
 
-#: vms-alpha.c:8193
+#: vms-alpha.c:8217
 msgid "FILES_VOLUMES    "
 msgstr ""
 
-#: vms-alpha.c:8196
+#: vms-alpha.c:8220
 msgid "PROCESS_SCHED    "
 msgstr ""
 
-#: vms-alpha.c:8199
+#: vms-alpha.c:8223
 msgid "SYSGEN           "
 msgstr ""
 
-#: vms-alpha.c:8202
+#: vms-alpha.c:8226
 msgid "CLUSTERS_LOCKMGR "
 msgstr ""
 
-#: vms-alpha.c:8205
+#: vms-alpha.c:8229
 msgid "LOGICAL_NAMES    "
 msgstr ""
 
-#: vms-alpha.c:8208
+#: vms-alpha.c:8232
 msgid "SECURITY         "
 msgstr ""
 
-#: vms-alpha.c:8211
+#: vms-alpha.c:8235
 msgid "IMAGE_ACTIVATOR  "
 msgstr ""
 
-#: vms-alpha.c:8214
+#: vms-alpha.c:8238
 msgid "NETWORKS         "
 msgstr ""
 
-#: vms-alpha.c:8217
+#: vms-alpha.c:8241
 msgid "COUNTERS         "
 msgstr ""
 
-#: vms-alpha.c:8220
+#: vms-alpha.c:8244
 msgid "STABLE           "
 msgstr ""
 
-#: vms-alpha.c:8223
+#: vms-alpha.c:8247
 msgid "MISC             "
 msgstr ""
 
-#: vms-alpha.c:8226
+#: vms-alpha.c:8250
 msgid "CPU              "
 msgstr ""
 
-#: vms-alpha.c:8229
+#: vms-alpha.c:8253
 msgid "VOLATILE         "
 msgstr ""
 
-#: vms-alpha.c:8232
+#: vms-alpha.c:8256
 msgid "SHELL            "
 msgstr ""
 
-#: vms-alpha.c:8235
+#: vms-alpha.c:8259
 msgid "POSIX            "
 msgstr ""
 
-#: vms-alpha.c:8238
+#: vms-alpha.c:8262
 msgid "MULTI_PROCESSING "
 msgstr ""
 
-#: vms-alpha.c:8241
+#: vms-alpha.c:8265
 msgid "GALAXY           "
 msgstr ""
 
-#: vms-alpha.c:8244
+#: vms-alpha.c:8268
 msgid "*unknown*        "
 msgstr ""
 
-#: vms-alpha.c:8260 vms-alpha.c:8534
+#: vms-alpha.c:8284 vms-alpha.c:8558
 #, c-format
 msgid "cannot read EIHA\n"
 msgstr ""
 
-#: vms-alpha.c:8263
+#: vms-alpha.c:8287
 #, c-format
 msgid "Image activation:  (size=%u)\n"
 msgstr ""
 
-#: vms-alpha.c:8266
+#: vms-alpha.c:8290
 #, c-format
 msgid " First address : 0x%08x 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:8270
+#: vms-alpha.c:8294
 #, c-format
 msgid " Second address: 0x%08x 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:8274
+#: vms-alpha.c:8298
 #, c-format
 msgid " Third address : 0x%08x 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:8278
+#: vms-alpha.c:8302
 #, c-format
 msgid " Fourth address: 0x%08x 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:8282
+#: vms-alpha.c:8306
 #, c-format
 msgid " Shared image  : 0x%08x 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:8293
+#: vms-alpha.c:8317
 #, c-format
 msgid "cannot read EIHI\n"
 msgstr ""
 
-#: vms-alpha.c:8297
+#: vms-alpha.c:8321
 #, c-format
 msgid "Image identification: (major: %u, minor: %u)\n"
 msgstr ""
 
-#: vms-alpha.c:8300
+#: vms-alpha.c:8324
 #, c-format
 msgid " image name       : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:8302
+#: vms-alpha.c:8326
 #, c-format
 msgid " link time        : %s\n"
 msgstr ""
 
-#: vms-alpha.c:8304
+#: vms-alpha.c:8328
 #, c-format
 msgid " image ident      : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:8306
+#: vms-alpha.c:8330
 #, c-format
 msgid " linker ident     : %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:8308
+#: vms-alpha.c:8332
 #, c-format
 msgid " image build ident: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:8318
+#: vms-alpha.c:8342
 #, c-format
 msgid "cannot read EIHS\n"
 msgstr ""
 
-#: vms-alpha.c:8322
+#: vms-alpha.c:8346
 #, c-format
 msgid "Image symbol & debug table: (major: %u, minor: %u)\n"
 msgstr ""
 
-#: vms-alpha.c:8328
+#: vms-alpha.c:8352
 #, c-format
 msgid " debug symbol table : vbn: %u, size: %u (0x%x)\n"
 msgstr ""
 
-#: vms-alpha.c:8333
+#: vms-alpha.c:8357
 #, c-format
 msgid " global symbol table: vbn: %u, records: %u\n"
 msgstr ""
 
-#: vms-alpha.c:8338
+#: vms-alpha.c:8362
 #, c-format
 msgid " debug module table : vbn: %u, size: %u\n"
 msgstr ""
 
-#: vms-alpha.c:8351
+#: vms-alpha.c:8375
 #, c-format
 msgid "cannot read EISD\n"
 msgstr ""
 
-#: vms-alpha.c:8362
+#: vms-alpha.c:8386
 #, c-format
 msgid ""
 "Image section descriptor: (major: %u, minor: %u, size: %u, offset: %u)\n"
 msgstr ""
 
-#: vms-alpha.c:8370
+#: vms-alpha.c:8394
 #, c-format
 msgid " section: base: 0x%08x%08x size: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:8375
+#: vms-alpha.c:8399
 #, c-format
 msgid " flags: 0x%04x"
 msgstr ""
 
-#: vms-alpha.c:8413
+#: vms-alpha.c:8437
 #, c-format
 msgid " vbn: %u, pfc: %u, matchctl: %u type: %u ("
 msgstr ""
 
-#: vms-alpha.c:8419
+#: vms-alpha.c:8443
 msgid "NORMAL"
 msgstr ""
 
-#: vms-alpha.c:8422
+#: vms-alpha.c:8446
 msgid "SHRFXD"
 msgstr ""
 
-#: vms-alpha.c:8425
+#: vms-alpha.c:8449
 msgid "PRVFXD"
 msgstr ""
 
-#: vms-alpha.c:8428
+#: vms-alpha.c:8452
 msgid "SHRPIC"
 msgstr ""
 
-#: vms-alpha.c:8431
+#: vms-alpha.c:8455
 msgid "PRVPIC"
 msgstr ""
 
-#: vms-alpha.c:8434
+#: vms-alpha.c:8458
 msgid "USRSTACK"
 msgstr ""
 
-#: vms-alpha.c:8440
+#: vms-alpha.c:8464
 msgid ")\n"
 msgstr ""
 
-#: vms-alpha.c:8443
+#: vms-alpha.c:8467
 #, c-format
 msgid " ident: 0x%08x, name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:8453
+#: vms-alpha.c:8477
 #, c-format
 msgid "cannot read DMT\n"
 msgstr ""
 
-#: vms-alpha.c:8457
+#: vms-alpha.c:8481
 #, c-format
 msgid "Debug module table:\n"
 msgstr ""
 
-#: vms-alpha.c:8466
+#: vms-alpha.c:8490
 #, c-format
 msgid "cannot read DMT header\n"
 msgstr ""
 
-#: vms-alpha.c:8472
+#: vms-alpha.c:8496
 #, c-format
 msgid " module offset: 0x%08x, size: 0x%08x, (%u psects)\n"
 msgstr ""
 
-#: vms-alpha.c:8482
+#: vms-alpha.c:8506
 #, c-format
 msgid "cannot read DMT psect\n"
 msgstr ""
 
-#: vms-alpha.c:8486
+#: vms-alpha.c:8510
 #, c-format
 msgid "  psect start: 0x%08x, length: %u\n"
 msgstr ""
 
-#: vms-alpha.c:8499
+#: vms-alpha.c:8523
 #, c-format
 msgid "cannot read DST\n"
 msgstr ""
 
-#: vms-alpha.c:8509
+#: vms-alpha.c:8533
 #, c-format
 msgid "cannot read GST\n"
 msgstr ""
 
-#: vms-alpha.c:8513
+#: vms-alpha.c:8537
 #, c-format
 msgid "Global symbol table:\n"
 msgstr ""
 
-#: vms-alpha.c:8540
+#: vms-alpha.c:8564
 #, c-format
 msgid "Image activator fixup: (major: %u, minor: %u)\n"
 msgstr ""
 
-#: vms-alpha.c:8544
+#: vms-alpha.c:8568
 #, c-format
 msgid "  iaflink : 0x%08x %08x\n"
 msgstr ""
 
-#: vms-alpha.c:8548
+#: vms-alpha.c:8572
 #, c-format
 msgid "  fixuplnk: 0x%08x %08x\n"
 msgstr ""
 
-#: vms-alpha.c:8551
+#: vms-alpha.c:8575
 #, c-format
 msgid "  size : %u\n"
 msgstr ""
 
-#: vms-alpha.c:8553
+#: vms-alpha.c:8577
 #, c-format
 msgid "  flags: 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:8558
+#: vms-alpha.c:8582
 #, c-format
 msgid "  qrelfixoff: %5u, lrelfixoff: %5u\n"
 msgstr ""
 
-#: vms-alpha.c:8563
+#: vms-alpha.c:8587
 #, c-format
 msgid "  qdotadroff: %5u, ldotadroff: %5u\n"
 msgstr ""
 
-#: vms-alpha.c:8568
+#: vms-alpha.c:8592
 #, c-format
 msgid "  codeadroff: %5u, lpfixoff  : %5u\n"
 msgstr ""
 
-#: vms-alpha.c:8571
+#: vms-alpha.c:8595
 #, c-format
 msgid "  chgprtoff : %5u\n"
 msgstr ""
 
-#: vms-alpha.c:8575
+#: vms-alpha.c:8599
 #, c-format
 msgid "  shlstoff  : %5u, shrimgcnt : %5u\n"
 msgstr ""
 
-#: vms-alpha.c:8578
+#: vms-alpha.c:8602
 #, c-format
 msgid "  shlextra  : %5u, permctx   : %5u\n"
 msgstr ""
 
-#: vms-alpha.c:8581
+#: vms-alpha.c:8605
 #, c-format
 msgid "  base_va : 0x%08x\n"
 msgstr ""
 
-#: vms-alpha.c:8583
+#: vms-alpha.c:8607
 #, c-format
 msgid "  lppsbfixoff: %5u\n"
 msgstr ""
 
-#: vms-alpha.c:8590
+#: vms-alpha.c:8614
 #, c-format
 msgid " Shareable images:\n"
 msgstr ""
 
-#: vms-alpha.c:8598
+#: vms-alpha.c:8622
 #, c-format
 msgid "  %u: size: %u, flags: 0x%02x, name: %.*s\n"
 msgstr ""
 
-#: vms-alpha.c:8605
+#: vms-alpha.c:8629
 #, c-format
 msgid " quad-word relocation fixups:\n"
 msgstr ""
 
-#: vms-alpha.c:8611
+#: vms-alpha.c:8635
 #, c-format
 msgid " long-word relocation fixups:\n"
 msgstr ""
 
-#: vms-alpha.c:8617
+#: vms-alpha.c:8641
 #, c-format
 msgid " quad-word .address reference fixups:\n"
 msgstr ""
 
-#: vms-alpha.c:8622
+#: vms-alpha.c:8646
 #, c-format
 msgid " long-word .address reference fixups:\n"
 msgstr ""
 
-#: vms-alpha.c:8627
+#: vms-alpha.c:8651
 #, c-format
 msgid " Code Address Reference Fixups:\n"
 msgstr ""
 
-#: vms-alpha.c:8632
+#: vms-alpha.c:8656
 #, c-format
 msgid " Linkage Pairs Reference Fixups:\n"
 msgstr ""
 
-#: vms-alpha.c:8640
+#: vms-alpha.c:8664
 #, c-format
 msgid " Change Protection (%u entries):\n"
 msgstr ""
 
-#: vms-alpha.c:8649
+#: vms-alpha.c:8673
 #, c-format
 msgid "  base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "
 msgstr ""
 
 #. FIXME: we do not yet support relocatable link.  It is not obvious
 #. how to do it for debug infos.
-#: vms-alpha.c:9526
+#: vms-alpha.c:9550
 msgid "%P: relocatable link is not supported\n"
 msgstr ""
 
-#: vms-alpha.c:9597
+#: vms-alpha.c:9621
 #, c-format
 msgid "%P: multiple entry points: in modules %pB and %pB\n"
 msgstr ""
@@ -8868,11 +8942,11 @@ msgstr ""
 msgid "could not open shared image '%s' from '%s'"
 msgstr ""
 
-#: vms-misc.c:370
+#: vms-misc.c:374
 msgid "_bfd_vms_output_counted called with zero bytes"
 msgstr ""
 
-#: vms-misc.c:375
+#: vms-misc.c:379
 msgid "_bfd_vms_output_counted called with too many bytes"
 msgstr ""
 
@@ -9011,7 +9085,8 @@ msgid "%s is defined but plugin support is disabled"
 msgstr ""
 
 #. Not fatal, this callback cannot fail.
-#: elfnn-aarch64.c:2893 elfnn-riscv.c:5518
+#: elfnn-aarch64.c:2893
+#: elfnn-riscv.c:5524
 #, c-format
 msgid "unknown attribute for symbol `%s': 0x%02x"
 msgstr ""
@@ -9047,13 +9122,15 @@ msgid "%pB: conditional branch to undefined symbol `%s' not allowed"
 msgstr ""
 
 #: elfnn-aarch64.c:6173
+#: elfnn-kvx.c:2384
 #, c-format
 msgid ""
 "%pB: local symbol descriptor table be NULL when applying relocation %s "
 "against local symbol"
 msgstr ""
 
-#: elfnn-aarch64.c:6286 elfnn-aarch64.c:6323
+#: elfnn-aarch64.c:6286
+#: elfnn-aarch64.c:6323
 #, c-format
 msgid "%pB: TLS relocation %s against undefined symbol `%s'"
 msgstr ""
@@ -9080,12 +9157,87 @@ msgstr ""
 msgid "%F%P: %pB: copy relocation against non-copyable protected symbol `%s'\n"
 msgstr ""
 
-#: elfnn-loongarch.c:153 elfnn-loongarch.c:205
+#: elfnn-kvx.c:930
+msgid ""
+"%F%P: Could not assign '%pA' to an output section. Retry without --enable-"
+"non-contiguous-regions.\n"
+msgstr ""
+
+#: elfnn-kvx.c:2129
+#, c-format
+msgid "%pB(%pA+%#<PRIx64>): unresolvable %s relocation in section `%s'"
+msgstr ""
+
+#: elfnn-kvx.c:2853
+#, c-format
+msgid "%s: Bad ELF id: `%d'"
+msgstr ""
+
+#: elfnn-kvx.c:2908
+#, c-format
+msgid "%s: compiled as 32-bit object and %s is 64-bit"
+msgstr ""
+
+#: elfnn-kvx.c:2911
+#, c-format
+msgid "%s: compiled as 64-bit object and %s is 32-bit"
+msgstr ""
+
+#: elfnn-kvx.c:2913
+#, c-format
+msgid "%s: object size does not match that of target %s"
+msgstr ""
+
+#. Ignore init flag - it may not be set, despite the flags field
+#. containing valid data.
+#: elfnn-kvx.c:3001
+#, c-format
+msgid "Private flags = 0x%lx : "
+msgstr ""
+
+#: elfnn-kvx.c:3005
+#, c-format
+msgid "Coolidge (kv3) V1 64 bits"
+msgstr ""
+
+#: elfnn-kvx.c:3007
+#, c-format
+msgid "Coolidge (kv3) V2 64 bits"
+msgstr ""
+
+#: elfnn-kvx.c:3009
+#, c-format
+msgid "Coolidge (kv4) V1 64 bits"
+msgstr ""
+
+#: elfnn-kvx.c:3014
+#, c-format
+msgid "Coolidge (kv3) V1 32 bits"
+msgstr ""
+
+#: elfnn-kvx.c:3016
+#, c-format
+msgid "Coolidge (kv3) V2 32 bits"
+msgstr ""
+
+#: elfnn-kvx.c:3018
+#, c-format
+msgid "Coolidge (kv4) V1 32 bits"
+msgstr ""
+
+#: elfnn-kvx.c:3854
+#, c-format
+msgid "relocation against `%s' has faulty GOT type "
+msgstr ""
+
+#: elfnn-loongarch.c:153
+#: elfnn-loongarch.c:205
 #, c-format
 msgid "%#<PRIx64> invaild imm"
 msgstr ""
 
-#: elfnn-loongarch.c:387 elfnn-riscv.c:4005
+#: elfnn-loongarch.c:387
+#: elfnn-riscv.c:4005
 #, c-format
 msgid ""
 "%pB: ABI is incompatible with that of the selected emulation:\n"
@@ -9101,14 +9253,16 @@ msgstr ""
 msgid "Internal error: unreachable."
 msgstr ""
 
-#: elfnn-loongarch.c:3809 elfnn-riscv.c:4766
+#: elfnn-loongarch.c:3848
+#: elfnn-riscv.c:4766
 #, c-format
 msgid ""
 "%pB(%pA+%#<PRIx64>): %<PRId64> bytes required for alignment to %<PRId64>-"
 "byte boundary, but only %<PRId64> present"
 msgstr ""
 
-#: elfnn-riscv.c:329 elfnn-riscv.c:364
+#: elfnn-riscv.c:329
+#: elfnn-riscv.c:364
 #, c-format
 msgid "%pB: warning: RVE PLT generation not supported"
 msgstr ""
@@ -9286,173 +9440,174 @@ msgstr ""
 msgid "%pB: unable to create fake empty section"
 msgstr ""
 
-#: peXXigen.c:920
+#: peXXigen.c:922
 #, c-format
 msgid "%pB:%.8s: section below image base"
 msgstr ""
 
-#: peXXigen.c:925
+#: peXXigen.c:927
 #, c-format
 msgid "%pB:%.8s: RVA truncated"
 msgstr ""
 
-#: peXXigen.c:1056
+#: peXXigen.c:1058
 #, c-format
 msgid "%pB: line number overflow: 0x%lx > 0xffff"
 msgstr ""
 
-#: peXXigen.c:1222
+#: peXXigen.c:1224
 msgid "Export Directory [.edata (or where ever we found it)]"
 msgstr ""
 
-#: peXXigen.c:1223
+#: peXXigen.c:1225
 msgid "Import Directory [parts of .idata]"
 msgstr ""
 
-#: peXXigen.c:1224
+#: peXXigen.c:1226
 msgid "Resource Directory [.rsrc]"
 msgstr ""
 
-#: peXXigen.c:1225
+#: peXXigen.c:1227
 msgid "Exception Directory [.pdata]"
 msgstr ""
 
-#: peXXigen.c:1226
+#: peXXigen.c:1228
 msgid "Security Directory"
 msgstr ""
 
-#: peXXigen.c:1227
+#: peXXigen.c:1229
 msgid "Base Relocation Directory [.reloc]"
 msgstr ""
 
-#: peXXigen.c:1228
+#: peXXigen.c:1230
 msgid "Debug Directory"
 msgstr ""
 
-#: peXXigen.c:1229
+#: peXXigen.c:1231
 msgid "Description Directory"
 msgstr ""
 
-#: peXXigen.c:1230
+#: peXXigen.c:1232
 msgid "Special Directory"
 msgstr ""
 
-#: peXXigen.c:1231
+#: peXXigen.c:1233
 msgid "Thread Storage Directory [.tls]"
 msgstr ""
 
-#: peXXigen.c:1232
+#: peXXigen.c:1234
 msgid "Load Configuration Directory"
 msgstr ""
 
-#: peXXigen.c:1233
+#: peXXigen.c:1235
 msgid "Bound Import Directory"
 msgstr ""
 
-#: peXXigen.c:1234
+#: peXXigen.c:1236
 msgid "Import Address Table Directory"
 msgstr ""
 
-#: peXXigen.c:1235
+#: peXXigen.c:1237
 msgid "Delay Import Directory"
 msgstr ""
 
-#: peXXigen.c:1236
+#: peXXigen.c:1238
 msgid "CLR Runtime Header"
 msgstr ""
 
-#: peXXigen.c:1237
+#: peXXigen.c:1239
 msgid "Reserved"
 msgstr ""
 
-#: peXXigen.c:1302
+#: peXXigen.c:1304
 #, c-format
 msgid ""
 "\n"
 "There is an import table, but the section containing it could not be found\n"
 msgstr ""
 
-#: peXXigen.c:1308
+#: peXXigen.c:1310
 #, c-format
 msgid ""
 "\n"
 "There is an import table in %s, but that section has no contents\n"
 msgstr ""
 
-#: peXXigen.c:1315
+#: peXXigen.c:1317
 #, c-format
 msgid ""
 "\n"
 "There is an import table in %s at 0x%lx\n"
 msgstr ""
 
-#: peXXigen.c:1321
+#: peXXigen.c:1323
 #, c-format
 msgid ""
 "\n"
 "The Import Tables (interpreted %s section contents)\n"
 msgstr ""
 
-#: peXXigen.c:1324
+#: peXXigen.c:1326
 #, c-format
 msgid ""
 " vma:            Hint    Time      Forward  DLL       First\n"
 "                 Table   Stamp     Chain    Name      Thunk\n"
 msgstr ""
 
-#: peXXigen.c:1373
+#: peXXigen.c:1375
 #, c-format
 msgid ""
 "\n"
 "\tDLL Name: %.*s\n"
 msgstr ""
 
-#: peXXigen.c:1389
+#: peXXigen.c:1391
 #, c-format
 msgid "\tvma:  Hint/Ord Member-Name Bound-To\n"
 msgstr ""
 
-#: peXXigen.c:1414
+#: peXXigen.c:1416
 #, c-format
 msgid ""
 "\n"
 "There is a first thunk, but the section containing it could not be found\n"
 msgstr ""
 
-#: peXXigen.c:1461 peXXigen.c:1500
+#: peXXigen.c:1463
+#: peXXigen.c:1502
 #, c-format
 msgid "\t<corrupt: 0x%04lx>"
 msgstr ""
 
-#: peXXigen.c:1593
+#: peXXigen.c:1595
 #, c-format
 msgid ""
 "\n"
 "There is an export table, but the section containing it could not be found\n"
 msgstr ""
 
-#: peXXigen.c:1606
+#: peXXigen.c:1608
 #, c-format
 msgid ""
 "\n"
 "There is an export table in %s, but it is too small (%d)\n"
 msgstr ""
 
-#: peXXigen.c:1614
+#: peXXigen.c:1616
 #, c-format
 msgid ""
 "\n"
 "There is an export table in %s, but contents cannot be read\n"
 msgstr ""
 
-#: peXXigen.c:1620
+#: peXXigen.c:1622
 #, c-format
 msgid ""
 "\n"
 "There is an export table in %s at 0x%lx\n"
 msgstr ""
 
-#: peXXigen.c:1651
+#: peXXigen.c:1653
 #, c-format
 msgid ""
 "\n"
@@ -9460,145 +9615,147 @@ msgid ""
 "\n"
 msgstr ""
 
-#: peXXigen.c:1655
+#: peXXigen.c:1657
 #, c-format
 msgid "Export Flags \t\t\t%lx\n"
 msgstr ""
 
-#: peXXigen.c:1658
+#: peXXigen.c:1660
 #, c-format
 msgid "Time/Date stamp \t\t%lx\n"
 msgstr ""
 
-#: peXXigen.c:1662
+#: peXXigen.c:1664
 #, c-format
 msgid "Major/Minor \t\t\t%d/%d\n"
 msgstr ""
 
-#: peXXigen.c:1665
+#: peXXigen.c:1667
 #, c-format
 msgid "Name \t\t\t\t"
 msgstr ""
 
-#: peXXigen.c:1676
+#: peXXigen.c:1678
 #, c-format
 msgid "Ordinal Base \t\t\t%ld\n"
 msgstr ""
 
-#: peXXigen.c:1679
+#: peXXigen.c:1681
 #, c-format
 msgid "Number in:\n"
 msgstr ""
 
-#: peXXigen.c:1682
+#: peXXigen.c:1684
 #, c-format
 msgid "\tExport Address Table \t\t%08lx\n"
 msgstr ""
 
-#: peXXigen.c:1686
+#: peXXigen.c:1688
 #, c-format
 msgid "\t[Name Pointer/Ordinal] Table\t%08lx\n"
 msgstr ""
 
-#: peXXigen.c:1689
+#: peXXigen.c:1691
 #, c-format
 msgid "Table Addresses\n"
 msgstr ""
 
-#: peXXigen.c:1692
+#: peXXigen.c:1694
 #, c-format
 msgid "\tExport Address Table \t\t"
 msgstr ""
 
-#: peXXigen.c:1697
+#: peXXigen.c:1699
 #, c-format
 msgid "\tName Pointer Table \t\t"
 msgstr ""
 
-#: peXXigen.c:1702
+#: peXXigen.c:1704
 #, c-format
 msgid "\tOrdinal Table \t\t\t"
 msgstr ""
 
-#: peXXigen.c:1716
+#: peXXigen.c:1718
 #, c-format
 msgid ""
 "\n"
 "Export Address Table -- Ordinal Base %ld\n"
 msgstr ""
 
-#: peXXigen.c:1725
+#: peXXigen.c:1727
 #, c-format
 msgid "\tInvalid Export Address Table rva (0x%lx) or entry count (0x%lx)\n"
 msgstr ""
 
-#: peXXigen.c:1744
+#: peXXigen.c:1746
 msgid "Forwarder RVA"
 msgstr ""
 
-#: peXXigen.c:1756
+#: peXXigen.c:1758
 msgid "Export RVA"
 msgstr ""
 
-#: peXXigen.c:1763
+#: peXXigen.c:1765
 #, c-format
 msgid ""
 "\n"
 "[Ordinal/Name Pointer] Table\n"
 msgstr ""
 
-#: peXXigen.c:1771
+#: peXXigen.c:1773
 #, c-format
 msgid "\tInvalid Name Pointer Table rva (0x%lx) or entry count (0x%lx)\n"
 msgstr ""
 
-#: peXXigen.c:1778
+#: peXXigen.c:1780
 #, c-format
 msgid "\tInvalid Ordinal Table rva (0x%lx) or entry count (0x%lx)\n"
 msgstr ""
 
-#: peXXigen.c:1792
+#: peXXigen.c:1794
 #, c-format
 msgid "\t[%4ld] <corrupt offset: %lx>\n"
 msgstr ""
 
-#: peXXigen.c:1847 peXXigen.c:2017
+#: peXXigen.c:1849
+#: peXXigen.c:2019
 #, c-format
 msgid "warning, .pdata section size (%ld) is not a multiple of %d\n"
 msgstr ""
 
-#: peXXigen.c:1851 peXXigen.c:2021
+#: peXXigen.c:1853
+#: peXXigen.c:2023
 #, c-format
 msgid ""
 "\n"
 "The Function Table (interpreted .pdata section contents)\n"
 msgstr ""
 
-#: peXXigen.c:1854
+#: peXXigen.c:1856
 #, c-format
 msgid " vma:\t\t\tBegin Address    End Address      Unwind Info\n"
 msgstr ""
 
-#: peXXigen.c:1856
+#: peXXigen.c:1858
 #, c-format
 msgid ""
 " vma:\t\tBegin    End      EH       EH       PrologEnd  Exception\n"
 "     \t\tAddress  Address  Handler  Data     Address    Mask\n"
 msgstr ""
 
-#: peXXigen.c:1869
+#: peXXigen.c:1871
 #, c-format
 msgid "Virtual size of .pdata section (%ld) larger than real size (%ld)\n"
 msgstr ""
 
-#: peXXigen.c:2023
+#: peXXigen.c:2025
 #, c-format
 msgid ""
 " vma:\t\tBegin    Prolog   Function Flags    Exception EH\n"
 "     \t\tAddress  Length   Length   32b exc  Handler   Data\n"
 msgstr ""
 
-#: peXXigen.c:2148
+#: peXXigen.c:2150
 #, c-format
 msgid ""
 "\n"
@@ -9606,86 +9763,86 @@ msgid ""
 "PE File Base Relocations (interpreted .reloc section contents)\n"
 msgstr ""
 
-#: peXXigen.c:2177
+#: peXXigen.c:2179
 #, c-format
 msgid ""
 "\n"
 "Virtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"
 msgstr ""
 
-#: peXXigen.c:2195
+#: peXXigen.c:2197
 #, c-format
 msgid "\treloc %4d offset %4x [%4lx] %s"
 msgstr ""
 
-#: peXXigen.c:2256
+#: peXXigen.c:2258
 #, c-format
 msgid "%03x %*.s Entry: "
 msgstr ""
 
-#: peXXigen.c:2280
+#: peXXigen.c:2282
 #, c-format
 msgid "name: [val: %08lx len %d]: "
 msgstr ""
 
-#: peXXigen.c:2300
+#: peXXigen.c:2302
 #, c-format
 msgid "<corrupt string length: %#x>\n"
 msgstr ""
 
-#: peXXigen.c:2310
+#: peXXigen.c:2312
 #, c-format
 msgid "<corrupt string offset: %#lx>\n"
 msgstr ""
 
-#: peXXigen.c:2315
+#: peXXigen.c:2317
 #, c-format
 msgid "ID: %#08lx"
 msgstr ""
 
-#: peXXigen.c:2318
+#: peXXigen.c:2320
 #, c-format
 msgid ", Value: %#08lx\n"
 msgstr ""
 
-#: peXXigen.c:2340
+#: peXXigen.c:2342
 #, c-format
 msgid "%03x %*.s  Leaf: Addr: %#08lx, Size: %#08lx, Codepage: %d\n"
 msgstr ""
 
-#: peXXigen.c:2382
+#: peXXigen.c:2384
 #, c-format
 msgid "<unknown directory type: %d>\n"
 msgstr ""
 
-#: peXXigen.c:2390
+#: peXXigen.c:2392
 #, c-format
 msgid " Table: Char: %d, Time: %08lx, Ver: %d/%d, Num Names: %d, IDs: %d\n"
 msgstr ""
 
-#: peXXigen.c:2478
+#: peXXigen.c:2480
 #, c-format
 msgid "Corrupt .rsrc section detected!\n"
 msgstr ""
 
-#: peXXigen.c:2502
+#: peXXigen.c:2504
 #, c-format
 msgid ""
 "\n"
 "WARNING: Extra data in .rsrc section - it will be ignored by Windows:\n"
 msgstr ""
 
-#: peXXigen.c:2508
+#: peXXigen.c:2510
 #, c-format
 msgid " String table starts at offset: %#03x\n"
 msgstr ""
 
-#: peXXigen.c:2511
+#: peXXigen.c:2513
 #, c-format
 msgid " Resources start at offset: %#03x\n"
 msgstr ""
 
-#: peXXigen.c:2568
+#: peXXigen.c:2570
 #, c-format
 msgid ""
 "\n"
@@ -9693,14 +9850,14 @@ msgid ""
 "found\n"
 msgstr ""
 
-#: peXXigen.c:2574
+#: peXXigen.c:2576
 #, c-format
 msgid ""
 "\n"
 "There is a debug directory in %s, but that section has no contents\n"
 msgstr ""
 
-#: peXXigen.c:2581
+#: peXXigen.c:2583
 #, c-format
 msgid ""
 "\n"
@@ -9708,7 +9865,7 @@ msgid ""
 "small\n"
 msgstr ""
 
-#: peXXigen.c:2586
+#: peXXigen.c:2588
 #, c-format
 msgid ""
 "\n"
@@ -9716,23 +9873,23 @@ msgid ""
 "\n"
 msgstr ""
 
-#: peXXigen.c:2593
+#: peXXigen.c:2595
 #, c-format
 msgid ""
 "The debug data size field in the data directory is too big for the section"
 msgstr ""
 
-#: peXXigen.c:2598
+#: peXXigen.c:2600
 #, c-format
 msgid "Type                Size     Rva      Offset\n"
 msgstr ""
 
-#: peXXigen.c:2646
+#: peXXigen.c:2648
 #, c-format
 msgid "(format %c%c%c%c signature %s age %ld pdb %s)\n"
 msgstr ""
 
-#: peXXigen.c:2658
+#: peXXigen.c:2660
 #, c-format
 msgid ""
 "The debug directory size is not a multiple of the debug directory entry "
@@ -9742,100 +9899,100 @@ msgstr ""
 #. The MS dumpbin program reportedly ands with 0xff0f before
 #. printing the characteristics field.  Not sure why.  No reason to
 #. emulate it here.
-#: peXXigen.c:2742
+#: peXXigen.c:2744
 #, c-format
 msgid ""
 "\n"
 "Characteristics 0x%x\n"
 msgstr ""
 
-#: peXXigen.c:3027
+#: peXXigen.c:3029
 #, c-format
 msgid ""
 "%pB: Data Directory (%lx bytes at %<PRIx64>) extends across section boundary "
 "at %<PRIx64>"
 msgstr ""
 
-#: peXXigen.c:3068
+#: peXXigen.c:3070
 msgid "failed to update file offsets in debug directory"
 msgstr ""
 
-#: peXXigen.c:3077
+#: peXXigen.c:3079
 #, c-format
 msgid "%pB: failed to read debug data section"
 msgstr ""
 
-#: peXXigen.c:3880
+#: peXXigen.c:3882
 #, c-format
 msgid ".rsrc merge failure: duplicate string resource: %d"
 msgstr ""
 
-#: peXXigen.c:4015
+#: peXXigen.c:4017
 msgid ".rsrc merge failure: multiple non-default manifests"
 msgstr ""
 
-#: peXXigen.c:4033
+#: peXXigen.c:4035
 msgid ".rsrc merge failure: a directory matches a leaf"
 msgstr ""
 
-#: peXXigen.c:4075
+#: peXXigen.c:4077
 msgid ".rsrc merge failure: duplicate leaf"
 msgstr ""
 
-#: peXXigen.c:4080
+#: peXXigen.c:4082
 #, c-format
 msgid ".rsrc merge failure: duplicate leaf: %s"
 msgstr ""
 
-#: peXXigen.c:4147
+#: peXXigen.c:4149
 msgid ".rsrc merge failure: dirs with differing characteristics"
 msgstr ""
 
-#: peXXigen.c:4154
+#: peXXigen.c:4156
 msgid ".rsrc merge failure: differing directory versions"
 msgstr ""
 
 #. Corrupted .rsrc section - cannot merge.
-#: peXXigen.c:4266
+#: peXXigen.c:4268
 #, c-format
 msgid "%pB: .rsrc merge failure: corrupt .rsrc section"
 msgstr ""
 
-#: peXXigen.c:4274
+#: peXXigen.c:4276
 #, c-format
 msgid "%pB: .rsrc merge failure: unexpected .rsrc size"
 msgstr ""
 
-#: peXXigen.c:4413
+#: peXXigen.c:4415
 #, c-format
 msgid "%pB: unable to fill in DataDictionary[1] because .idata$2 is missing"
 msgstr ""
 
-#: peXXigen.c:4433
+#: peXXigen.c:4435
 #, c-format
 msgid "%pB: unable to fill in DataDictionary[1] because .idata$4 is missing"
 msgstr ""
 
-#: peXXigen.c:4454
+#: peXXigen.c:4456
 #, c-format
 msgid "%pB: unable to fill in DataDictionary[12] because .idata$5 is missing"
 msgstr ""
 
-#: peXXigen.c:4474
+#: peXXigen.c:4476
 #, c-format
 msgid ""
 "%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because ."
 "idata$6 is missing"
 msgstr ""
 
-#: peXXigen.c:4516
+#: peXXigen.c:4518
 #, c-format
 msgid ""
 "%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)] because ."
 "idata$6 is missing"
 msgstr ""
 
-#: peXXigen.c:4541
+#: peXXigen.c:4543
 #, c-format
 msgid "%pB: unable to fill in DataDictionary[9] because __tls_used is missing"
 msgstr ""
-- 
2.41.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 2/3] Make various error-related globals thread-local
  2023-10-26 19:07 [PATCH 0/3] Threads and BFD Tom Tromey
  2023-10-26 19:07 ` [PATCH 1/3] Make _bfd_error_buf static Tom Tromey
@ 2023-10-26 19:07 ` Tom Tromey
  2023-11-01 12:28   ` Nick Clifton
  2023-10-26 19:07 ` [PATCH 3/3] Add minimal thread-safety to BFD Tom Tromey
  2023-11-01 12:26 ` [PATCH 0/3] Threads and BFD Nick Clifton
  3 siblings, 1 reply; 12+ messages in thread
From: Tom Tromey @ 2023-10-26 19:07 UTC (permalink / raw)
  To: binutils; +Cc: Tom Tromey

This changes bfd_error et al to be thread-local.

	* Makefile.in: Regenerate.
	* aclocal.m4: Include ax_tls.m4.
	* ax_tls.m4: New file.
	* bfd.c: (bfd_error, input_error, input_bfd, _bfd_error_buf):
	Now thread-local.
	(bfd_asprintf): Update docs.
	* config.in, configure: Regenerate.
	* configure.ac: Call AX_TLS.
	* po/bfd.pot: Regenerate.
---
 bfd/Makefile.in  |  6 ++--
 bfd/aclocal.m4   |  1 +
 bfd/ax_tls.m4    | 71 ++++++++++++++++++++++++++++++++++++++++++++++++
 bfd/bfd.c        | 12 ++++----
 bfd/config.in    |  3 ++
 bfd/configure    | 51 ++++++++++++++++++++++++++++++++++
 bfd/configure.ac |  2 ++
 bfd/po/bfd.pot   | 56 +++++++++++++++++++-------------------
 8 files changed, 166 insertions(+), 36 deletions(-)
 create mode 100644 bfd/ax_tls.m4

diff --git a/bfd/Makefile.in b/bfd/Makefile.in
index 8d09f6fa4af..cf227d09c27 100644
--- a/bfd/Makefile.in
+++ b/bfd/Makefile.in
@@ -129,9 +129,9 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
 	$(top_srcdir)/../config/zstd.m4 $(top_srcdir)/../libtool.m4 \
 	$(top_srcdir)/../ltoptions.m4 $(top_srcdir)/../ltsugar.m4 \
 	$(top_srcdir)/../ltversion.m4 $(top_srcdir)/../lt~obsolete.m4 \
-	$(top_srcdir)/bfd.m4 $(top_srcdir)/warning.m4 \
-	$(top_srcdir)/acinclude.m4 $(top_srcdir)/version.m4 \
-	$(top_srcdir)/configure.ac
+	$(top_srcdir)/ax_tls.m4 $(top_srcdir)/bfd.m4 \
+	$(top_srcdir)/warning.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/version.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
diff --git a/bfd/aclocal.m4 b/bfd/aclocal.m4
index 09b849dfc87..e0142ae724e 100644
--- a/bfd/aclocal.m4
+++ b/bfd/aclocal.m4
@@ -1187,6 +1187,7 @@ m4_include([../ltoptions.m4])
 m4_include([../ltsugar.m4])
 m4_include([../ltversion.m4])
 m4_include([../lt~obsolete.m4])
+m4_include([ax_tls.m4])
 m4_include([bfd.m4])
 m4_include([warning.m4])
 m4_include([acinclude.m4])
diff --git a/bfd/ax_tls.m4 b/bfd/ax_tls.m4
new file mode 100644
index 00000000000..fb184fe201b
--- /dev/null
+++ b/bfd/ax_tls.m4
@@ -0,0 +1,71 @@
+# ===========================================================================
+#          https://www.gnu.org/software/autoconf-archive/ax_tls.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_TLS([action-if-found], [action-if-not-found])
+#
+# DESCRIPTION
+#
+#   Provides a test for the compiler support of thread local storage (TLS)
+#   extensions. Defines TLS if it is found. Currently knows about C++11,
+#   GCC/ICC, and MSVC. I think SunPro uses the same as GCC, and Borland
+#   apparently supports either.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Alan Woodland <ajw05@aber.ac.uk>
+#   Copyright (c) 2010 Diego Elio Petteno` <flameeyes@gmail.com>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 15
+
+AC_DEFUN([AX_TLS], [
+  AC_MSG_CHECKING([for thread local storage (TLS) class])
+  AC_CACHE_VAL([ac_cv_tls],
+   [for ax_tls_keyword in thread_local _Thread_local __thread '__declspec(thread)' none; do
+       AS_CASE([$ax_tls_keyword],
+          [none], [ac_cv_tls=none ; break],
+          [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+              [#include <stdlib.h>],
+              [static  $ax_tls_keyword  int bar;]
+            )],
+            [ac_cv_tls=$ax_tls_keyword ; break],
+            [ac_cv_tls=none]
+          )]
+        )
+    done ]
+  )
+  AC_MSG_RESULT([$ac_cv_tls])
+
+  AS_IF([test "$ac_cv_tls" != "none"],
+    [AC_DEFINE_UNQUOTED([TLS],[$ac_cv_tls],[If the compiler supports a TLS storage class, define it to that here])
+     m4_ifnblank([$1],[$1],[[:]])],
+    [m4_ifnblank([$2],[$2],[[:]])])
+])
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 08980ae52b7..2cf8361caa2 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -691,6 +691,8 @@ SECTION
 	The easiest way to report a BFD error to the user is to
 	use <<bfd_perror>>.
 
+	The BFD error is thread-local.
+
 SUBSECTION
 	Type <<bfd_error_type>>
 
@@ -728,10 +730,10 @@ CODE_FRAGMENT
 .
 */
 
-static bfd_error_type bfd_error;
-static bfd_error_type input_error;
-static bfd *input_bfd;
-static char *_bfd_error_buf;
+static TLS bfd_error_type bfd_error;
+static TLS bfd_error_type input_error;
+static TLS bfd *input_bfd;
+static TLS char *_bfd_error_buf;
 
 const char *const bfd_errmsgs[] =
 {
@@ -920,7 +922,7 @@ DESCRIPTION
 	Primarily for error reporting, this function is like
 	libiberty's xasprintf except that it can return NULL on no
 	memory and the returned string should not be freed.  Uses a
-	single malloc'd buffer managed by libbfd, _bfd_error_buf.
+	thread-local malloc'd buffer managed by libbfd, _bfd_error_buf.
 	Be aware that a call to this function frees the result of any
 	previous call.  bfd_errmsg (bfd_error_on_input) also calls
 	this function.
diff --git a/bfd/config.in b/bfd/config.in
index 7ff3eeebf8b..0ba104f4431 100644
--- a/bfd/config.in
+++ b/bfd/config.in
@@ -285,6 +285,9 @@
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
+/* If the compiler supports a TLS storage class, define it to that here */
+#undef TLS
+
 /* Name of host specific header file to include in trad-core.c. */
 #undef TRAD_HEADER
 
diff --git a/bfd/configure b/bfd/configure
index f0a07ff675f..de94019bd9c 100755
--- a/bfd/configure
+++ b/bfd/configure
@@ -13283,6 +13283,57 @@ $as_echo "#define USE_BINARY_FOPEN 1" >>confdefs.h
  ;;
 esac
 
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread local storage (TLS) class" >&5
+$as_echo_n "checking for thread local storage (TLS) class... " >&6; }
+  if ${ac_cv_tls+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  for ax_tls_keyword in thread_local _Thread_local __thread '__declspec(thread)' none; do
+       case $ax_tls_keyword in #(
+  none) :
+    ac_cv_tls=none ; break ;; #(
+  *) :
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+int
+main ()
+{
+static  $ax_tls_keyword  int bar;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_tls=$ax_tls_keyword ; break
+else
+  ac_cv_tls=none
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
+esac
+    done
+
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5
+$as_echo "$ac_cv_tls" >&6; }
+
+  if test "$ac_cv_tls" != "none"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define TLS $ac_cv_tls
+_ACEOF
+
+     :
+else
+  :
+fi
+
+
 # Link in zlib/zstd if we can.  This allows us to read compressed debug sections.
 # This is used only by compress.c.
 
diff --git a/bfd/configure.ac b/bfd/configure.ac
index d1e7e3a4bf3..42678065e57 100644
--- a/bfd/configure.ac
+++ b/bfd/configure.ac
@@ -233,6 +233,8 @@ AC_CHECK_DECLS([___lc_codepage_func], [], [], [[#include <locale.h>]])
 
 BFD_BINARY_FOPEN
 
+AX_TLS
+
 # Link in zlib/zstd if we can.  This allows us to read compressed debug sections.
 # This is used only by compress.c.
 AM_ZLIB
diff --git a/bfd/po/bfd.pot b/bfd/po/bfd.pot
index fa47ba70e91..33d51490482 100644
--- a/bfd/po/bfd.pot
+++ b/bfd/po/bfd.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2023-10-26 11:38-0600\n"
+"POT-Creation-Date: 2023-10-26 11:42-0600\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -138,115 +138,115 @@ msgstr ""
 msgid "Writing updated armap timestamp"
 msgstr ""
 
-#: bfd.c:738
+#: bfd.c:740
 msgid "no error"
 msgstr ""
 
-#: bfd.c:739
+#: bfd.c:741
 msgid "system call error"
 msgstr ""
 
-#: bfd.c:740
+#: bfd.c:742
 msgid "invalid bfd target"
 msgstr ""
 
-#: bfd.c:741
+#: bfd.c:743
 msgid "file in wrong format"
 msgstr ""
 
-#: bfd.c:742
+#: bfd.c:744
 msgid "archive object file in wrong format"
 msgstr ""
 
-#: bfd.c:743
+#: bfd.c:745
 msgid "invalid operation"
 msgstr ""
 
-#: bfd.c:744
+#: bfd.c:746
 msgid "memory exhausted"
 msgstr ""
 
-#: bfd.c:745
+#: bfd.c:747
 msgid "no symbols"
 msgstr ""
 
-#: bfd.c:746
+#: bfd.c:748
 msgid "archive has no index; run ranlib to add one"
 msgstr ""
 
-#: bfd.c:747
+#: bfd.c:749
 msgid "no more archived files"
 msgstr ""
 
-#: bfd.c:748
+#: bfd.c:750
 msgid "malformed archive"
 msgstr ""
 
-#: bfd.c:749
+#: bfd.c:751
 msgid "DSO missing from command line"
 msgstr ""
 
-#: bfd.c:750
+#: bfd.c:752
 msgid "file format not recognized"
 msgstr ""
 
-#: bfd.c:751
+#: bfd.c:753
 msgid "file format is ambiguous"
 msgstr ""
 
-#: bfd.c:752
+#: bfd.c:754
 msgid "section has no contents"
 msgstr ""
 
-#: bfd.c:753
+#: bfd.c:755
 msgid "nonrepresentable section on output"
 msgstr ""
 
-#: bfd.c:754
+#: bfd.c:756
 msgid "symbol needs debug section which does not exist"
 msgstr ""
 
-#: bfd.c:755
+#: bfd.c:757
 msgid "bad value"
 msgstr ""
 
-#: bfd.c:756
+#: bfd.c:758
 msgid "file truncated"
 msgstr ""
 
-#: bfd.c:757
+#: bfd.c:759
 msgid "file too big"
 msgstr ""
 
-#: bfd.c:758
+#: bfd.c:760
 msgid "sorry, cannot handle this file"
 msgstr ""
 
-#: bfd.c:759
+#: bfd.c:761
 #, c-format
 msgid "error reading %s: %s"
 msgstr ""
 
-#: bfd.c:760
+#: bfd.c:762
 msgid "#<invalid error code>"
 msgstr ""
 
-#: bfd.c:1890
+#: bfd.c:1892
 #, c-format
 msgid "BFD %s assertion fail %s:%d"
 msgstr ""
 
-#: bfd.c:1903
+#: bfd.c:1905
 #, c-format
 msgid "BFD %s internal error, aborting at %s:%d in %s\n"
 msgstr ""
 
-#: bfd.c:1908
+#: bfd.c:1910
 #, c-format
 msgid "BFD %s internal error, aborting at %s:%d\n"
 msgstr ""
 
-#: bfd.c:1910
+#: bfd.c:1912
 msgid "Please report this bug.\n"
 msgstr ""
 
-- 
2.41.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 3/3] Add minimal thread-safety to BFD
  2023-10-26 19:07 [PATCH 0/3] Threads and BFD Tom Tromey
  2023-10-26 19:07 ` [PATCH 1/3] Make _bfd_error_buf static Tom Tromey
  2023-10-26 19:07 ` [PATCH 2/3] Make various error-related globals thread-local Tom Tromey
@ 2023-10-26 19:07 ` Tom Tromey
  2023-11-01 12:45   ` Nick Clifton
  2023-11-01 12:26 ` [PATCH 0/3] Threads and BFD Nick Clifton
  3 siblings, 1 reply; 12+ messages in thread
From: Tom Tromey @ 2023-10-26 19:07 UTC (permalink / raw)
  To: binutils; +Cc: Tom Tromey

This patch provides some minimal thread-safety to BFD.

The BFD client can request thread-safety by providing a lock and
unlock function.  The globals used during BFD creation (e.g.,
bfd_id_counter) are then locked, and the file descriptor cache is also
locked.  A function to clean up any thread-local data is now provided
for BFD clients.

	* bfd-in2.h: Regenerate.
	* bfd.c (lock_fn, unlock_fn): New globals.
	(bfd_thread_init, bfd_thread_cleanup, bfd_lock, bfd_unlock): New
	functions.
	* cache.c (bfd_cache_lookup_worker): Use _bfd_open_file_unlocked.
	(cache_btell, cache_bseek, cache_bread, cache_bwrite): Lock
	and unlock.
	(cache_bclose): Add comment.
	(cache_bflush, cache_bstat, cache_bmmap): Lock and unlock.
	(_bfd_cache_init_unlocked): New function.
	(bfd_cache_init): Use it.  Lock and unlock.
	(_bfd_cache_close_unlocked): New function.
	(bfd_cache_close, bfd_cache_close_all): Use it.  Lock and unlock.
	(_bfd_open_file_unlocked): New function.
	(bfd_open_file): Use it.  Lock and unlock.
	* doc/bfd.texi (BFD front end): Add Threading menu item.
	* libbfd.h: Regenerate.
	* opncls.c (_bfd_new_bfd): Lock and unlock.
	* po/bfd.pot: Regenerate.
---
 bfd/bfd-in2.h    |   6 ++
 bfd/bfd.c        | 109 +++++++++++++++++++++++++++++-
 bfd/cache.c      | 170 +++++++++++++++++++++++++++++++++--------------
 bfd/doc/bfd.texi |   1 +
 bfd/libbfd.h     |   4 ++
 bfd/opncls.c     |   2 +
 bfd/po/bfd.pot   |  10 +--
 7 files changed, 246 insertions(+), 56 deletions(-)

diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index e26bc40a9e1..13c4207667a 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -2572,6 +2572,12 @@ unsigned int bfd_init (void);
 /* Value returned by bfd_init.  */
 #define BFD_INIT_MAGIC (sizeof (struct bfd_section))
 
+typedef void (*bfd_lock_unlock_fn_type) (void);
+void bfd_thread_init
+   (bfd_lock_unlock_fn_type lock, bfd_lock_unlock_fn_type unlock);
+
+void bfd_thread_cleanup (void);
+
 long bfd_get_reloc_upper_bound (bfd *abfd, asection *sect);
 
 long bfd_canonicalize_reloc
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 2cf8361caa2..18aa21884fd 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -1716,7 +1716,7 @@ bfd_set_assert_handler (bfd_assert_handler_type pnew)
 
 /*
 INODE
-Initialization, Miscellaneous, Error reporting, BFD front end
+Initialization, Threading, Error reporting, BFD front end
 
 FUNCTION
 	bfd_init
@@ -1749,9 +1749,114 @@ bfd_init (void)
   return BFD_INIT_MAGIC;
 }
 \f
+
+/*
+INODE
+Threading, Miscellaneous, Initialization, BFD front end
+
+SECTION
+	Threading
+
+	BFD has limited support for thread-safety.  Most BFD globals
+	are protected by locks, while the error-related globals are
+	thread-local.  A given BFD cannot safely be used from two
+	threads at the same time; it is up to the application to do
+	any needed locking.  However, it is ok for different threads
+	to work on different BFD objects at the same time.
+
+SUBSECTION
+	Thread functions.
+
+CODE_FRAGMENT
+.typedef void (*bfd_lock_unlock_fn_type) (void);
+*/
+
+/* The lock and unlock functions, if set.  */
+static bfd_lock_unlock_fn_type lock_fn;
+static bfd_lock_unlock_fn_type unlock_fn;
+
+/*
+FUNCTION
+	bfd_thread_init
+
+SYNOPSIS
+	void bfd_thread_init
+	  (bfd_lock_unlock_fn_type lock, bfd_lock_unlock_fn_type unlock);
+
+DESCRIPTION
+
+	Initialize BFD threading.  The functions passed in will be
+	used to lock and unlock global data structures.
+*/
+
+void
+bfd_thread_init (bfd_lock_unlock_fn_type lock, bfd_lock_unlock_fn_type unlock)
+{
+  lock_fn = lock;
+  unlock_fn = unlock;
+}
+
+/*
+FUNCTION
+	bfd_thread_cleanup
+
+SYNOPSIS
+	void bfd_thread_cleanup (void);
+
+DESCRIPTION
+
+	Clean up any thread-local state.  This should be called by a
+	thread that uses any BFD functions, before the thread exits.
+	It is fine to call this multiple times, or to call it and then
+	later call BFD functions on the same thread again.
+*/
+
+void
+bfd_thread_cleanup (void)
+{
+  _bfd_clear_error_data ();
+}
+
+/*
+INTERNAL_FUNCTION
+	bfd_lock
+
+SYNOPSIS
+	void bfd_lock (void);
+
+DESCRIPTION
+	Acquire the global BFD lock, if needed.
+*/
+
+void
+bfd_lock (void)
+{
+  if (lock_fn != NULL)
+    lock_fn ();
+}
+
+/*
+INTERNAL_FUNCTION
+	bfd_unlock
+
+SYNOPSIS
+	void bfd_unlock (void);
+
+DESCRIPTION
+	Release the global BFD lock, if needed.
+*/
+
+void
+bfd_unlock (void)
+{
+  if (unlock_fn != NULL)
+    unlock_fn ();
+}
+
+
 /*
 INODE
-Miscellaneous, Memory Usage, Initialization, BFD front end
+Miscellaneous, Memory Usage, Threading, BFD front end
 
 SECTION
 	Miscellaneous
diff --git a/bfd/cache.c b/bfd/cache.c
index 3d26bee0773..ae7ebcdadd6 100644
--- a/bfd/cache.c
+++ b/bfd/cache.c
@@ -49,6 +49,8 @@ SUBSECTION
 #include <sys/mman.h>
 #endif
 
+static FILE *_bfd_open_file_unlocked (bfd *abfd);
+
 /* In some cases we can optimize cache operation when reopening files.
    For instance, a flush is entirely unnecessary if the file is already
    closed, so a flush would use CACHE_NO_OPEN.  Similarly, a seek using
@@ -259,7 +261,7 @@ bfd_cache_lookup_worker (bfd *abfd, enum cache_flag flag)
   if (flag & CACHE_NO_OPEN)
     return NULL;
 
-  if (bfd_open_file (abfd) == NULL)
+  if (_bfd_open_file_unlocked (abfd) == NULL)
     ;
   else if (!(flag & CACHE_NO_SEEK)
 	   && _bfd_real_fseek ((FILE *) abfd->iostream,
@@ -278,19 +280,31 @@ bfd_cache_lookup_worker (bfd *abfd, enum cache_flag flag)
 static file_ptr
 cache_btell (struct bfd *abfd)
 {
+  bfd_lock ();
   FILE *f = bfd_cache_lookup (abfd, CACHE_NO_OPEN);
   if (f == NULL)
-    return abfd->where;
-  return _bfd_real_ftell (f);
+    {
+      bfd_unlock ();
+      return abfd->where;
+    }
+  file_ptr result = _bfd_real_ftell (f);
+  bfd_unlock ();
+  return result;
 }
 
 static int
 cache_bseek (struct bfd *abfd, file_ptr offset, int whence)
 {
+  bfd_lock ();
   FILE *f = bfd_cache_lookup (abfd, whence != SEEK_CUR ? CACHE_NO_SEEK : CACHE_NORMAL);
   if (f == NULL)
-    return -1;
-  return _bfd_real_fseek (f, offset, whence);
+    {
+      bfd_unlock ();
+      return -1;
+    }
+  int result = _bfd_real_fseek (f, offset, whence);
+  bfd_unlock ();
+  return result;
 }
 
 /* Note that archive entries don't have streams; they share their parent's.
@@ -338,12 +352,16 @@ cache_bread_1 (FILE *f, void *buf, file_ptr nbytes)
 static file_ptr
 cache_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
 {
+  bfd_lock ();
   file_ptr nread = 0;
   FILE *f;
 
   f = bfd_cache_lookup (abfd, CACHE_NORMAL);
   if (f == NULL)
-    return -1;
+    {
+      bfd_unlock ();
+      return -1;
+    }
 
   /* Some filesystems are unable to handle reads that are too large
      (for instance, NetApp shares with oplocks turned off).  To avoid
@@ -374,57 +392,75 @@ cache_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
 	break;
     }
 
+  bfd_unlock ();
   return nread;
 }
 
 static file_ptr
 cache_bwrite (struct bfd *abfd, const void *from, file_ptr nbytes)
 {
+  bfd_lock ();
   file_ptr nwrite;
   FILE *f = bfd_cache_lookup (abfd, CACHE_NORMAL);
 
   if (f == NULL)
-    return 0;
+    {
+      bfd_unlock ();
+      return 0;
+    }
   nwrite = fwrite (from, 1, nbytes, f);
   if (nwrite < nbytes && ferror (f))
     {
       bfd_set_error (bfd_error_system_call);
+      bfd_unlock ();
       return -1;
     }
+  bfd_unlock ();
   return nwrite;
 }
 
 static int
 cache_bclose (struct bfd *abfd)
 {
+  /* No locking needed here, it's handled by the callee.  */
   return bfd_cache_close (abfd) - 1;
 }
 
 static int
 cache_bflush (struct bfd *abfd)
 {
+  bfd_lock ();
   int sts;
   FILE *f = bfd_cache_lookup (abfd, CACHE_NO_OPEN);
 
   if (f == NULL)
-    return 0;
+    {
+      bfd_unlock ();
+      return 0;
+    }
   sts = fflush (f);
   if (sts < 0)
     bfd_set_error (bfd_error_system_call);
+  bfd_unlock ();
   return sts;
 }
 
 static int
 cache_bstat (struct bfd *abfd, struct stat *sb)
 {
+  bfd_lock ();
   int sts;
   FILE *f = bfd_cache_lookup (abfd, CACHE_NO_SEEK_ERROR);
 
   if (f == NULL)
-    return -1;
+    {
+      bfd_unlock ();
+      return -1;
+    }
   sts = fstat (fileno (f), sb);
   if (sts < 0)
     bfd_set_error (bfd_error_system_call);
+  bfd_unlock ();
   return sts;
 }
 
@@ -440,6 +476,7 @@ cache_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
 {
   void *ret = (void *) -1;
 
+  bfd_lock ();
   if ((abfd->flags & BFD_IN_MEMORY) != 0)
     abort ();
 #ifdef HAVE_MMAP
@@ -452,7 +489,10 @@ cache_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
 
       f = bfd_cache_lookup (abfd, CACHE_NO_SEEK_ERROR);
       if (f == NULL)
-	return ret;
+	{
+	  bfd_unlock ();
+	  return ret;
+	}
 
       if (pagesize_m1 == 0)
 	pagesize_m1 = getpagesize () - 1;
@@ -473,6 +513,7 @@ cache_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
     }
 #endif
 
+  bfd_unlock ();
   return ret;
 }
 
@@ -482,6 +523,22 @@ static const struct bfd_iovec cache_iovec =
   &cache_bclose, &cache_bflush, &cache_bstat, &cache_bmmap
 };
 
+static bool
+_bfd_cache_init_unlocked (bfd *abfd)
+{
+  BFD_ASSERT (abfd->iostream != NULL);
+  if (open_files >= bfd_cache_max_open ())
+    {
+      if (! close_one ())
+	return false;
+    }
+  abfd->iovec = &cache_iovec;
+  insert (abfd);
+  abfd->flags &= ~BFD_CLOSED_BY_CACHE;
+  ++open_files;
+  return true;
+}
+
 /*
 INTERNAL_FUNCTION
 	bfd_cache_init
@@ -496,17 +553,26 @@ DESCRIPTION
 bool
 bfd_cache_init (bfd *abfd)
 {
-  BFD_ASSERT (abfd->iostream != NULL);
-  if (open_files >= bfd_cache_max_open ())
-    {
-      if (! close_one ())
-	return false;
-    }
-  abfd->iovec = &cache_iovec;
-  insert (abfd);
-  abfd->flags &= ~BFD_CLOSED_BY_CACHE;
-  ++open_files;
-  return true;
+  bfd_lock ();
+  bool result = _bfd_cache_init_unlocked (abfd);
+  bfd_unlock ();
+  return result;
+}
+
+static bool
+_bfd_cache_close_unlocked (bfd *abfd)
+{
+  /* Don't remove this test.  bfd_reinit depends on it.  */
+  if (abfd->iovec != &cache_iovec)
+    return true;
+
+  if (abfd->iostream == NULL)
+    /* Previously closed.  */
+    return true;
+
+  /* Note: no locking needed in this function, as it is handled by
+     bfd_cache_delete.  */
+  return bfd_cache_delete (abfd);
 }
 
 /*
@@ -527,15 +593,10 @@ DESCRIPTION
 bool
 bfd_cache_close (bfd *abfd)
 {
-  /* Don't remove this test.  bfd_reinit depends on it.  */
-  if (abfd->iovec != &cache_iovec)
-    return true;
-
-  if (abfd->iostream == NULL)
-    /* Previously closed.  */
-    return true;
-
-  return bfd_cache_delete (abfd);
+  bfd_lock ();
+  bool result = _bfd_cache_close_unlocked (abfd);
+  bfd_unlock ();
+  return result;
 }
 
 /*
@@ -560,11 +621,12 @@ bfd_cache_close_all (void)
 {
   bool ret = true;
 
+  bfd_lock ();
   while (bfd_last_cache != NULL)
     {
       bfd *prev_bfd_last_cache = bfd_last_cache;
 
-      ret &= bfd_cache_close (bfd_last_cache);
+      ret &= _bfd_cache_close_unlocked (bfd_last_cache);
 
       /* Stop a potential infinite loop should bfd_cache_close()
 	 not update bfd_last_cache.  */
@@ -572,6 +634,7 @@ bfd_cache_close_all (void)
 	break;
     }
 
+  bfd_unlock ();
   return ret;
 }
 
@@ -592,23 +655,8 @@ bfd_cache_size (void)
   return open_files;
 }
 
-/*
-INTERNAL_FUNCTION
-	bfd_open_file
-
-SYNOPSIS
-	FILE* bfd_open_file (bfd *abfd);
-
-DESCRIPTION
-	Call the OS to open a file for @var{abfd}.  Return the <<FILE *>>
-	(possibly <<NULL>>) that results from this operation.  Set up the
-	BFD so that future accesses know the file is open. If the <<FILE *>>
-	returned is <<NULL>>, then it won't have been put in the
-	cache, so it won't have to be removed from it.
-*/
-
-FILE *
-bfd_open_file (bfd *abfd)
+static FILE *
+_bfd_open_file_unlocked (bfd *abfd)
 {
   abfd->cacheable = true;	/* Allow it to be closed later.  */
 
@@ -673,9 +721,33 @@ bfd_open_file (bfd *abfd)
     bfd_set_error (bfd_error_system_call);
   else
     {
-      if (! bfd_cache_init (abfd))
+      if (! _bfd_cache_init_unlocked (abfd))
 	return NULL;
     }
 
   return (FILE *) abfd->iostream;
 }
+
+/*
+INTERNAL_FUNCTION
+	bfd_open_file
+
+SYNOPSIS
+	FILE* bfd_open_file (bfd *abfd);
+
+DESCRIPTION
+	Call the OS to open a file for @var{abfd}.  Return the <<FILE *>>
+	(possibly <<NULL>>) that results from this operation.  Set up the
+	BFD so that future accesses know the file is open. If the <<FILE *>>
+	returned is <<NULL>>, then it won't have been put in the
+	cache, so it won't have to be removed from it.
+*/
+
+FILE *
+bfd_open_file (bfd *abfd)
+{
+  bfd_lock ();
+  FILE *result = _bfd_open_file_unlocked (abfd);
+  bfd_unlock ();
+  return result;
+}
diff --git a/bfd/doc/bfd.texi b/bfd/doc/bfd.texi
index f348710845f..3f70cb73a1d 100644
--- a/bfd/doc/bfd.texi
+++ b/bfd/doc/bfd.texi
@@ -199,6 +199,7 @@ IEEE-695.
 * typedef bfd::
 * Error reporting::
 * Initialization::
+* Threading::
 * Miscellaneous::
 * Memory Usage::
 * Sections::
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index fea00b6ee45..54b502c2dd7 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -937,6 +937,10 @@ bfd_error_handler_type _bfd_set_error_handler_caching (bfd *) ATTRIBUTE_HIDDEN;
 
 const char *_bfd_get_error_program_name (void) ATTRIBUTE_HIDDEN;
 
+void bfd_lock (void) ATTRIBUTE_HIDDEN;
+
+void bfd_unlock (void) ATTRIBUTE_HIDDEN;
+
 /* Extracted from bfdio.c.  */
 struct bfd_iovec
 {
diff --git a/bfd/opncls.c b/bfd/opncls.c
index cddfd7ec1fb..ae04821405e 100644
--- a/bfd/opncls.c
+++ b/bfd/opncls.c
@@ -81,6 +81,7 @@ _bfd_new_bfd (void)
   if (nbfd == NULL)
     return NULL;
 
+  bfd_lock ();
   if (bfd_use_reserved_id)
     {
       nbfd->id = --bfd_reserved_id_counter;
@@ -88,6 +89,7 @@ _bfd_new_bfd (void)
     }
   else
     nbfd->id = bfd_id_counter++;
+  bfd_unlock ();
 
   nbfd->memory = objalloc_create ();
   if (nbfd->memory == NULL)
diff --git a/bfd/po/bfd.pot b/bfd/po/bfd.pot
index 33d51490482..ed637fcafe9 100644
--- a/bfd/po/bfd.pot
+++ b/bfd/po/bfd.pot
@@ -231,22 +231,22 @@ msgstr ""
 msgid "#<invalid error code>"
 msgstr ""
 
-#: bfd.c:1892
+#: bfd.c:1997
 #, c-format
 msgid "BFD %s assertion fail %s:%d"
 msgstr ""
 
-#: bfd.c:1905
+#: bfd.c:2010
 #, c-format
 msgid "BFD %s internal error, aborting at %s:%d in %s\n"
 msgstr ""
 
-#: bfd.c:1910
+#: bfd.c:2015
 #, c-format
 msgid "BFD %s internal error, aborting at %s:%d\n"
 msgstr ""
 
-#: bfd.c:1912
+#: bfd.c:2017
 msgid "Please report this bug.\n"
 msgstr ""
 
@@ -265,7 +265,7 @@ msgstr ""
 msgid "warning: writing section `%pA' at huge (ie negative) file offset"
 msgstr ""
 
-#: cache.c:273
+#: cache.c:275
 #, c-format
 msgid "reopening %pB: %s"
 msgstr ""
-- 
2.41.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 0/3] Threads and BFD
  2023-10-26 19:07 [PATCH 0/3] Threads and BFD Tom Tromey
                   ` (2 preceding siblings ...)
  2023-10-26 19:07 ` [PATCH 3/3] Add minimal thread-safety to BFD Tom Tromey
@ 2023-11-01 12:26 ` Nick Clifton
  3 siblings, 0 replies; 12+ messages in thread
From: Nick Clifton @ 2023-11-01 12:26 UTC (permalink / raw)
  To: Tom Tromey, binutils

Hi Tom,

> gdb started using threads a while ago.  So far we've (mostly) avoided
> doing anything BFD-related off the main thread, but I would like to
> change that.

his is definitely a worthy goal.

> The first is BFD error handling.  In this series, I chose to make it
> thread-local.  This approach seemed simple and straightforward.
> Locking seemed impractical here.  Maybe moving the error into a BFD
> would work, but I didn't serious investigate that.

Nah - I am a firm believer in keeping things simple if possible.

> The second set of globals involve opening and closing BFD, and also
> the fd cache.  I went back and forth on ways to solve this.  In this
> series I let the BFD client provide lock- and unlock-functions, and
> change BFD to use these when needed.  I took this approach because it
> means that current BFD clients don't need to be changed in any way.
> (I do have a variant of this patch where BFD implements its own
> locking using a POSIX or Windows mutex; I can send that if you'd
> prefer.)

No, I prefer the approach you have posted here.

Cheers
   Nick


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/3] Make _bfd_error_buf static
  2023-10-26 19:07 ` [PATCH 1/3] Make _bfd_error_buf static Tom Tromey
@ 2023-11-01 12:27   ` Nick Clifton
  0 siblings, 0 replies; 12+ messages in thread
From: Nick Clifton @ 2023-11-01 12:27 UTC (permalink / raw)
  To: Tom Tromey, binutils

Hi Tom,

> 	* bfd.c (_bfd_error_buf): Now static.
> 	(bfd_set_input_error): Use _bfd_clear_error_data.
> 	(_bfd_clear_error_data): New function.
> 	(bfd_init): Use _bfd_clear_error_data.
> 	* libbfd.h: Regenerate.
> 	* opncls.c (bfd_close_all_done): Use _bfd_clear_error_data.
> 	* po/bfd.pot: Regenerate.

Approved - please apply.

Cheers
   NIck


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/3] Make various error-related globals thread-local
  2023-10-26 19:07 ` [PATCH 2/3] Make various error-related globals thread-local Tom Tromey
@ 2023-11-01 12:28   ` Nick Clifton
  0 siblings, 0 replies; 12+ messages in thread
From: Nick Clifton @ 2023-11-01 12:28 UTC (permalink / raw)
  To: Tom Tromey, binutils

Hi Tom,

> 	* Makefile.in: Regenerate.
> 	* aclocal.m4: Include ax_tls.m4.
> 	* ax_tls.m4: New file.
> 	* bfd.c: (bfd_error, input_error, input_bfd, _bfd_error_buf):
> 	Now thread-local.
> 	(bfd_asprintf): Update docs.
> 	* config.in, configure: Regenerate.
> 	* configure.ac: Call AX_TLS.
> 	* po/bfd.pot: Regenerate.

Approved - please apply.

Cheers
   Nick



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/3] Add minimal thread-safety to BFD
  2023-10-26 19:07 ` [PATCH 3/3] Add minimal thread-safety to BFD Tom Tromey
@ 2023-11-01 12:45   ` Nick Clifton
  2023-11-01 20:08     ` Tom Tromey
  0 siblings, 1 reply; 12+ messages in thread
From: Nick Clifton @ 2023-11-01 12:45 UTC (permalink / raw)
  To: Tom Tromey, binutils

Hi Tom,

> This patch provides some minimal thread-safety to BFD.
> 
> The BFD client can request thread-safety by providing a lock and
> unlock function.  The globals used during BFD creation (e.g.,
> bfd_id_counter) are then locked, and the file descriptor cache is also
> locked.  A function to clean up any thread-local data is now provided
> for BFD clients.
> 
> 	* bfd-in2.h: Regenerate.
> 	* bfd.c (lock_fn, unlock_fn): New globals.
> 	(bfd_thread_init, bfd_thread_cleanup, bfd_lock, bfd_unlock): New
> 	functions.
> 	* cache.c (bfd_cache_lookup_worker): Use _bfd_open_file_unlocked.
> 	(cache_btell, cache_bseek, cache_bread, cache_bwrite): Lock
> 	and unlock.
> 	(cache_bclose): Add comment.
> 	(cache_bflush, cache_bstat, cache_bmmap): Lock and unlock.
> 	(_bfd_cache_init_unlocked): New function.
> 	(bfd_cache_init): Use it.  Lock and unlock.
> 	(_bfd_cache_close_unlocked): New function.
> 	(bfd_cache_close, bfd_cache_close_all): Use it.  Lock and unlock.
> 	(_bfd_open_file_unlocked): New function.
> 	(bfd_open_file): Use it.  Lock and unlock.
> 	* doc/bfd.texi (BFD front end): Add Threading menu item.
> 	* libbfd.h: Regenerate.
> 	* opncls.c (_bfd_new_bfd): Lock and unlock.
> 	* po/bfd.pot: Regenerate.

I have one concern about this patch:


> +typedef void (*bfd_lock_unlock_fn_type) (void);

Given that we are dealing with client provided locking and unlocking
functions, I feel that the client might want to be able to reference
a data structure of their own performing these actions.  (I am not
hugely familiar with locking and unlocking functions, so maybe I am
mistaken here).  I also wonder if the functions might be interested
in the BFD being locked.  Thus I think that the typedef might be
better specified as:

  typedef void (* bfd_lock_unlock_fn_type) (bfd *, void *);

I also wonder if the functions should be allowed to fail, in which
case the typedef would be:

  typedef bool (* bfd_lock_unlock_fn_type) (bfd *, void *);

Given all of that the init function would have to be extended to take
a data pointer:

> +void
> +bfd_thread_init (bfd_lock_unlock_fn_type lock, 
                     bfd_lock_unlock_fn_type unlock,
                     void * data)
> +{
> +  lock_fn = lock;
> +  unlock_fn = unlock;
      lock_data = data;
> +}

Also - should this function let the caller know if a previous set
of lock/unlock functions had been registered, or if there was a problem
registering them ?  (For example is it OK to have a lock function but
not an unlock function ?)  ie:

   bool
   bfd_thread_init (bfd_lock_unlock_fn_type lock,
                    bfd_lock_unlock_fn_type unlock,
                    void * data)
   {
      bool ret = lock_fn == NULL && unlock_fn == NULL;

      lock_fn = lock;
      unlock_fn = unlock;
      lock_data = data;

      ret &= (lock_fn != NULL && unlock_fn != NULL) || (lock_fn == NULL && unlock_fn == NULL);
      return ret;
   }


And of course the bfd_lock and bfd_unlock would need to be updated as well, eg:

> +bool
> +bfd_lock (bfd * abfd)
> +{
> +  if (lock_fn != NULL)
> +    return lock_fn (abfd, lock_data);
      return true;
> +}

What do you think ?

Cheers
   Nick


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/3] Add minimal thread-safety to BFD
  2023-11-01 12:45   ` Nick Clifton
@ 2023-11-01 20:08     ` Tom Tromey
  2023-11-01 20:48       ` Tom Tromey
  0 siblings, 1 reply; 12+ messages in thread
From: Tom Tromey @ 2023-11-01 20:08 UTC (permalink / raw)
  To: Nick Clifton; +Cc: Tom Tromey, binutils

>>>>> "Nick" == Nick Clifton <nickc@redhat.com> writes:

>> +typedef void (*bfd_lock_unlock_fn_type) (void);

Nick> Given that we are dealing with client provided locking and unlocking
Nick> functions, I feel that the client might want to be able to reference
Nick> a data structure of their own performing these actions.  (I am not
Nick> hugely familiar with locking and unlocking functions, so maybe I am
Nick> mistaken here).  I also wonder if the functions might be interested
Nick> in the BFD being locked.  Thus I think that the typedef might be
Nick> better specified as:

Nick>  typedef void (* bfd_lock_unlock_fn_type) (bfd *, void *);

Seems reasonable.

Nick> I also wonder if the functions should be allowed to fail, in which
Nick> case the typedef would be:

Nick>  typedef bool (* bfd_lock_unlock_fn_type) (bfd *, void *);

I suppose the BFD callers can just return if these fail.

Nick> Also - should this function let the caller know if a previous set
Nick> of lock/unlock functions had been registered, or if there was a problem
Nick> registering them ?  (For example is it OK to have a lock function but
Nick> not an unlock function ?)  ie:

Yeah, I've changed it to fail if (1) it's ever been called before (I
don't think it's really necessary to support this right now) and (2) if
one of the functions is not specified.

Tom

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/3] Add minimal thread-safety to BFD
  2023-11-01 20:08     ` Tom Tromey
@ 2023-11-01 20:48       ` Tom Tromey
  2023-11-02 12:14         ` Nick Clifton
  0 siblings, 1 reply; 12+ messages in thread
From: Tom Tromey @ 2023-11-01 20:48 UTC (permalink / raw)
  To: Tom Tromey; +Cc: Nick Clifton, binutils

Nick> typedef bool (* bfd_lock_unlock_fn_type) (bfd *, void *);

Tom> I suppose the BFD callers can just return if these fail.

Well, I started on this change, but I am not sure about it now.

cache_btell doesn't seem to have any way to even report an error.  So,
I'm not sure what to do there.  Ignoring the failure is no good.

Or, consider things like cache_bseek.  Handling a failure of bfd_lock is
easy, but there's an unlock at the end:

  int result = _bfd_real_fseek (f, offset, whence);
  bfd_unlock ();
  return result;

If that fails should this really return -1?  Similarly for cache_bwrite,
etc.

On the other hand, I don't think these things really can fail.  Like,
pthread_mutex_lock/unlock failures modes all are basically programming
errors.  So this may argue for just "doing anything".  Or we could
declare these to be infallible.

Let me know what you'd prefer.

Tom

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/3] Add minimal thread-safety to BFD
  2023-11-01 20:48       ` Tom Tromey
@ 2023-11-02 12:14         ` Nick Clifton
  2023-11-03 23:10           ` Tom Tromey
  0 siblings, 1 reply; 12+ messages in thread
From: Nick Clifton @ 2023-11-02 12:14 UTC (permalink / raw)
  To: Tom Tromey; +Cc: binutils

Hi Tom,

> Nick> typedef bool (* bfd_lock_unlock_fn_type) (bfd *, void *);
> 
> Tom> I suppose the BFD callers can just return if these fail.
> 
> Well, I started on this change, but I am not sure about it now.
> 
> cache_btell doesn't seem to have any way to even report an error.  So,
> I'm not sure what to do there.  Ignoring the failure is no good.

It could return "(ufile_ptr) -1".  This would be somewhat inline with
how ftell() behaves.


> Or, consider things like cache_bseek.  Handling a failure of bfd_lock is
> easy, but there's an unlock at the end:
> 
>    int result = _bfd_real_fseek (f, offset, whence);
>    bfd_unlock ();
>    return result;
> 
> If that fails should this really return -1?

Yes.

If the unlock has failed then something pretty bad must have happened and
it would not be a good idea to let the code carry on as if everything was
OK.


   Similarly for cache_bwrite,
> etc.

Yes - the same for these - if the lock or unlock fail then we should assume
the worst and try to return to the client as cleanly as possible.


> On the other hand, I don't think these things really can fail.  Like,
> pthread_mutex_lock/unlock failures modes all are basically programming
> errors.  So this may argue for just "doing anything".  Or we could
> declare these to be infallible.

I agree that they are unlikely to fail.  But being paranoid never hurts.
Since the caller is implementing the locks they can always choose to
just return "true" no matter what.  But if we do not support a failure
mode then one day someone, somewhere is bound to complain...


> Let me know what you'd prefer.

Be safe, be paranoid, and let the client decide whether their code can or
cannot fail.

Cheers
   Nick



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/3] Add minimal thread-safety to BFD
  2023-11-02 12:14         ` Nick Clifton
@ 2023-11-03 23:10           ` Tom Tromey
  0 siblings, 0 replies; 12+ messages in thread
From: Tom Tromey @ 2023-11-03 23:10 UTC (permalink / raw)
  To: Nick Clifton; +Cc: Tom Tromey, binutils

>> Let me know what you'd prefer.

Nick> Be safe, be paranoid, and let the client decide whether their code can or
Nick> cannot fail.

Alright.  I'll send v2 shortly.
I didn't check in the 2 patches you approved since I felt they didn't
really make sense in isolation.

Tom

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2023-11-03 23:09 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-26 19:07 [PATCH 0/3] Threads and BFD Tom Tromey
2023-10-26 19:07 ` [PATCH 1/3] Make _bfd_error_buf static Tom Tromey
2023-11-01 12:27   ` Nick Clifton
2023-10-26 19:07 ` [PATCH 2/3] Make various error-related globals thread-local Tom Tromey
2023-11-01 12:28   ` Nick Clifton
2023-10-26 19:07 ` [PATCH 3/3] Add minimal thread-safety to BFD Tom Tromey
2023-11-01 12:45   ` Nick Clifton
2023-11-01 20:08     ` Tom Tromey
2023-11-01 20:48       ` Tom Tromey
2023-11-02 12:14         ` Nick Clifton
2023-11-03 23:10           ` Tom Tromey
2023-11-01 12:26 ` [PATCH 0/3] Threads and BFD Nick Clifton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).