aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2023-03-15 14:27:21 +0000
committerNick Clifton <nickc@redhat.com>2023-03-15 14:27:21 +0000
commit2d5783fad77c2cb9cdcb396d65fe0a60e3d8938b (patch)
tree6f498d98b1bd86aba1498861443099802ac0f8c8
parent71f646f2b3fc6e273fd17b5fdc9ba6bae242b330 (diff)
downloadbinutils-2d5783fad77c2cb9cdcb396d65fe0a60e3d8938b.zip
binutils-2d5783fad77c2cb9cdcb396d65fe0a60e3d8938b.tar.gz
binutils-2d5783fad77c2cb9cdcb396d65fe0a60e3d8938b.tar.bz2
Add --enable-linker-version option to bfd linker to add an entry in the .comment section.
PR 30187 * NEWS: Mention the new feature. * ld.texi: Document the new feature. * ldgram.y: Handle LINKER_VERSION token. * ldlang.c (lang_add_version): New function. (enable_linker_version): New global variable. * ldlang.h (land_add_version): Prototype. (enable_linker_version): Export. * ldlex.h (OPTION_ENABLE_LINKER_VERSION): Define. (OPTION_DISABLE_LINKER_VERSION): Define. * ldlex.l (LINKER_VERSION): Add token. * lexsup.c (ld_options): Add --enable-linker-version and --disable-linker-version. (parse_args): Handle the new options. * scripttempl/arclinux.sc: Remove stabs and comment sections and replace with inclusion of misc-sections.sc * scripttempl/avr.sc: Likewise. * scripttempl/dlx.sc: Likewise. * scripttempl/elf.sc: Likewise. * scripttempl/elf32cr16.sc: Likewise. * scripttempl/elf32crx.sc: Likewise. * scripttempl/elf32msp430.sc: Likewise. * scripttempl/elf64bpf.sc: Likewise. * scripttempl/elf64hppa.sc: Likewise. * scripttempl/elf_chaos.sc: Likewise. * scripttempl/elfarc.sc: Likewise. * scripttempl/elfarcv2.sc: Likewise. * scripttempl/elfd10v.sc: Likewise. * scripttempl/elfd30v.sc: Likewise. * scripttempl/elfm68hc11.sc: Likewise. * scripttempl/elfm68hc12.sc: Likewise. * scripttempl/elfm9s12z.sc: Likewise. * scripttempl/elfmicroblaze.sc: Likewise. * scripttempl/elfxgate.sc: Likewise. * scripttempl/elfxtensa.sc: Likewise. * scripttempl/epiphany_4x4.sc: Likewise. * scripttempl/ft32.sc: Likewise. * scripttempl/ip2k.sc: Likewise. * scripttempl/iq2000.sc: Likewise. * scripttempl/mep.sc: Likewise. * scripttempl/nds32elf.sc: Likewise. * scripttempl/pru.sc: Likewise. * scripttempl/v850.sc: Likewise. * scripttempl/v850_rh850.sc: Likewise. * scripttempl/visium.sc: Likewise. * scripttempl/xstormy16.sc: Likewise. * scripttempl/z80.sc: Likewise. * testsuite/ld-scripts/script.exp: Run new tests. * scripttempl/misc-sections.sc: New file. * testsuite/ld-scripts/ld-version-2.d: New file. * testsuite/ld-scripts/ld-version.d: New file. * testsuite/ld-scripts/ld-version.t: New file.
-rw-r--r--ld/ChangeLog55
-rw-r--r--ld/NEWS4
-rw-r--r--ld/ld.texi30
-rw-r--r--ld/ldgram.y6
-rw-r--r--ld/ldlang.c28
-rw-r--r--ld/ldlang.h5
-rw-r--r--ld/ldlex.h2
-rw-r--r--ld/ldlex.l1
-rw-r--r--ld/lexsup.c11
-rw-r--r--ld/scripttempl/arclinux.sc13
-rw-r--r--ld/scripttempl/avr.sc11
-rw-r--r--ld/scripttempl/dlx.sc8
-rw-r--r--ld/scripttempl/elf.sc15
-rw-r--r--ld/scripttempl/elf32cr16.sc3
-rw-r--r--ld/scripttempl/elf32crx.sc3
-rw-r--r--ld/scripttempl/elf32msp430.sc9
-rw-r--r--ld/scripttempl/elf64bpf.sc15
-rw-r--r--ld/scripttempl/elf64hppa.sc14
-rw-r--r--ld/scripttempl/elf_chaos.sc11
-rw-r--r--ld/scripttempl/elfarc.sc14
-rw-r--r--ld/scripttempl/elfarcv2.sc10
-rw-r--r--ld/scripttempl/elfd10v.sc11
-rw-r--r--ld/scripttempl/elfd30v.sc11
-rw-r--r--ld/scripttempl/elfm68hc11.sc11
-rw-r--r--ld/scripttempl/elfm68hc12.sc12
-rw-r--r--ld/scripttempl/elfm9s12z.sc12
-rw-r--r--ld/scripttempl/elfmicroblaze.sc6
-rw-r--r--ld/scripttempl/elfxgate.sc12
-rw-r--r--ld/scripttempl/elfxtensa.sc13
-rw-r--r--ld/scripttempl/epiphany_4x4.sc13
-rw-r--r--ld/scripttempl/ft32.sc5
-rw-r--r--ld/scripttempl/ip2k.sc11
-rw-r--r--ld/scripttempl/iq2000.sc12
-rw-r--r--ld/scripttempl/mep.sc12
-rw-r--r--ld/scripttempl/misc-sections.sc20
-rw-r--r--ld/scripttempl/nds32elf.sc13
-rw-r--r--ld/scripttempl/pru.sc10
-rw-r--r--ld/scripttempl/v850.sc11
-rw-r--r--ld/scripttempl/v850_rh850.sc11
-rw-r--r--ld/scripttempl/visium.sc2
-rw-r--r--ld/scripttempl/xstormy16.sc13
-rw-r--r--ld/scripttempl/z80.sc6
-rw-r--r--ld/testsuite/ld-scripts/ld-version-2.d8
-rw-r--r--ld/testsuite/ld-scripts/ld-version.d7
-rw-r--r--ld/testsuite/ld-scripts/ld-version.t9
-rw-r--r--ld/testsuite/ld-scripts/script.exp2
46 files changed, 243 insertions, 278 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 9e876b6..698b3ea 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,58 @@
+2023-03-15 Nick Clifton <nickc@redhat.com>
+
+ PR 30187
+ * NEWS: Mention the new feature.
+ * ld.texi: Document the new feature.
+ * ldgram.y: Handle LINKER_VERSION token.
+ * ldlang.c (lang_add_version): New function.
+ (enable_linker_version): New global variable.
+ * ldlang.h (land_add_version): Prototype.
+ (enable_linker_version): Export.
+ * ldlex.h (OPTION_ENABLE_LINKER_VERSION): Define.
+ (OPTION_DISABLE_LINKER_VERSION): Define.
+ * ldlex.l (LINKER_VERSION): Add token.
+ * lexsup.c (ld_options): Add --enable-linker-version and
+ --disable-linker-version.
+ (parse_args): Handle the new options.
+ * scripttempl/arclinux.sc: Remove stabs and comment sections and
+ replace with inclusion of misc-sections.sc
+ * scripttempl/avr.sc: Likewise.
+ * scripttempl/dlx.sc: Likewise.
+ * scripttempl/elf.sc: Likewise.
+ * scripttempl/elf32cr16.sc: Likewise.
+ * scripttempl/elf32crx.sc: Likewise.
+ * scripttempl/elf32msp430.sc: Likewise.
+ * scripttempl/elf64bpf.sc: Likewise.
+ * scripttempl/elf64hppa.sc: Likewise.
+ * scripttempl/elf_chaos.sc: Likewise.
+ * scripttempl/elfarc.sc: Likewise.
+ * scripttempl/elfarcv2.sc: Likewise.
+ * scripttempl/elfd10v.sc: Likewise.
+ * scripttempl/elfd30v.sc: Likewise.
+ * scripttempl/elfm68hc11.sc: Likewise.
+ * scripttempl/elfm68hc12.sc: Likewise.
+ * scripttempl/elfm9s12z.sc: Likewise.
+ * scripttempl/elfmicroblaze.sc: Likewise.
+ * scripttempl/elfxgate.sc: Likewise.
+ * scripttempl/elfxtensa.sc: Likewise.
+ * scripttempl/epiphany_4x4.sc: Likewise.
+ * scripttempl/ft32.sc: Likewise.
+ * scripttempl/ip2k.sc: Likewise.
+ * scripttempl/iq2000.sc: Likewise.
+ * scripttempl/mep.sc: Likewise.
+ * scripttempl/nds32elf.sc: Likewise.
+ * scripttempl/pru.sc: Likewise.
+ * scripttempl/v850.sc: Likewise.
+ * scripttempl/v850_rh850.sc: Likewise.
+ * scripttempl/visium.sc: Likewise.
+ * scripttempl/xstormy16.sc: Likewise.
+ * scripttempl/z80.sc: Likewise.
+ * testsuite/ld-scripts/script.exp: Run new tests.
+ * scripttempl/misc-sections.sc: New file.
+ * testsuite/ld-scripts/ld-version-2.d: New file.
+ * testsuite/ld-scripts/ld-version.d: New file.
+ * testsuite/ld-scripts/ld-version.t: New file.
+
2023-02-23 Fangrui Song <i@maskray.me>
* emultempl/riscvelf.em: Add option parsing.
diff --git a/ld/NEWS b/ld/NEWS
index 4ce7e19..37041e7 100644
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -1,5 +1,9 @@
-*- text -*-
+* For most ELF based targets, if the --enable-linker-version option is used
+ then the version of the linker will be inserted as a string into the .comment
+ section.
+
* The linker script syntax has a new command for output sections: ASCIZ "string"
This will insert a zero-terminated string at the current location.
diff --git a/ld/ld.texi b/ld/ld.texi
index 8205d4e..736563e 100644
--- a/ld/ld.texi
+++ b/ld/ld.texi
@@ -461,6 +461,22 @@ will contain a colon separated list of audit interfaces to use. This
option is only meaningful on ELF platforms supporting the rtld-audit interface.
The -P option is provided for Solaris compatibility.
+@kindex --enable-linker-version
+@item --enable-linker-version
+Enables the @code{LINKER_VERSION} linker script directive, described
+in @ref{Output Section Data}. If this directive is used in a linker
+script and this option has been enabled then a string containing the
+linker version will be inserted at the current point.
+
+Note - this location of this option on the linker command line is
+significant. It will only affect linker scripts that come after it on
+the command line, or which are built into the linker.
+
+@kindex --disable-linker-version
+@item --disable-linker-version
+Disables the @code{LINKER_VERSION} linker script directive, so that it
+does not insert a version string. This is the default.
+
@kindex --enable-non-contiguous-regions
@item --enable-non-contiguous-regions
This option avoids generating an error if an input section does not
@@ -1168,7 +1184,9 @@ in a linker script.
@itemx --version
@itemx -V
Display the version number for @command{ld}. The @option{-V} option also
-lists the supported emulations.
+lists the supported emulations. See also the description of the
+@option{--enable-linker-version} in @ref{Options,,Command-line Options}
+which can be used to insert the linker version string into a binary.
@kindex -x
@kindex --discard-all
@@ -5393,6 +5411,16 @@ entire section. If both are used, the @code{FILL} command takes
precedence. @xref{Output Section Fill}, for details on the fill
expression.
+@kindex LINKER_VERSION
+@cindex LINKER_VERSION
+Inserts a string containing the version of the linker at the current
+point. Note - by default this directive is disabled and will do
+nothing. It only becomes active if the
+@option{--enable-linker-version} command line option is used.
+
+Built-in linker scripts for ELF based targets already include this
+directive in their @samp{.comment} section.
+
@node Output Section Keywords
@subsection Output Section Keywords
There are a couple of keywords which can appear as output section
diff --git a/ld/ldgram.y b/ld/ldgram.y
index 8240cf9..4ced9ed 100644
--- a/ld/ldgram.y
+++ b/ld/ldgram.y
@@ -126,7 +126,7 @@ static int error_index;
%token END
%left <token> '('
%token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE ASCIZ
-%token SECTIONS PHDRS INSERT_K AFTER BEFORE
+%token SECTIONS PHDRS INSERT_K AFTER BEFORE LINKER_VERSION
%token DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END DATA_SEGMENT_END
%token SORT_BY_NAME SORT_BY_ALIGNMENT SORT_NONE
%token SORT_BY_INIT_PRIORITY
@@ -676,6 +676,10 @@ statement:
{
lang_add_fill ($3);
}
+ | LINKER_VERSION
+ {
+ lang_add_version_string ();
+ }
| ASSERT_K
{ ldlex_expression (); }
'(' exp ',' NAME ')' separator
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 61de638..b684e2d 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -27,7 +27,6 @@
#include "obstack.h"
#include "bfdlink.h"
#include "ctf-api.h"
-
#include "ld.h"
#include "ldmain.h"
#include "ldexp.h"
@@ -42,9 +41,11 @@
#include "demangle.h"
#include "hashtab.h"
#include "elf-bfd.h"
+#include "bfdver.h"
+
#if BFD_SUPPORTS_PLUGINS
#include "plugin.h"
-#endif /* BFD_SUPPORTS_PLUGINS */
+#endif
#ifndef offsetof
#define offsetof(TYPE, MEMBER) ((size_t) & (((TYPE*) 0)->MEMBER))
@@ -131,6 +132,7 @@ bool lang_has_input_file = false;
bool had_output_filename = false;
bool lang_float_flag = false;
bool delete_output_file_on_failure = false;
+bool enable_linker_version = false;
struct lang_phdr *lang_phdr_list;
struct lang_nocrossrefs *nocrossref_list;
struct asneeded_minfo **asneeded_list_tail;
@@ -8261,6 +8263,28 @@ lang_process (void)
lang_end ();
}
+void
+lang_add_version_string (void)
+{
+ if (! enable_linker_version)
+ return;
+
+ const char * str = "GNU ld ";
+ int len = strlen (str);
+ int i;
+
+ for (i = 0 ; i < len ; i++)
+ lang_add_data (BYTE, exp_intop (str[i]));
+
+ str = BFD_VERSION_STRING;
+ len = strlen (str);
+
+ for (i = 0 ; i < len ; i++)
+ lang_add_data (BYTE, exp_intop (str[i]));
+
+ lang_add_data (BYTE, exp_intop ('\0'));
+}
+
/* EXPORTED TO YACC */
void
diff --git a/ld/ldlang.h b/ld/ldlang.h
index 3281906..463cce3 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -530,6 +530,7 @@ extern bool lang_has_input_file;
extern lang_statement_list_type statement_list;
extern lang_statement_list_type *stat_ptr;
extern bool delete_output_file_on_failure;
+extern bool enable_linker_version;
extern struct bfd_sym_chain entry_symbol;
extern const char *entry_section;
@@ -735,6 +736,8 @@ extern void
lang_add_gc_name (const char *);
extern bool
-print_one_symbol (struct bfd_link_hash_entry *hash_entry, void *ptr);
+print_one_symbol (struct bfd_link_hash_entry *, void *);
+extern void lang_add_version_string
+ (void);
#endif
diff --git a/ld/ldlex.h b/ld/ldlex.h
index 0538f0a..48d323d 100644
--- a/ld/ldlex.h
+++ b/ld/ldlex.h
@@ -170,6 +170,8 @@ enum option_values
OPTION_NO_WARN_EXECSTACK,
OPTION_WARN_RWX_SEGMENTS,
OPTION_NO_WARN_RWX_SEGMENTS,
+ OPTION_ENABLE_LINKER_VERSION,
+ OPTION_DISABLE_LINKER_VERSION,
};
/* The initial parser states. */
diff --git a/ld/ldlex.l b/ld/ldlex.l
index 32336cf..3b55e79 100644
--- a/ld/ldlex.l
+++ b/ld/ldlex.l
@@ -310,6 +310,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
<WILD>"SHORT" { RTOKEN(SHORT); }
<WILD>"BYTE" { RTOKEN(BYTE); }
<WILD>"ASCIZ" { RTOKEN(ASCIZ); }
+<WILD>"LINKER_VERSION" { RTOKEN(LINKER_VERSION); }
<SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT); }
<SCRIPT,EXPRESSION>"NOCROSSREFS" { RTOKEN(NOCROSSREFS); }
<SCRIPT,EXPRESSION>"NOCROSSREFS_TO" { RTOKEN(NOCROSSREFS_TO); }
diff --git a/ld/lexsup.c b/ld/lexsup.c
index a1c6140..7dc2228 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -130,6 +130,10 @@ static const struct ld_option ld_options[] =
'\0', NULL, N_("Enable support of non-contiguous memory regions"), TWO_DASHES },
{ {"enable-non-contiguous-regions-warnings", no_argument, NULL, OPTION_NON_CONTIGUOUS_REGIONS_WARNINGS},
'\0', NULL, N_("Enable warnings when --enable-non-contiguous-regions may cause unexpected behaviour"), TWO_DASHES },
+ { {"disable-linker-version", no_argument, NULL, OPTION_DISABLE_LINKER_VERSION},
+ '\0', NULL, N_("Disable the LINKER_VERSION linker script directive"), TWO_DASHES },
+ { {"enable-linker-version", no_argument, NULL, OPTION_ENABLE_LINKER_VERSION},
+ '\0', NULL, N_("Enable the LINKER_VERSION linker script directive"), TWO_DASHES },
{ {"EB", no_argument, NULL, OPTION_EB},
'\0', NULL, N_("Link big-endian objects"), ONE_DASH },
{ {"EL", no_argument, NULL, OPTION_EL},
@@ -1095,6 +1099,13 @@ parse_args (unsigned argc, char **argv)
break;
#endif
+ case OPTION_ENABLE_LINKER_VERSION:
+ enable_linker_version = true;
+ break;
+ case OPTION_DISABLE_LINKER_VERSION:
+ enable_linker_version = false;
+ break;
+
case OPTION_UNDEFINED_VERSION:
link_info.allow_undefined_version = true;
break;
diff --git a/ld/scripttempl/arclinux.sc b/ld/scripttempl/arclinux.sc
index 7ebf7ad..9c24e5b 100644
--- a/ld/scripttempl/arclinux.sc
+++ b/ld/scripttempl/arclinux.sc
@@ -656,18 +656,7 @@ EOF
test -z "${NON_ALLOC_DYN}" || emit_dyn
-cat <<EOF
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
-EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
diff --git a/ld/scripttempl/avr.sc b/ld/scripttempl/avr.sc
index 9abfc53..3677e07 100644
--- a/ld/scripttempl/avr.sc
+++ b/ld/scripttempl/avr.sc
@@ -328,16 +328,9 @@ cat <<EOF
EOF
fi
-cat <<EOF
+. $srcdir/scripttempl/misc-sections.sc
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
+cat <<EOF
.note.gnu.build-id ${RELOCATING-0} : { *(.note.gnu.build-id) }
EOF
diff --git a/ld/scripttempl/dlx.sc b/ld/scripttempl/dlx.sc
index 1a1774c..f5673f4 100644
--- a/ld/scripttempl/dlx.sc
+++ b/ld/scripttempl/dlx.sc
@@ -38,5 +38,13 @@ SECTIONS
${RELOCATING+*(COMMON)}
${RELOCATING+end = .;}
}
+
+EOF
+
+. $srcdir/scripttempl/misc-sections.sc
+
+. $srcdir/scripttempl/DWARF.sc
+
+cat <<EOF
}
EOF
diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc
index 5d3b0d3..92f100b 100644
--- a/ld/scripttempl/elf.sc
+++ b/ld/scripttempl/elf.sc
@@ -722,20 +722,7 @@ EOF
test -z "${NON_ALLOC_DYN}" || emit_dyn
-cat <<EOF
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
- .gnu.build.attributes : { *(.gnu.build.attributes${RELOCATING+ .gnu.build.attributes.*}) }
-
-EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
diff --git a/ld/scripttempl/elf32cr16.sc b/ld/scripttempl/elf32cr16.sc
index f45ce80..aedc17b 100644
--- a/ld/scripttempl/elf32cr16.sc
+++ b/ld/scripttempl/elf32cr16.sc
@@ -169,10 +169,9 @@ SECTIONS
__ISTACK_START = .;
}${RELOCATING+ > ram}
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/elf32crx.sc b/ld/scripttempl/elf32crx.sc
index fa24813..747bfbb1 100644
--- a/ld/scripttempl/elf32crx.sc
+++ b/ld/scripttempl/elf32crx.sc
@@ -167,10 +167,9 @@ SECTIONS
__ISTACK_START = .;
} > ram
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/elf32msp430.sc b/ld/scripttempl/elf32msp430.sc
index 83613fc..4b0ac8d 100644
--- a/ld/scripttempl/elf32msp430.sc
+++ b/ld/scripttempl/elf32msp430.sc
@@ -330,16 +330,9 @@ SECTIONS
/* Stabs for profiling information*/
.profiler 0 : { *(.profiler) }
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
test -n "${RELOCATING}" && cat <<EOF
diff --git a/ld/scripttempl/elf64bpf.sc b/ld/scripttempl/elf64bpf.sc
index 48cda5b..8ff588b 100644
--- a/ld/scripttempl/elf64bpf.sc
+++ b/ld/scripttempl/elf64bpf.sc
@@ -679,20 +679,7 @@ EOF
test -z "${NON_ALLOC_DYN}" || emit_dyn
-cat <<EOF
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
- .gnu.build.attributes : { *(.gnu.build.attributes${RELOCATING+ .gnu.build.attributes.*}) }
-
-EOF
+. $srcdir/scripttempl/misc-sections.sc
cat <<EOF
${ATTRS_SECTIONS}
diff --git a/ld/scripttempl/elf64hppa.sc b/ld/scripttempl/elf64hppa.sc
index 5f5d690..e80d248 100644
--- a/ld/scripttempl/elf64hppa.sc
+++ b/ld/scripttempl/elf64hppa.sc
@@ -533,19 +533,7 @@ if test -n "${NON_ALLOC_DYN}"; then
rm -f ldscripts/dyntmp.$$
fi
-cat <<EOF
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
-EOF
-
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/elf_chaos.sc b/ld/scripttempl/elf_chaos.sc
index 30bbe0b..f3b2776 100644
--- a/ld/scripttempl/elf_chaos.sc
+++ b/ld/scripttempl/elf_chaos.sc
@@ -325,18 +325,9 @@ cat <<EOF
${RELOCATING+PROVIDE (end = .);}
${STACK_ADDR+${STACK}}
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/elfarc.sc b/ld/scripttempl/elfarc.sc
index 1d3c043..ccba4a1 100644
--- a/ld/scripttempl/elfarc.sc
+++ b/ld/scripttempl/elfarc.sc
@@ -409,19 +409,7 @@ test -n "${RELOCATING}" && cat <<EOF
}
EOF
-cat <<EOF
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
- .note.gnu.build-id : { *(.note.gnu.build-id) }
-EOF
-
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/elfarcv2.sc b/ld/scripttempl/elfarcv2.sc
index bf84c76..5b547c1 100644
--- a/ld/scripttempl/elfarcv2.sc
+++ b/ld/scripttempl/elfarcv2.sc
@@ -291,18 +291,10 @@ SECTIONS
${RELOCATING+ PROVIDE (__stack_top = (ORIGIN (${DATA_MEMORY}) + LENGTH (${DATA_MEMORY}) - 1) & -4);}
${RELOCATING+ PROVIDE (__end_heap = ORIGIN (${DATA_MEMORY}) + LENGTH (${DATA_MEMORY}) - 1);}
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/elfd10v.sc b/ld/scripttempl/elfd10v.sc
index 4261f83..c08192c 100644
--- a/ld/scripttempl/elfd10v.sc
+++ b/ld/scripttempl/elfd10v.sc
@@ -172,18 +172,9 @@ SECTIONS
${RELOCATING+$STACK}
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/elfd30v.sc b/ld/scripttempl/elfd30v.sc
index 4bb0efc..2c95f5c 100644
--- a/ld/scripttempl/elfd30v.sc
+++ b/ld/scripttempl/elfd30v.sc
@@ -197,18 +197,9 @@ SECTIONS
${RELOCATING+ PROVIDE (__eit_end = .) ; }
} ${RELOCATING+ > eit}
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/elfm68hc11.sc b/ld/scripttempl/elfm68hc11.sc
index d029bae..e796a5f 100644
--- a/ld/scripttempl/elfm68hc11.sc
+++ b/ld/scripttempl/elfm68hc11.sc
@@ -428,18 +428,9 @@ SECTIONS
${RELOCATING+${VECTORS}}
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/elfm68hc12.sc b/ld/scripttempl/elfm68hc12.sc
index 32ba5c3..6fa7089 100644
--- a/ld/scripttempl/elfm68hc12.sc
+++ b/ld/scripttempl/elfm68hc12.sc
@@ -430,17 +430,11 @@ SECTIONS
} ${RELOCATING+ > ${EEPROM_MEMORY}}
${RELOCATING+${VECTORS}}
+EOF
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
+. $srcdir/scripttempl/misc-sections.sc
+cat <<EOF
/* Treatment of DWARF debug section must be at end of the linker
script to avoid problems when there are undefined symbols. It's necessary
to avoid that the DWARF section is relocated before such undefined
diff --git a/ld/scripttempl/elfm9s12z.sc b/ld/scripttempl/elfm9s12z.sc
index aaa137b..d77e213 100644
--- a/ld/scripttempl/elfm9s12z.sc
+++ b/ld/scripttempl/elfm9s12z.sc
@@ -420,17 +420,11 @@ SECTIONS
} ${RELOCATING+ > ${EEPROM_MEMORY}}
${RELOCATING+${VECTORS}}
+EOF
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
+. $srcdir/scripttempl/misc-sections.sc
+cat <<EOF
/* Treatment of DWARF debug section must be at end of the linker
script to avoid problems when there are undefined symbols. It's necessary
to avoid that the DWARF section is relocated before such undefined
diff --git a/ld/scripttempl/elfmicroblaze.sc b/ld/scripttempl/elfmicroblaze.sc
index 8d99ea1..6c17172 100644
--- a/ld/scripttempl/elfmicroblaze.sc
+++ b/ld/scripttempl/elfmicroblaze.sc
@@ -232,5 +232,11 @@ SECTIONS
${RELOCATING+*(.tbss.*)}
${RELOCATING+*(.gnu.linkonce.tb.*)}
}
+EOF
+
+. $srcdir/scripttempl/misc-sections.sc
+. $srcdir/scripttempl/DWARF.sc
+
+cat <<EOF
}
EOF
diff --git a/ld/scripttempl/elfxgate.sc b/ld/scripttempl/elfxgate.sc
index af8beb0..f810788 100644
--- a/ld/scripttempl/elfxgate.sc
+++ b/ld/scripttempl/elfxgate.sc
@@ -430,19 +430,9 @@ SECTIONS
} ${RELOCATING+ > ${EEPROM_MEMORY}}
${RELOCATING+${VECTORS}}
-
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/elfxtensa.sc b/ld/scripttempl/elfxtensa.sc
index eb0e675..a6cd174 100644
--- a/ld/scripttempl/elfxtensa.sc
+++ b/ld/scripttempl/elfxtensa.sc
@@ -543,18 +543,7 @@ if test -n "${NON_ALLOC_DYN}"; then
rm -f ldscripts/dyntmp.$$
fi
-cat <<EOF
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
-EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
diff --git a/ld/scripttempl/epiphany_4x4.sc b/ld/scripttempl/epiphany_4x4.sc
index bbed7e1..42e2f7e 100644
--- a/ld/scripttempl/epiphany_4x4.sc
+++ b/ld/scripttempl/epiphany_4x4.sc
@@ -626,18 +626,7 @@ if test -n "${NON_ALLOC_DYN}"; then
rm -f ldscripts/dyntmp.$$
fi
-cat <<EOF
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
-EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
diff --git a/ld/scripttempl/ft32.sc b/ld/scripttempl/ft32.sc
index ef7f332..e2d5a6b 100644
--- a/ld/scripttempl/ft32.sc
+++ b/ld/scripttempl/ft32.sc
@@ -69,10 +69,5 @@ SECTIONS
{
*(.stabstr)
}
-EOF
-
-. $srcdir/scripttempl/DWARF.sc
-
-cat <<EOF
}
EOF
diff --git a/ld/scripttempl/ip2k.sc b/ld/scripttempl/ip2k.sc
index 5e78132..89a2f16 100644
--- a/ld/scripttempl/ip2k.sc
+++ b/ld/scripttempl/ip2k.sc
@@ -135,17 +135,10 @@ SECTIONS
/* Stack. */
PROVIDE (__stack = 0x01000FFF);
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
+
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/iq2000.sc b/ld/scripttempl/iq2000.sc
index 13c8a90..44228e7 100644
--- a/ld/scripttempl/iq2000.sc
+++ b/ld/scripttempl/iq2000.sc
@@ -406,18 +406,10 @@ cat <<EOF
${RELOCATING+_end = .;}
${RELOCATING+PROVIDE (end = .);}
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
+
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/mep.sc b/ld/scripttempl/mep.sc
index 77892cb..1a0252d 100644
--- a/ld/scripttempl/mep.sc
+++ b/ld/scripttempl/mep.sc
@@ -406,18 +406,10 @@ cat <<EOF
${RELOCATING+PROVIDE (end = .);}
${RELOCATING+${DATA_SEGMENT_END}}
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
+
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/misc-sections.sc b/ld/scripttempl/misc-sections.sc
new file mode 100644
index 0000000..115ef1a
--- /dev/null
+++ b/ld/scripttempl/misc-sections.sc
@@ -0,0 +1,20 @@
+# Copyright (C) 2014-2023 Free Software Foundation, Inc.
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.
+#
+cat <<EOF
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+
+ .comment : { *(.comment); LINKER_VERSION; }
+
+ .gnu.build.attributes : { *(.gnu.build.attributes${RELOCATING+ .gnu.build.attributes.*}) }
+
+EOF
diff --git a/ld/scripttempl/nds32elf.sc b/ld/scripttempl/nds32elf.sc
index 279e424..b3acb01 100644
--- a/ld/scripttempl/nds32elf.sc
+++ b/ld/scripttempl/nds32elf.sc
@@ -601,18 +601,7 @@ EOF
test -z "${NON_ALLOC_DYN}" || emit_dyn
-cat <<EOF
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
-EOF
+. $srcdir/scripttempl/misc-sections.sc
. $srcdir/scripttempl/DWARF.sc
diff --git a/ld/scripttempl/pru.sc b/ld/scripttempl/pru.sc
index 4229bed..a24005b 100644
--- a/ld/scripttempl/pru.sc
+++ b/ld/scripttempl/pru.sc
@@ -201,17 +201,11 @@ SECTIONS
place it in the target dmem memory. */
.pru_irq_map 0 : { *(.pru_irq_map) }
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
.note.gnu.build-id ${RELOCATING-0} : { *(.note.gnu.build-id) }
EOF
+. $srcdir/scripttempl/misc-sections.sc
+
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/v850.sc b/ld/scripttempl/v850.sc
index 713dfae..515aeb1 100644
--- a/ld/scripttempl/v850.sc
+++ b/ld/scripttempl/v850.sc
@@ -196,17 +196,10 @@ SECTIONS
.note.renesas 0 : { KEEP(*(.note.renesas)) }
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
+
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/v850_rh850.sc b/ld/scripttempl/v850_rh850.sc
index a68ab8e..a068893 100644
--- a/ld/scripttempl/v850_rh850.sc
+++ b/ld/scripttempl/v850_rh850.sc
@@ -216,17 +216,10 @@ SECTIONS
.note.renesas 0 : { KEEP(*(.note.renesas)) }
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
+
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/visium.sc b/ld/scripttempl/visium.sc
index 7435530..def19ca 100644
--- a/ld/scripttempl/visium.sc
+++ b/ld/scripttempl/visium.sc
@@ -163,7 +163,7 @@ SECTIONS
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
- .comment 0 : { *(.comment) }
+ .comment 0 : { *(.comment); LINKER_VERSION; }
EOF
diff --git a/ld/scripttempl/xstormy16.sc b/ld/scripttempl/xstormy16.sc
index e0f7fcc..2b3c051 100644
--- a/ld/scripttempl/xstormy16.sc
+++ b/ld/scripttempl/xstormy16.sc
@@ -203,19 +203,10 @@ SECTIONS
${RELOCATING+PROVIDE (etext = .);}
${RELOCATING+${OTHER_READONLY_SECTIONS}}
-
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
-
- .comment 0 : { *(.comment) }
-
EOF
+. $srcdir/scripttempl/misc-sections.sc
+
. $srcdir/scripttempl/DWARF.sc
cat <<EOF
diff --git a/ld/scripttempl/z80.sc b/ld/scripttempl/z80.sc
index 3e2c48b..75a6a4a 100644
--- a/ld/scripttempl/z80.sc
+++ b/ld/scripttempl/z80.sc
@@ -49,5 +49,11 @@ SECTIONS
*(bss)
${RELOCATING+ __Hbss = .;}
}
+EOF
+
+. $srcdir/scripttempl/misc-sections.sc
+. $srcdir/scripttempl/DWARF.sc
+
+cat <<EOF
}
EOF
diff --git a/ld/testsuite/ld-scripts/ld-version-2.d b/ld/testsuite/ld-scripts/ld-version-2.d
new file mode 100644
index 0000000..7612349
--- /dev/null
+++ b/ld/testsuite/ld-scripts/ld-version-2.d
@@ -0,0 +1,8 @@
+# source: data.s
+# ld: --enable-linker-version -e 0
+# readelf: -p.comment
+# target: [is_elf_format]
+# skip: ft32-*-* pru-*-*
+
+String dump of section '.comment':
+.*GNU ld \(GNU Binutils\) 2.*
diff --git a/ld/testsuite/ld-scripts/ld-version.d b/ld/testsuite/ld-scripts/ld-version.d
new file mode 100644
index 0000000..a55fc5e
--- /dev/null
+++ b/ld/testsuite/ld-scripts/ld-version.d
@@ -0,0 +1,7 @@
+# source: data.s
+# ld: --enable-linker-version -T ld-version.t
+# readelf: -p.comment
+# target: [is_elf_format]
+
+String dump of section '.comment':
+.*GNU ld \(GNU Binutils\) 2.*
diff --git a/ld/testsuite/ld-scripts/ld-version.t b/ld/testsuite/ld-scripts/ld-version.t
new file mode 100644
index 0000000..5e7d22c
--- /dev/null
+++ b/ld/testsuite/ld-scripts/ld-version.t
@@ -0,0 +1,9 @@
+SECTIONS
+{
+ .comment :
+ {
+ *(.comment);
+ LINKER_VERSION;
+ }
+ /DISCARD/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-scripts/script.exp b/ld/testsuite/ld-scripts/script.exp
index a574dde..28cc6da 100644
--- a/ld/testsuite/ld-scripts/script.exp
+++ b/ld/testsuite/ld-scripts/script.exp
@@ -231,6 +231,8 @@ run_dump_test "asciz"
run_dump_test "align-with-input"
run_dump_test "pr20302"
run_dump_test "output-section-types"
+run_dump_test "ld-version"
+run_dump_test "ld-version-2"
run_dump_test "segment-start" {{name (default)}}
run_dump_test "segment-start" {{name (overridden)} \