[binutils-gdb] ld: Don't define section symbols for excluded sections

H.J. Lu hjl@sourceware.org
Thu Jul 30 10:57:30 GMT 2026


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d1268210b6f6eddd267a4ebe4b7d36b802af628d

commit d1268210b6f6eddd267a4ebe4b7d36b802af628d
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Jul 30 15:10:36 2026 +0800

    ld: Don't define section symbols for excluded sections
    
    When the SEC_EXCLUDE bit is set on a section, for example, sections with
    the SHF_EXCLUDE flag bit set in ELF input, the contents of the section
    are excluded by the linker for non-relocatable output.  Define  __start,
    __stop, .startof. and .sizeof. symbols for relocatable link or if the
    SEC_EXCLUDE bit on the section is cleared.
    
            PR ld/34448
            * ldlang.c (lang_init_start_stop): Call lang_define_start_stop
            for relocatable link or if the SEC_EXCLUDE bit on the section
            is cleared.
    
    Signed-off-by: H.J. Lu <hjl.tools@gmail.com>

Diff:
---
 ld/ldlang.c | 39 +++++++++++++++++++++------------------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git a/ld/ldlang.c b/ld/ldlang.c
index b04ba113aaa..886c49a1861 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -7283,28 +7283,31 @@ lang_init_start_stop (void)
 
   for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next)
     for (s = abfd->sections; s != NULL; s = s->next)
-      {
-	const char *ps;
-	const char *secname = s->name;
+      if (bfd_link_relocatable (&link_info)
+	  || (s->flags & SEC_EXCLUDE) == 0)
+	{
+	  const char *ps;
+	  const char *secname = s->name;
 
-	for (ps = secname; *ps != '\0'; ps++)
-	  if (!ISALNUM ((unsigned char) *ps) && *ps != '_')
-	    break;
-	if (*ps == '\0')
-	  {
-	    char *symbol = (char *) xmalloc (10 + strlen (secname));
+	  for (ps = secname; *ps != '\0'; ps++)
+	    if (!ISALNUM ((unsigned char) *ps) && *ps != '_')
+	      break;
+	  if (*ps == '\0')
+	    {
+	      char *symbol = (char *) xmalloc (10 + strlen (secname));
 
-	    symbol[0] = leading_char;
-	    sprintf (symbol + (leading_char != 0), "__start_%s", secname);
-	    lang_define_start_stop (symbol, s);
+	      symbol[0] = leading_char;
+	      sprintf (symbol + (leading_char != 0), "__start_%s",
+		       secname);
+	      lang_define_start_stop (symbol, s);
 
-	    symbol[1] = leading_char;
-	    memcpy (symbol + 1 + (leading_char != 0), "__stop", 6);
-	    lang_define_start_stop (symbol + 1, s);
+	      symbol[1] = leading_char;
+	      memcpy (symbol + 1 + (leading_char != 0), "__stop", 6);
+	      lang_define_start_stop (symbol + 1, s);
 
-	    free (symbol);
-	  }
-      }
+	      free (symbol);
+	    }
+	}
 }
 
 /* Iterate over start_stop_syms.  */


More information about the Binutils-cvs mailing list