[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