public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: "H.J. Lu" <hjl.tools@gmail.com>
To: binutils@sourceware.org
Cc: goldstein.w.n@gmail.com
Subject: [PATCH 1/4] ld: Add --text-section-ordering-file FILE
Date: Fri, 19 Jan 2024 11:45:49 -0800	[thread overview]
Message-ID: <20240119194552.1255481-2-hjl.tools@gmail.com> (raw)
In-Reply-To: <20240119194552.1255481-1-hjl.tools@gmail.com>

Add --text-section-ordering-file FILE to specify the text section
ordering file.  Inside the text section ordering file, when seeing an
input file name without section list and the file name starts with '.',
treat the filename as a section name and create a wild card as the file
name.

A text section ordering file which contains text section wildcards:

---
text_section_foo*
text_section_b?r
text_section_name
---

can be used to group input text sections together to:

1. Reduce gaps between text sections.
2. Put hot text sections close to each other.

Text sections in the text section ordering file are placed at the
beginning of the output text section and code text sections are moved
toward the end so that the first section in the text section ordering
file is aligned to the output section alignment.

--text-section-ordering-file must be placed before -T/--script option
so that the text section ordering file can always be included in linker
scripts.  Nested INCLUDE in the text section order file is disallowed.

NB: Gold has the command-line option, --section-ordering-file FILE, to
layout sections in the order specified.  --text-section-ordering-file
supports the same section ordering file format, but it applies only to
text sections.

	* ld.h (ld_config_type): Add text_section_ordering_file.
	* ldfile.c (in_text_section_ordering_file): New.
	(try_open): Add an argument for the original file name.  Dump
	the text section order file for verbose output.
	(ldfile_find_command_file): Pass the original file name to
	try_open.
	(ldfile_open_command_file_1): Don't allow nested INCLUDE in the
	text section order file.  If the text section order file is
	specified, set in_text_section_ordering_file, load the file and
	don't set saved_script_handle.  Clear seen_eof_include_file.
	* ldlang.c (lang_add_wild): When seeing an input file name
	without section list and the file name starts with '.', treat
	the filename as a section name and create a wild card as the
	file name.
	* ldlex.h (option_values): Add OPTION_TEXT_SECTION_ORDERING_FILE.
	(in_text_section_ordering_file): New.
	(seen_eof_include_file): Likewise.
	* ldlex.l (in_text_section_ordering_file): New.
	(seen_eof_include_file): Likewise.
	(<<EOF>>): Set seen_eof_include_file.
	* lexsup.c (ld_options): Document --text-section-ordering-file.
	(parse_args): Handle OPTION_TEXT_SECTION_ORDERING_FILE.  Issue
	an error if --text-section-ordering-file is placed after
	-T/--script.
	* scripttempl/elf.sc: Include the text section order file and
	place code text sections toward the end.
	* testsuite/ld-scripts/start.s: New file.
	* testsuite/ld-scripts/text-order-1a.d: New file.
	* testsuite/ld-scripts/text-order-1a.s: Likewise.
	* testsuite/ld-scripts/text-order-1a.t: Likewise.
	* testsuite/ld-scripts/text-order-1b.d: Likewise.
	* testsuite/ld-scripts/text-order-1b.s: Likewise.
	* testsuite/ld-scripts/text-order-1b.t: Likewise.
	* testsuite/ld-scripts/text-order-1c.d: Likewise.
	* testsuite/ld-scripts/text-order-1d.t: Likewise.
	* testsuite/ld-scripts/text-order.exp: Likewise.
