2000-11-09 Philip Blundell <pb@futuretv.com>

* emultempl/pe.em: Define ___start_SECNAME and ___stop_SECNAME
	around orphan sections whose names can be represented in C.
This commit is contained in:
Phil Blundell 2000-11-13 10:15:23 +00:00
parent 90460d9725
commit 2e41854770
2 changed files with 41 additions and 0 deletions

View file

@ -1,3 +1,8 @@
2000-11-09 Philip Blundell <pb@futuretv.com>
* emultempl/pe.em: Define ___start_SECNAME and ___stop_SECNAME
around orphan sections whose names can be represented in C.
2000-11-07 Jim Wilson <wilson@redhat.com>
* emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): New local

View file

@ -1263,6 +1263,7 @@ gld_${EMULATION_NAME}_place_orphan (file, s)
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 +1355,26 @@ gld_${EMULATION_NAME}_place_orphan (file, s)
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 +1397,21 @@ gld_${EMULATION_NAME}_place_orphan (file, s)
((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)