This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
patch for pe place_orphan
- To: binutils at sources dot redhat dot com
- Subject: patch for pe place_orphan
- From: Philip Blundell <pb at futuretv dot com>
- Date: Thu, 09 Nov 2000 10:59:49 +0000
The ELF linker has defined symbols `__start_SECTION' and `__stop_SECTION' to
delimit orphan sections for quite some time (since 1994, in fact). I'd like
to apply the patch below to make the PE linker behave similarly. Is this OK?
p.
Index: emultempl/pe.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/pe.em,v
retrieving revision 1.37
diff -u -p -r1.37 pe.em
--- pe.em 2000/10/16 19:08:45 1.37
+++ pe.em 2000/11/09 10:54:59
@@ -1263,6 +1144,7 @@ gld_${EMULATION_NAME}_place_orphan (file
const char *secname;
char *hold_section_name;
char *dollar = NULL;
+ const char *ps = NULL;
lang_output_section_statement_type *os;
lang_statement_list_type add_child;
@@ -1354,6 +1236,26 @@ gld_${EMULATION_NAME}_place_orphan (file
stat_ptr = &add;
lang_list_init (stat_ptr);
+ if (config.build_constructors)
+ {
+ /* If the name of the section is representable in C, then create
+ symbols to mark the start and the end of the section. */
+ for (ps = outsecname; *ps != '\0'; ps++)
+ if (! isalnum ((unsigned char) *ps) && *ps != '_')
+ break;
+ if (*ps == '\0')
+ {
+ char *symname;
+ etree_type *e_align;
+
+ symname = (char *) xmalloc (ps - outsecname + sizeof "___start_");
+ sprintf (symname, "___start_%s", outsecname);
+ e_align = exp_unop (ALIGN_K,
+ exp_intop ((bfd_vma) 1 << s->alignment_power));
+ lang_add_assignment (exp_assop ('=', symname, e_align));
+ }
+ }
+
if (link_info.relocateable || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
address = exp_intop ((bfd_vma) 0);
else
@@ -1376,6 +1278,21 @@ gld_${EMULATION_NAME}_place_orphan (file
((bfd_vma) 0, "*default*",
(struct lang_output_section_phdr_list *) NULL, "*default*");
+ if (config.build_constructors && *ps == '\0')
+ {
+ char *symname;
+
+ /* lang_leave_ouput_section_statement resets stat_ptr. Put
+ stat_ptr back where we want it. */
+ if (place != NULL)
+ stat_ptr = &add;
+
+ symname = (char *) xmalloc (ps - outsecname + sizeof "___stop_");
+ sprintf (symname, "___stop_%s", outsecname);
+ lang_add_assignment (exp_assop ('=', symname,
+ exp_nameop (NAME, ".")));
+ }
+
stat_ptr = old;
if (place != NULL)