---
 ld/ld.h                                 |  3 +
 ld/ldfile.c                             | 74 +++++++++++++++++++++++--
 ld/ldlang.c                             | 39 +++++++++++--
 ld/ldlex.h                              |  3 +
 ld/ldlex.l                              |  7 +++
 ld/lexsup.c                             | 11 ++++
 ld/scripttempl/elf.sc                   |  5 +-
 ld/testsuite/ld-scripts/start.s         | 12 ++++
 ld/testsuite/ld-scripts/text-order-1a.d | 20 +++++++
 ld/testsuite/ld-scripts/text-order-1a.s |  8 +++
 ld/testsuite/ld-scripts/text-order-1a.t |  5 ++
 ld/testsuite/ld-scripts/text-order-1b.d | 20 +++++++
 ld/testsuite/ld-scripts/text-order-1b.s |  8 +++
 ld/testsuite/ld-scripts/text-order-1b.t |  4 ++
 ld/testsuite/ld-scripts/text-order-1c.d |  9 +++
 ld/testsuite/ld-scripts/text-order-1c.t |  5 ++
 ld/testsuite/ld-scripts/text-order.exp  | 42 ++++++++++++++
 17 files changed, 264 insertions(+), 11 deletions(-)
 create mode 100644 ld/testsuite/ld-scripts/start.s
 create mode 100644 ld/testsuite/ld-scripts/text-order-1a.d
 create mode 100644 ld/testsuite/ld-scripts/text-order-1a.s
 create mode 100644 ld/testsuite/ld-scripts/text-order-1a.t
 create mode 100644 ld/testsuite/ld-scripts/text-order-1b.d
 create mode 100644 ld/testsuite/ld-scripts/text-order-1b.s
 create mode 100644 ld/testsuite/ld-scripts/text-order-1b.t
 create mode 100644 ld/testsuite/ld-scripts/text-order-1c.d
 create mode 100644 ld/testsuite/ld-scripts/text-order-1c.t
 create mode 100644 ld/testsuite/ld-scripts/text-order.exp

diff --git a/ld/ld.h b/ld/ld.h
index 54d9079678c..a80255a73ba 100644
--- a/ld/ld.h
+++ b/ld/ld.h
@@ -316,6 +316,9 @@ typedef struct
 
   /* Compress DWARF debug sections.  */
   enum compressed_debug_section_type compress_debug;
+
+  /* The optional text section ordering file.  */
+  const char *text_section_ordering_file;
 } ld_config_type;
 
 extern ld_config_type config;
diff --git a/ld/ldfile.c b/ld/ldfile.c
index dc9875d8813..6e9fbb7730f 100644
--- a/ld/ldfile.c
+++ b/ld/ldfile.c
@@ -736,7 +736,7 @@ ldfile_open_file (lang_input_statement_type *entry)
 /* Try to open NAME.  */
 
 static FILE *
-try_open (const char *name, bool *sysrooted)
+try_open (const char *name, const char *orig_name, bool *sysrooted)
 {
   FILE *result;
 
@@ -750,7 +750,34 @@ try_open (const char *name, bool *sysrooted)
 
   if (verbose)
     {
-      if (result == NULL)
+      if (config.text_section_ordering_file != NULL
+	  && strcmp (orig_name, config.text_section_ordering_file) == 0)
+	{
+	  if (result == NULL)
+	    info_msg (_("cannot find text section ordering file: %s\n"),
+		      name);
+	  else
+	    {
+	      static const int ld_bufsz = 8193;
+	      size_t n;
+	      char *buf = (char *) xmalloc (ld_bufsz);
+
+	      info_msg (_("opened text section ordering file: %s\n"),
+			name);
+	      info_msg ("==================================================\n");
+
+	      while ((n = fread (buf, 1, ld_bufsz - 1, result)) > 0)
+		{
+		  buf[n] = 0;
+		  info_msg ("%s", buf);
+		}
+	      rewind (result);
+	      free (buf);
+
+	      info_msg ("==================================================\n\n");
+	    }
+	}
+      else if (result == NULL)
 	info_msg (_("cannot find script file %s\n"), name);
       else
 	info_msg (_("opened script file %s\n"), name);
@@ -832,7 +859,7 @@ ldfile_find_command_file (const char *name,
   if (!default_only)
     {
       /* First try raw name.  */
-      result = try_open (name, sysrooted);
+      result = try_open (name, name, sysrooted);
       if (result != NULL)
 	return result;
     }
@@ -859,7 +886,7 @@ ldfile_find_command_file (const char *name,
        search = search->next)
     {
       path = concat (search->name, slash, name, (const char *) NULL);
-      result = try_open (path, sysrooted);
+      result = try_open (path, name, sysrooted);
       free (path);
       if (result)
 	break;
@@ -908,6 +935,38 @@ ldfile_open_command_file_1 (const char *name, enum script_open_style open_how)
 	}
     }
 
+  /* Don't allow nested INCLUDE in the text section ordering file.  */
+  if (in_text_section_ordering_file)
+    {
+      einfo (_("%F%P: error: nested include '%s' in the text section "
+	       "ordering file: '%s'\n"), name,
+	       config.text_section_ordering_file);
+      return;
+    }
+
+  if (strcmp (name, "config.text_section_ordering_file") == 0)
+    {
+      /* Support
+
+	 INCLUDE config.text_section_ordering_file;
+
+	 in input text sections in linker script.  */
+      if (config.text_section_ordering_file == NULL)
+	{
+	  /* Skip if the text section ordering file isn't specified.  */
+	  lex_push_file (NULL, name, false);
+	  return;
+	}
+
+      /* Load the text section ordering file.  */
+      name = config.text_section_ordering_file;
+
+      /* Set the in the text section ordering file marker.  */
+      in_text_section_ordering_file = 1;
+    }
+  else
+    in_text_section_ordering_file = 0;
+
   /* FIXME: This memory is never freed, but that should not really matter.
      It will be released when the linker exits, and it is unlikely to ever
      be more than a few tens of bytes.  */
@@ -932,7 +991,12 @@ ldfile_open_command_file_1 (const char *name, enum script_open_style open_how)
 
   lineno = 1;
 
-  saved_script_handle = ldlex_input_stack;
+  /* Clear the end of the include file marker.  */
+  seen_eof_include_file = 0;
+
+  /* The text section ordering file isn't a real linker script file.  */
+  if (!in_text_section_ordering_file)
+    saved_script_handle = ldlex_input_stack;
 }
 
 /* Open command file NAME in the current directory, -L directories,
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 229401c8342..d2b4d43d8ae 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -8512,12 +8512,43 @@ lang_add_wild (struct wildcard_spec *filespec,
 
   if (filespec != NULL && filespec->name != NULL)
     {
-      if (strcmp (filespec->name, "*") == 0)
-	filespec->name = NULL;
-      else if (!wildcardp (filespec->name))
-	lang_has_input_file = true;
+      if (in_text_section_ordering_file != 0
+	  && section_list == NULL
+	  && filespec->name[0] == '.'
+	  && filespec->sorted == none
+	  && filespec->exclude_name_list == NULL
+	  && filespec->section_flag_list == NULL
+	  && !filespec->reversed)
+	{
+	  /* When seeing an input file name without section list in the
+	     text section ordering file and the file name starts with
+	     '.', treat the filename as a section name and create a
+	     wild card as the file name.  */
+	  struct wildcard_list *single_section
+	    = (struct wildcard_list *) xmalloc (sizeof (*single_section));
+	  memset (single_section, 0, sizeof (*single_section));
+	  single_section->spec.name = filespec->name;
+	  single_section->spec.sorted = none;
+	  /* A NULL indicates the wild card file name, "*".  */
+	  filespec->name = NULL;
+	  section_list = single_section;
+	}
+      else
+	{
+	  if (strcmp (filespec->name, "*") == 0)
+	    filespec->name = NULL;
+	  else if (!wildcardp (filespec->name))
+	    lang_has_input_file = true;
+	}
     }
 
+  /* NB: Clear the in the text section ordering file marker after
+     processing the last entry when the end of the text section
+     ordering file is reached.  */
+  if (in_text_section_ordering_file != 0
+      && seen_eof_include_file != 0)
+    in_text_section_ordering_file = 0;
+
   new_stmt = new_stat (lang_wild_statement, stat_ptr);
   new_stmt->filename = NULL;
   new_stmt->filenames_sorted = false;
diff --git a/ld/ldlex.h b/ld/ldlex.h
index e5ac2fa7fca..a2c49656e1a 100644
--- a/ld/ldlex.h
+++ b/ld/ldlex.h
@@ -68,6 +68,7 @@ enum option_values
   OPTION_TASK_LINK,
   OPTION_TBSS,
   OPTION_TDATA,
+  OPTION_TEXT_SECTION_ORDERING_FILE,
   OPTION_TTEXT,
   OPTION_TTEXT_SEGMENT,
   OPTION_TRODATA_SEGMENT,
@@ -484,6 +485,8 @@ extern input_type parser_input;
 
 extern unsigned int lineno;
 extern const char *lex_string;
+extern int in_text_section_ordering_file;
+extern int seen_eof_include_file;
 
 /* In ldlex.l.  */
 extern int yylex (void);
diff --git a/ld/ldlex.l b/ld/ldlex.l
index e113c90812b..b41e1220661 100644
--- a/ld/ldlex.l
+++ b/ld/ldlex.l
@@ -43,6 +43,12 @@ input_type parser_input;
 /* Line number in the current input file.  */
 unsigned int lineno;
 
+/* 1 if the current input file is the text section ordering file.  */
+int in_text_section_ordering_file = 0;
+
+/* 1 if the end of the include file is reached.  */
+int seen_eof_include_file = 0;
+
 /* The string we are currently lexing, or NULL if we are reading a
    file.  */
 const char *lex_string = NULL;
@@ -487,6 +493,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
 
   lineno = lineno_stack[include_stack_ptr];
   input_flags.sysrooted = sysrooted_stack[include_stack_ptr];
+  seen_eof_include_file = 1;
 
   return END;
 }
diff --git a/ld/lexsup.c b/ld/lexsup.c
index 099dff8ecde..21385628020 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -484,6 +484,9 @@ static const struct ld_option ld_options[] =
   { {"sort-section", required_argument, NULL, OPTION_SORT_SECTION},
     '\0', N_("name|alignment"),
     N_("Sort sections by name or maximum alignment"), TWO_DASHES },
+  { {"text-section-ordering-file", required_argument, NULL, OPTION_TEXT_SECTION_ORDERING_FILE},
+    '\0', N_("FILE"),
+    N_("Sort text sections by FILE"), TWO_DASHES },
   { {"spare-dynamic-tags", required_argument, NULL, OPTION_SPARE_DYNAMIC_TAGS},
     '\0', N_("COUNT"), N_("How many tags to reserve in .dynamic section"),
     TWO_DASHES },
@@ -670,6 +673,7 @@ parse_args (unsigned argc, char **argv)
     dynamic_list
   } opt_dynamic_list = dynamic_list_unset;
   struct bfd_elf_dynamic_list *export_list = NULL;
+  bool seen_linker_script = false;
 
   shortopts = (char *) xmalloc (OPTION_COUNT * 3 + 2);
   longopts = (struct option *)
@@ -1394,6 +1398,12 @@ parse_args (unsigned argc, char **argv)
 	    einfo (_("%F%P: invalid section sorting option: %s\n"),
 		   optarg);
 	  break;
+	case OPTION_TEXT_SECTION_ORDERING_FILE:
+	  if (seen_linker_script)
+	    einfo (_("%F%P: --text-section-ordering-file must be placed"
+		     " before -T/--script\n"));
+	  config.text_section_ordering_file = optarg;
+	  break;
 	case OPTION_STATS:
 	  config.stats = true;
 	  break;
@@ -1410,6 +1420,7 @@ parse_args (unsigned argc, char **argv)
 	  ++trace_files;
 	  break;
 	case 'T':
+	  seen_linker_script = true;
 	  previous_script_handle = saved_script_handle;
 	  ldfile_open_script_file (optarg);
 	  parser_input = input_script;
diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc
index fae7c2ad71c..8014dfbfa27 100644
--- a/ld/scripttempl/elf.sc
+++ b/ld/scripttempl/elf.sc
@@ -553,11 +553,12 @@ cat <<EOF
   .text         ${RELOCATING-0} :
   {
     ${RELOCATING+${TEXT_START_SYMBOLS}}
+    ${RELOCATING+INCLUDE config.text_section_ordering_file}
+    ${RELOCATING+*(.text.hot .text.hot.*)}
+    ${RELOCATING+*(SORT(.text.sorted.*))}
     ${RELOCATING+*(.text.unlikely .text.*_unlikely .text.unlikely.*)}
     ${RELOCATING+*(.text.exit .text.exit.*)}
     ${RELOCATING+*(.text.startup .text.startup.*)}
-    ${RELOCATING+*(.text.hot .text.hot.*)}
-    ${RELOCATING+*(SORT(.text.sorted.*))}
     *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*})
     /* .gnu.warning sections are handled specially by elf.em.  */
     *(.gnu.warning)
diff --git a/ld/testsuite/ld-scripts/start.s b/ld/testsuite/ld-scripts/start.s
new file mode 100644
index 00000000000..4d8239479a6
--- /dev/null
+++ b/ld/testsuite/ld-scripts/start.s
@@ -0,0 +1,12 @@
+	.text
+	.global start	/* Used by SH targets.  */
+start:
+	.global _start
+_start:
+	.global __start
+__start:
+	.global main	/* Used by HPPA targets.  */
+main:
+	.globl	_main	/* Used by LynxOS targets.  */
+_main:
+	.dc.a 0
diff --git a/ld/testsuite/ld-scripts/text-order-1a.d b/ld/testsuite/ld-scripts/text-order-1a.d
new file mode 100644
index 00000000000..87cee75055f
--- /dev/null
+++ b/ld/testsuite/ld-scripts/text-order-1a.d
@@ -0,0 +1,20 @@
+#source: text-order-1a.s
+#source: text-order-1b.s
+#source: start.s
+#ld: --text-section-ordering-file text-order-1a.t
+#nm: -n
+#target: [is_elf_format]
+#xfail: [is_generic] hppa64-*-* mep-*-* mn10200-*-*
+# generic linker targets don't support --text-section-ordering-file
+
+#...
+[0-9a-f]+ T yyy
+#...
+[0-9a-f]+ T bar
+#...
+[0-9a-f]+ T _start
+#...
+[0-9a-f]+ T xxx
+#...
+[0-9a-f]+ T foo
+#pass
diff --git a/ld/testsuite/ld-scripts/text-order-1a.s b/ld/testsuite/ld-scripts/text-order-1a.s
new file mode 100644
index 00000000000..25f59b9e444
--- /dev/null
+++ b/ld/testsuite/ld-scripts/text-order-1a.s
@@ -0,0 +1,8 @@
+	.section .text.foo
+	.globl	foo
+foo:
+	.dc.a 0
+	.section .text.bar
+	.globl	bar
+bar:
+	.dc.a 0
diff --git a/ld/testsuite/ld-scripts/text-order-1a.t b/ld/testsuite/ld-scripts/text-order-1a.t
new file mode 100644
index 00000000000..72ea5f4cf46
--- /dev/null
+++ b/ld/testsuite/ld-scripts/text-order-1a.t
@@ -0,0 +1,5 @@
+*(.text.yyy)
+*(.text.b?r)
+*(.t*t)
+*(.text.xxx)
+*(.text.foo)
diff --git a/ld/testsuite/ld-scripts/text-order-1b.d b/ld/testsuite/ld-scripts/text-order-1b.d
new file mode 100644
index 00000000000..3f83813da2b
--- /dev/null
+++ b/ld/testsuite/ld-scripts/text-order-1b.d
@@ -0,0 +1,20 @@
+#source: text-order-1a.s
+#source: text-order-1b.s
+#source: start.s
+#ld: --text-section-ordering-file text-order-1b.t
+#nm: -n
+#target: [is_elf_format]
+#xfail: [is_generic] hppa64-*-* mep-*-* mn10200-*-*
+# generic linker targets don't support --text-section-ordering-file
+
+#...
+[0-9a-f]+ T yyy
+#...
+[0-9a-f]+ T bar
+#...
+[0-9a-f]+ T _start
+#...
+[0-9a-f]+ T xxx
+#...
+[0-9a-f]+ T foo
+#pass
diff --git a/ld/testsuite/ld-scripts/text-order-1b.s b/ld/testsuite/ld-scripts/text-order-1b.s
new file mode 100644
index 00000000000..7ae27b9676a
--- /dev/null
+++ b/ld/testsuite/ld-scripts/text-order-1b.s
@@ -0,0 +1,8 @@
+	.section .text.xxx
+	.globl	xxx
+xxx:
+	.dc.a 0
+	.section .text.yyy
+	.globl	yyy
+yyy:
+	.dc.a 0
diff --git a/ld/testsuite/ld-scripts/text-order-1b.t b/ld/testsuite/ld-scripts/text-order-1b.t
new file mode 100644
index 00000000000..c1d092edb7e
--- /dev/null
+++ b/ld/testsuite/ld-scripts/text-order-1b.t
@@ -0,0 +1,4 @@
+.text.yyy
+.text.b?r
+.t*t
+.text.xxx .text.foo
diff --git a/ld/testsuite/ld-scripts/text-order-1c.d b/ld/testsuite/ld-scripts/text-order-1c.d
new file mode 100644
index 00000000000..0c484637784
--- /dev/null
+++ b/ld/testsuite/ld-scripts/text-order-1c.d
@@ -0,0 +1,9 @@
+#source: text-order-1a.s
+#source: text-order-1b.s
+#source: start.s
+#ld: --text-section-ordering-file text-order-1c.t
+#nm: -n
+#target: [is_elf_format]
+#xfail: [is_generic] hppa64-*-* mep-*-* mn10200-*-*
+# generic linker targets don't support --text-section-ordering-file
+#error: .*: nested include 'text-order-1b.t' in the text section ordering file: 'text-order-1c.t'
diff --git a/ld/testsuite/ld-scripts/text-order-1c.t b/ld/testsuite/ld-scripts/text-order-1c.t
new file mode 100644
index 00000000000..9ecbfb42826
--- /dev/null
+++ b/ld/testsuite/ld-scripts/text-order-1c.t
@@ -0,0 +1,5 @@
+.text.yyy
+.text.b?r
+INCLUDE text-order-1b.t
+.t*t
+.text.xxx .text.foo
diff --git a/ld/testsuite/ld-scripts/text-order.exp b/ld/testsuite/ld-scripts/text-order.exp
new file mode 100644
index 00000000000..30cb531137e
--- /dev/null
+++ b/ld/testsuite/ld-scripts/text-order.exp
@@ -0,0 +1,42 @@
+# Test for --text-section-ordering-file FILE.
+# Copyright (C) 2024 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+if { !([is_elf_format] && ![is_generic]) } {
+    return
+}
+
+set old_ldflags $LDFLAGS
+if { [istarget spu*-*-*] } then {
+    set LDFLAGS "$LDFLAGS --local-store 0:0 --no-overlays"
+} elseif { [is_pecoff_format] } then {
+    set LDFLAGS "$LDFLAGS --image-base 0"
+} elseif { [is_xcoff_format] } then {
+    set LDFLAGS "$LDFLAGS -bnogc"
+}
+
+set test_list [lsort [glob -nocomplain $srcdir/$subdir/text-order*.d]]
+foreach test_file $test_list {
+    set test_name [file rootname $test_file]
+    set map_file "tmpdir/[file tail $test_name].map"
+    verbose $test_name
+    run_dump_test $test_name
+}
+
+set LDFLAGS $old_ldflags
-- 
2.43.0


  reply	other threads:[~2024-01-19 19:45 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-19 19:45 [PATCH 0/4] " H.J. Lu
2024-01-19 19:45 ` H.J. Lu [this message]
2024-01-19 21:50   ` [PATCH 1/4] " Fangrui Song
     [not found]   ` <DS7PR12MB5765A2B98C7E1217F8C374B9CB702@DS7PR12MB5765.namprd12.prod.outlook.com>
2024-01-19 22:13     ` H.J. Lu
2024-01-19 23:15       ` Fangrui Song
2024-01-22  7:37         ` Jan Beulich
2024-01-22 12:51           ` H.J. Lu
2024-01-22 18:22             ` Noah Goldstein
2024-01-22 18:45               ` H.J. Lu
2024-01-24 14:41                 ` H.J. Lu
     [not found]       ` <DS7PR12MB5765059CCA55EC755F8132ACCB702@DS7PR12MB5765.namprd12.prod.outlook.com>
2024-01-20 14:12         ` H.J. Lu
2024-01-19 19:45 ` [PATCH 2/4] ld: Include the text section order file in all ELF linker scripts H.J. Lu
2024-01-19 20:00   ` Noah Goldstein
2024-01-19 20:18     ` H.J. Lu
2024-01-19 20:38       ` Noah Goldstein
2024-01-19 20:40         ` H.J. Lu
2024-01-19 21:07           ` Noah Goldstein
2024-01-19 19:45 ` [PATCH 3/4] ld: Include the text section order file in PE COFF " H.J. Lu
2024-01-19 19:45 ` [PATCH 4/4] ld: Document --text-section-ordering-file FILE H.J. Lu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240119194552.1255481-2-hjl.tools@gmail.com \
    --to=hjl.tools@gmail.com \
    --cc=binutils@sourceware.org \
    --cc=goldstein.w.n@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).