* ldlang.c (push_stat_ptr, pop_stat_ptr): New functions.
(stat_save, stat_save_ptr): New variables. (lang_insert_orphan): Use push_stat_ptr and pop_stat_ptr. (load_symbols): Likewise. Delete dead "bad_load" code. (open_input_bfds): Warn on script containing output sections. (lang_enter_output_section_statement): Use push_stat_ptr. (lang_enter_group): Likewise. (lang_leave_output_section_statement): Use pop_stat_ptr. (lang_leave_group): Likewise. * ldlang.h (push_stat_ptr, pop_stat_ptr): Declare. * ldctor.c (ldctor_build_sets): Use push_stat_ptr and pop_stat_ptr. * emultempl/beos.em (gld_${EMULATION_NAME}_set_symbols): Likewise. * emultempl/pe.em (gld_${EMULATION_NAME}_set_symbols): Likewise. * emultempl/pep.em (gld_${EMULATION_NAME}_set_symbols): Likewise. * emultempl/spuelf.em (spu_place_special_section): Likewise. * emultempl/xtensaelf.em (ld_xtensa_insert_page_offsets): Likewise.
This commit is contained in:
parent
959b87241d
commit
bde18da45e
9 changed files with 98 additions and 69 deletions
19
ld/ChangeLog
19
ld/ChangeLog
|
@ -1,3 +1,22 @@
|
||||||
|
2009-02-16 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* ldlang.c (push_stat_ptr, pop_stat_ptr): New functions.
|
||||||
|
(stat_save, stat_save_ptr): New variables.
|
||||||
|
(lang_insert_orphan): Use push_stat_ptr and pop_stat_ptr.
|
||||||
|
(load_symbols): Likewise. Delete dead "bad_load" code.
|
||||||
|
(open_input_bfds): Warn on script containing output sections.
|
||||||
|
(lang_enter_output_section_statement): Use push_stat_ptr.
|
||||||
|
(lang_enter_group): Likewise.
|
||||||
|
(lang_leave_output_section_statement): Use pop_stat_ptr.
|
||||||
|
(lang_leave_group): Likewise.
|
||||||
|
* ldlang.h (push_stat_ptr, pop_stat_ptr): Declare.
|
||||||
|
* ldctor.c (ldctor_build_sets): Use push_stat_ptr and pop_stat_ptr.
|
||||||
|
* emultempl/beos.em (gld_${EMULATION_NAME}_set_symbols): Likewise.
|
||||||
|
* emultempl/pe.em (gld_${EMULATION_NAME}_set_symbols): Likewise.
|
||||||
|
* emultempl/pep.em (gld_${EMULATION_NAME}_set_symbols): Likewise.
|
||||||
|
* emultempl/spuelf.em (spu_place_special_section): Likewise.
|
||||||
|
* emultempl/xtensaelf.em (ld_xtensa_insert_page_offsets): Likewise.
|
||||||
|
|
||||||
2009-02-09 Nathan Sidwell <nathan@codesourcery.com>
|
2009-02-09 Nathan Sidwell <nathan@codesourcery.com>
|
||||||
|
|
||||||
Missing piece of 2009-01-26 commit
|
Missing piece of 2009-01-26 commit
|
||||||
|
|
|
@ -8,7 +8,7 @@ fi
|
||||||
fragment <<EOF
|
fragment <<EOF
|
||||||
/* This file is part of GLD, the Gnu Linker.
|
/* This file is part of GLD, the Gnu Linker.
|
||||||
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||||
2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU Binutils.
|
This file is part of the GNU Binutils.
|
||||||
|
|
||||||
|
@ -330,7 +330,6 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
||||||
/* Run through and invent symbols for all the
|
/* Run through and invent symbols for all the
|
||||||
names and insert the defaults. */
|
names and insert the defaults. */
|
||||||
int j;
|
int j;
|
||||||
lang_statement_list_type *save;
|
|
||||||
|
|
||||||
if (!init[IMAGEBASEOFF].inited)
|
if (!init[IMAGEBASEOFF].inited)
|
||||||
{
|
{
|
||||||
|
@ -347,9 +346,7 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Glue the assignments into the abs section */
|
/* Glue the assignments into the abs section */
|
||||||
save = stat_ptr;
|
push_stat_ptr (&abs_output_section->children);
|
||||||
|
|
||||||
stat_ptr = &(abs_output_section->children);
|
|
||||||
|
|
||||||
for (j = 0; init[j].ptr; j++)
|
for (j = 0; init[j].ptr; j++)
|
||||||
{
|
{
|
||||||
|
@ -367,7 +364,7 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
||||||
else abort();
|
else abort();
|
||||||
}
|
}
|
||||||
/* Restore the pointer. */
|
/* Restore the pointer. */
|
||||||
stat_ptr = save;
|
pop_stat_ptr ();
|
||||||
|
|
||||||
if (pe.FileAlignment >
|
if (pe.FileAlignment >
|
||||||
pe.SectionAlignment)
|
pe.SectionAlignment)
|
||||||
|
@ -609,8 +606,6 @@ sort_sections (lang_statement_union_type *s)
|
||||||
static void
|
static void
|
||||||
gld_${EMULATION_NAME}_before_allocation (void)
|
gld_${EMULATION_NAME}_before_allocation (void)
|
||||||
{
|
{
|
||||||
extern lang_statement_list_type *stat_ptr;
|
|
||||||
|
|
||||||
#ifdef TARGET_IS_ppcpe
|
#ifdef TARGET_IS_ppcpe
|
||||||
/* Here we rummage through the found bfds to collect toc information */
|
/* Here we rummage through the found bfds to collect toc information */
|
||||||
{
|
{
|
||||||
|
|
|
@ -10,7 +10,7 @@ rm -f e${EMULATION_NAME}.c
|
||||||
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
|
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
|
||||||
fragment <<EOF
|
fragment <<EOF
|
||||||
/* Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
/* Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||||
2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU Binutils.
|
This file is part of the GNU Binutils.
|
||||||
|
|
||||||
|
@ -725,7 +725,6 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
||||||
/* Run through and invent symbols for all the
|
/* Run through and invent symbols for all the
|
||||||
names and insert the defaults. */
|
names and insert the defaults. */
|
||||||
int j;
|
int j;
|
||||||
lang_statement_list_type *save;
|
|
||||||
|
|
||||||
if (!init[IMAGEBASEOFF].inited)
|
if (!init[IMAGEBASEOFF].inited)
|
||||||
{
|
{
|
||||||
|
@ -748,9 +747,7 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Glue the assignments into the abs section. */
|
/* Glue the assignments into the abs section. */
|
||||||
save = stat_ptr;
|
push_stat_ptr (&abs_output_section->children);
|
||||||
|
|
||||||
stat_ptr = &(abs_output_section->children);
|
|
||||||
|
|
||||||
for (j = 0; init[j].ptr; j++)
|
for (j = 0; init[j].ptr; j++)
|
||||||
{
|
{
|
||||||
|
@ -772,7 +769,7 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
||||||
image_base_statement = rv;
|
image_base_statement = rv;
|
||||||
}
|
}
|
||||||
/* Restore the pointer. */
|
/* Restore the pointer. */
|
||||||
stat_ptr = save;
|
pop_stat_ptr ();
|
||||||
|
|
||||||
if (pe.FileAlignment >
|
if (pe.FileAlignment >
|
||||||
pe.SectionAlignment)
|
pe.SectionAlignment)
|
||||||
|
|
|
@ -9,7 +9,7 @@ fi
|
||||||
rm -f e${EMULATION_NAME}.c
|
rm -f e${EMULATION_NAME}.c
|
||||||
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
|
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
|
||||||
fragment <<EOF
|
fragment <<EOF
|
||||||
/* Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
|
/* Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||||
Written by Kai Tietz, OneVision Software GmbH&CoKg.
|
Written by Kai Tietz, OneVision Software GmbH&CoKg.
|
||||||
|
|
||||||
This file is part of the GNU Binutils.
|
This file is part of the GNU Binutils.
|
||||||
|
@ -681,7 +681,6 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
||||||
/* Run through and invent symbols for all the
|
/* Run through and invent symbols for all the
|
||||||
names and insert the defaults. */
|
names and insert the defaults. */
|
||||||
int j;
|
int j;
|
||||||
lang_statement_list_type *save;
|
|
||||||
|
|
||||||
if (!init[IMAGEBASEOFF].inited)
|
if (!init[IMAGEBASEOFF].inited)
|
||||||
{
|
{
|
||||||
|
@ -704,9 +703,7 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Glue the assignments into the abs section. */
|
/* Glue the assignments into the abs section. */
|
||||||
save = stat_ptr;
|
push_stat_ptr (&abs_output_section->children);
|
||||||
|
|
||||||
stat_ptr = &(abs_output_section->children);
|
|
||||||
|
|
||||||
for (j = 0; init[j].ptr; j++)
|
for (j = 0; init[j].ptr; j++)
|
||||||
{
|
{
|
||||||
|
@ -728,7 +725,7 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
||||||
image_base_statement = rv;
|
image_base_statement = rv;
|
||||||
}
|
}
|
||||||
/* Restore the pointer. */
|
/* Restore the pointer. */
|
||||||
stat_ptr = save;
|
pop_stat_ptr ();
|
||||||
|
|
||||||
if (pep.FileAlignment > pep.SectionAlignment)
|
if (pep.FileAlignment > pep.SectionAlignment)
|
||||||
{
|
{
|
||||||
|
|
|
@ -160,12 +160,11 @@ spu_place_special_section (asection *s, asection *o, const char *output_name)
|
||||||
/* Pad this stub section so that it finishes at the
|
/* Pad this stub section so that it finishes at the
|
||||||
end of the icache line. */
|
end of the icache line. */
|
||||||
etree_type *e_size;
|
etree_type *e_size;
|
||||||
lang_statement_list_type *save = stat_ptr;
|
|
||||||
|
|
||||||
stat_ptr = &os->children;
|
push_stat_ptr (&os->children);
|
||||||
e_size = exp_intop (params.line_size - s->size);
|
e_size = exp_intop (params.line_size - s->size);
|
||||||
lang_add_assignment (exp_assop ('=', ".", e_size));
|
lang_add_assignment (exp_assop ('=', ".", e_size));
|
||||||
stat_ptr = save;
|
pop_stat_ptr ();
|
||||||
}
|
}
|
||||||
lang_add_section (&os->children, s, os);
|
lang_add_section (&os->children, s, os);
|
||||||
}
|
}
|
||||||
|
@ -558,7 +557,7 @@ embedded_spu_file (lang_input_statement_type *entry, const char *flags)
|
||||||
if (lang_add_input_file (oname, lang_input_file_is_file_enum, NULL) == NULL)
|
if (lang_add_input_file (oname, lang_input_file_is_file_enum, NULL) == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* lang_add_input_file put the new list entry at the end of the statement
|
/* lang_add_input_file puts the new list entry at the end of the statement
|
||||||
and input file lists. Move it to just after the current entry. */
|
and input file lists. Move it to just after the current entry. */
|
||||||
new_ent = *old_stat_tail;
|
new_ent = *old_stat_tail;
|
||||||
*old_stat_tail = NULL;
|
*old_stat_tail = NULL;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# This shell script emits a C file. -*- C -*-
|
# This shell script emits a C file. -*- C -*-
|
||||||
# Copyright 2003, 2004, 2005, 2006, 2007, 2008
|
# Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is part of the GNU Binutils.
|
# This file is part of the GNU Binutils.
|
||||||
|
@ -1951,20 +1951,17 @@ ld_xtensa_insert_page_offsets (bfd_vma dot,
|
||||||
lang_assignment_statement_type *assign_stmt;
|
lang_assignment_statement_type *assign_stmt;
|
||||||
lang_statement_union_type *assign_union;
|
lang_statement_union_type *assign_union;
|
||||||
lang_statement_list_type tmplist;
|
lang_statement_list_type tmplist;
|
||||||
lang_statement_list_type *old_stat_ptr = stat_ptr;
|
|
||||||
|
|
||||||
/* There is hidden state in "lang_add_assignment". It
|
/* There is hidden state in "lang_add_assignment". It
|
||||||
appends the new assignment statement to the stat_ptr
|
appends the new assignment statement to the stat_ptr
|
||||||
list. Thus, we swap it before and after the call. */
|
list. Thus, we swap it before and after the call. */
|
||||||
|
|
||||||
tmplist.head = NULL;
|
lang_list_init (&tmplist);
|
||||||
tmplist.tail = &tmplist.head;
|
push_stat_ptr (&tmplist);
|
||||||
|
|
||||||
stat_ptr = &tmplist;
|
|
||||||
/* Warning: side effect; statement appended to stat_ptr. */
|
/* Warning: side effect; statement appended to stat_ptr. */
|
||||||
assign_stmt = lang_add_assignment (assign_op);
|
assign_stmt = lang_add_assignment (assign_op);
|
||||||
assign_union = (lang_statement_union_type *) assign_stmt;
|
assign_union = (lang_statement_union_type *) assign_stmt;
|
||||||
stat_ptr = old_stat_ptr;
|
pop_stat_ptr ();
|
||||||
|
|
||||||
assign_union->header.next = l;
|
assign_union->header.next = l;
|
||||||
*(*stack_p)->iterloc.loc = assign_union;
|
*(*stack_p)->iterloc.loc = assign_union;
|
||||||
|
|
12
ld/ldctor.c
12
ld/ldctor.c
|
@ -1,6 +1,7 @@
|
||||||
/* ldctor.c -- constructor support routines
|
/* ldctor.c -- constructor support routines
|
||||||
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||||
2002, 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
|
2002, 2003, 2004, 2006, 2007, 2008, 2009
|
||||||
|
Free Software Foundation, Inc.
|
||||||
By Steve Chamberlain <sac@cygnus.com>
|
By Steve Chamberlain <sac@cygnus.com>
|
||||||
|
|
||||||
This file is part of the GNU Binutils.
|
This file is part of the GNU Binutils.
|
||||||
|
@ -198,7 +199,6 @@ void
|
||||||
ldctor_build_sets (void)
|
ldctor_build_sets (void)
|
||||||
{
|
{
|
||||||
static bfd_boolean called;
|
static bfd_boolean called;
|
||||||
lang_statement_list_type *old;
|
|
||||||
bfd_boolean header_printed;
|
bfd_boolean header_printed;
|
||||||
struct set_info *p;
|
struct set_info *p;
|
||||||
|
|
||||||
|
@ -244,10 +244,8 @@ ldctor_build_sets (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
old = stat_ptr;
|
lang_list_init (&constructor_list);
|
||||||
stat_ptr = &constructor_list;
|
push_stat_ptr (&constructor_list);
|
||||||
|
|
||||||
lang_list_init (stat_ptr);
|
|
||||||
|
|
||||||
header_printed = FALSE;
|
header_printed = FALSE;
|
||||||
for (p = sets; p != NULL; p = p->next)
|
for (p = sets; p != NULL; p = p->next)
|
||||||
|
@ -372,5 +370,5 @@ ldctor_build_sets (void)
|
||||||
lang_add_data (size, exp_intop (0));
|
lang_add_data (size, exp_intop (0));
|
||||||
}
|
}
|
||||||
|
|
||||||
stat_ptr = old;
|
pop_stat_ptr ();
|
||||||
}
|
}
|
||||||
|
|
83
ld/ldlang.c
83
ld/ldlang.c
|
@ -1,6 +1,6 @@
|
||||||
/* Linker command language support.
|
/* Linker command language support.
|
||||||
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU Binutils.
|
This file is part of the GNU Binutils.
|
||||||
|
@ -64,6 +64,8 @@ static const char *current_target;
|
||||||
static const char *output_target;
|
static const char *output_target;
|
||||||
static lang_statement_list_type statement_list;
|
static lang_statement_list_type statement_list;
|
||||||
static struct bfd_hash_table lang_definedness_table;
|
static struct bfd_hash_table lang_definedness_table;
|
||||||
|
static lang_statement_list_type *stat_save[10];
|
||||||
|
static lang_statement_list_type **stat_save_ptr = &stat_save[0];
|
||||||
|
|
||||||
/* Forward declarations. */
|
/* Forward declarations. */
|
||||||
static void exp_init_os (etree_type *);
|
static void exp_init_os (etree_type *);
|
||||||
|
@ -925,6 +927,23 @@ lang_list_init (lang_statement_list_type *list)
|
||||||
list->tail = &list->head;
|
list->tail = &list->head;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
push_stat_ptr (lang_statement_list_type *new_ptr)
|
||||||
|
{
|
||||||
|
if (stat_save_ptr >= stat_save + sizeof (stat_save) / sizeof (stat_save[0]))
|
||||||
|
abort ();
|
||||||
|
*stat_save_ptr++ = stat_ptr;
|
||||||
|
stat_ptr = new_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pop_stat_ptr (void)
|
||||||
|
{
|
||||||
|
if (stat_save_ptr <= stat_save)
|
||||||
|
abort ();
|
||||||
|
stat_ptr = *--stat_save_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
/* Build a new statement node for the parse tree. */
|
/* Build a new statement node for the parse tree. */
|
||||||
|
|
||||||
static lang_statement_union_type *
|
static lang_statement_union_type *
|
||||||
|
@ -1586,23 +1605,18 @@ lang_insert_orphan (asection *s,
|
||||||
etree_type *address,
|
etree_type *address,
|
||||||
lang_statement_list_type *add_child)
|
lang_statement_list_type *add_child)
|
||||||
{
|
{
|
||||||
lang_statement_list_type *old;
|
|
||||||
lang_statement_list_type add;
|
lang_statement_list_type add;
|
||||||
const char *ps;
|
const char *ps;
|
||||||
lang_output_section_statement_type *os;
|
lang_output_section_statement_type *os;
|
||||||
lang_output_section_statement_type **os_tail;
|
lang_output_section_statement_type **os_tail;
|
||||||
|
|
||||||
/* Start building a list of statements for this section.
|
|
||||||
First save the current statement pointer. */
|
|
||||||
old = stat_ptr;
|
|
||||||
|
|
||||||
/* If we have found an appropriate place for the output section
|
/* If we have found an appropriate place for the output section
|
||||||
statements for this orphan, add them to our own private list,
|
statements for this orphan, add them to our own private list,
|
||||||
inserting them later into the global statement list. */
|
inserting them later into the global statement list. */
|
||||||
if (after != NULL)
|
if (after != NULL)
|
||||||
{
|
{
|
||||||
stat_ptr = &add;
|
lang_list_init (&add);
|
||||||
lang_list_init (stat_ptr);
|
push_stat_ptr (&add);
|
||||||
}
|
}
|
||||||
|
|
||||||
ps = NULL;
|
ps = NULL;
|
||||||
|
@ -1648,11 +1662,6 @@ lang_insert_orphan (asection *s,
|
||||||
{
|
{
|
||||||
char *symname;
|
char *symname;
|
||||||
|
|
||||||
/* lang_leave_ouput_section_statement resets stat_ptr.
|
|
||||||
Put stat_ptr back where we want it. */
|
|
||||||
if (after != NULL)
|
|
||||||
stat_ptr = &add;
|
|
||||||
|
|
||||||
symname = (char *) xmalloc (ps - secname + sizeof "__stop_" + 1);
|
symname = (char *) xmalloc (ps - secname + sizeof "__stop_" + 1);
|
||||||
symname[0] = bfd_get_symbol_leading_char (link_info.output_bfd);
|
symname[0] = bfd_get_symbol_leading_char (link_info.output_bfd);
|
||||||
sprintf (symname + (symname[0] != 0), "__stop_%s", secname);
|
sprintf (symname + (symname[0] != 0), "__stop_%s", secname);
|
||||||
|
@ -1663,7 +1672,7 @@ lang_insert_orphan (asection *s,
|
||||||
|
|
||||||
/* Restore the global list pointer. */
|
/* Restore the global list pointer. */
|
||||||
if (after != NULL)
|
if (after != NULL)
|
||||||
stat_ptr = old;
|
pop_stat_ptr ();
|
||||||
|
|
||||||
if (after != NULL && os->bfd_section != NULL)
|
if (after != NULL && os->bfd_section != NULL)
|
||||||
{
|
{
|
||||||
|
@ -1749,8 +1758,8 @@ lang_insert_orphan (asection *s,
|
||||||
|
|
||||||
/* Fix the global list pointer if we happened to tack our
|
/* Fix the global list pointer if we happened to tack our
|
||||||
new list at the tail. */
|
new list at the tail. */
|
||||||
if (*old->tail == add.head)
|
if (*stat_ptr->tail == add.head)
|
||||||
old->tail = add.tail;
|
stat_ptr->tail = add.tail;
|
||||||
|
|
||||||
/* Save the end of this list. */
|
/* Save the end of this list. */
|
||||||
place->stmt = add.tail;
|
place->stmt = add.tail;
|
||||||
|
@ -2481,8 +2490,6 @@ load_symbols (lang_input_statement_type *entry,
|
||||||
&& ! bfd_check_format_matches (entry->the_bfd, bfd_object, &matching))
|
&& ! bfd_check_format_matches (entry->the_bfd, bfd_object, &matching))
|
||||||
{
|
{
|
||||||
bfd_error_type err;
|
bfd_error_type err;
|
||||||
lang_statement_list_type *hold;
|
|
||||||
bfd_boolean bad_load = TRUE;
|
|
||||||
bfd_boolean save_ldlang_sysrooted_script;
|
bfd_boolean save_ldlang_sysrooted_script;
|
||||||
bfd_boolean save_as_needed, save_add_needed;
|
bfd_boolean save_as_needed, save_add_needed;
|
||||||
|
|
||||||
|
@ -2505,8 +2512,6 @@ load_symbols (lang_input_statement_type *entry,
|
||||||
else if (err != bfd_error_file_not_recognized
|
else if (err != bfd_error_file_not_recognized
|
||||||
|| place == NULL)
|
|| place == NULL)
|
||||||
einfo (_("%F%B: file not recognized: %E\n"), entry->the_bfd);
|
einfo (_("%F%B: file not recognized: %E\n"), entry->the_bfd);
|
||||||
else
|
|
||||||
bad_load = FALSE;
|
|
||||||
|
|
||||||
bfd_close (entry->the_bfd);
|
bfd_close (entry->the_bfd);
|
||||||
entry->the_bfd = NULL;
|
entry->the_bfd = NULL;
|
||||||
|
@ -2514,8 +2519,7 @@ load_symbols (lang_input_statement_type *entry,
|
||||||
/* Try to interpret the file as a linker script. */
|
/* Try to interpret the file as a linker script. */
|
||||||
ldfile_open_command_file (entry->filename);
|
ldfile_open_command_file (entry->filename);
|
||||||
|
|
||||||
hold = stat_ptr;
|
push_stat_ptr (place);
|
||||||
stat_ptr = place;
|
|
||||||
save_ldlang_sysrooted_script = ldlang_sysrooted_script;
|
save_ldlang_sysrooted_script = ldlang_sysrooted_script;
|
||||||
ldlang_sysrooted_script = entry->sysrooted;
|
ldlang_sysrooted_script = entry->sysrooted;
|
||||||
save_as_needed = as_needed;
|
save_as_needed = as_needed;
|
||||||
|
@ -2534,9 +2538,9 @@ load_symbols (lang_input_statement_type *entry,
|
||||||
ldlang_sysrooted_script = save_ldlang_sysrooted_script;
|
ldlang_sysrooted_script = save_ldlang_sysrooted_script;
|
||||||
as_needed = save_as_needed;
|
as_needed = save_as_needed;
|
||||||
add_needed = save_add_needed;
|
add_needed = save_add_needed;
|
||||||
stat_ptr = hold;
|
pop_stat_ptr ();
|
||||||
|
|
||||||
return ! bad_load;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ldemul_recognized_file (entry))
|
if (ldemul_recognized_file (entry))
|
||||||
|
@ -3008,6 +3012,7 @@ open_input_bfds (lang_statement_union_type *s, bfd_boolean force)
|
||||||
case lang_input_statement_enum:
|
case lang_input_statement_enum:
|
||||||
if (s->input_statement.real)
|
if (s->input_statement.real)
|
||||||
{
|
{
|
||||||
|
lang_statement_union_type **os_tail;
|
||||||
lang_statement_list_type add;
|
lang_statement_list_type add;
|
||||||
|
|
||||||
s->input_statement.target = current_target;
|
s->input_statement.target = current_target;
|
||||||
|
@ -3023,6 +3028,7 @@ open_input_bfds (lang_statement_union_type *s, bfd_boolean force)
|
||||||
bfd_archive))
|
bfd_archive))
|
||||||
s->input_statement.loaded = FALSE;
|
s->input_statement.loaded = FALSE;
|
||||||
|
|
||||||
|
os_tail = lang_output_section_statement.tail;
|
||||||
lang_list_init (&add);
|
lang_list_init (&add);
|
||||||
|
|
||||||
if (! load_symbols (&s->input_statement, &add))
|
if (! load_symbols (&s->input_statement, &add))
|
||||||
|
@ -3030,8 +3036,25 @@ open_input_bfds (lang_statement_union_type *s, bfd_boolean force)
|
||||||
|
|
||||||
if (add.head != NULL)
|
if (add.head != NULL)
|
||||||
{
|
{
|
||||||
*add.tail = s->header.next;
|
/* If this was a script with output sections then
|
||||||
s->header.next = add.head;
|
tack any added statements on to the end of the
|
||||||
|
list. This avoids having to reorder the output
|
||||||
|
section statement list. Very likely the user
|
||||||
|
forgot -T, and whatever we do here will not meet
|
||||||
|
naive user expectations. */
|
||||||
|
if (os_tail != lang_output_section_statement.tail)
|
||||||
|
{
|
||||||
|
einfo (_("%P: warning: %s contains output sections;"
|
||||||
|
" did you forget -T?\n"),
|
||||||
|
s->input_statement.filename);
|
||||||
|
*stat_ptr->tail = add.head;
|
||||||
|
stat_ptr->tail = add.tail;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*add.tail = s->header.next;
|
||||||
|
s->header.next = add.head;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -5860,7 +5883,7 @@ lang_enter_output_section_statement (const char *output_section_statement_name,
|
||||||
os->block_value = 1;
|
os->block_value = 1;
|
||||||
|
|
||||||
/* Make next things chain into subchain of this. */
|
/* Make next things chain into subchain of this. */
|
||||||
stat_ptr = &os->children;
|
push_stat_ptr (&os->children);
|
||||||
|
|
||||||
os->subsection_alignment =
|
os->subsection_alignment =
|
||||||
topower (exp_get_value_int (subalign, -1, "subsection alignment"));
|
topower (exp_get_value_int (subalign, -1, "subsection alignment"));
|
||||||
|
@ -6468,7 +6491,7 @@ lang_leave_output_section_statement (fill_type *fill, const char *memspec,
|
||||||
current_section->addr_tree != NULL);
|
current_section->addr_tree != NULL);
|
||||||
current_section->fill = fill;
|
current_section->fill = fill;
|
||||||
current_section->phdrs = phdrs;
|
current_section->phdrs = phdrs;
|
||||||
stat_ptr = &statement_list;
|
pop_stat_ptr ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create an absolute symbol with the given name with the value of the
|
/* Create an absolute symbol with the given name with the value of the
|
||||||
|
@ -6585,7 +6608,7 @@ lang_enter_group (void)
|
||||||
|
|
||||||
g = new_stat (lang_group_statement, stat_ptr);
|
g = new_stat (lang_group_statement, stat_ptr);
|
||||||
lang_list_init (&g->children);
|
lang_list_init (&g->children);
|
||||||
stat_ptr = &g->children;
|
push_stat_ptr (&g->children);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Leave a group. This just resets stat_ptr to start writing to the
|
/* Leave a group. This just resets stat_ptr to start writing to the
|
||||||
|
@ -6596,7 +6619,7 @@ lang_enter_group (void)
|
||||||
void
|
void
|
||||||
lang_leave_group (void)
|
lang_leave_group (void)
|
||||||
{
|
{
|
||||||
stat_ptr = &statement_list;
|
pop_stat_ptr ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add a new program header. This is called for each entry in a PHDRS
|
/* Add a new program header. This is called for each entry in a PHDRS
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* ldlang.h - linker command language support
|
/* ldlang.h - linker command language support
|
||||||
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU Binutils.
|
This file is part of the GNU Binutils.
|
||||||
|
@ -550,6 +550,10 @@ extern void lang_add_output_format
|
||||||
(const char *, const char *, const char *, int);
|
(const char *, const char *, const char *, int);
|
||||||
extern void lang_list_init
|
extern void lang_list_init
|
||||||
(lang_statement_list_type *);
|
(lang_statement_list_type *);
|
||||||
|
extern void push_stat_ptr
|
||||||
|
(lang_statement_list_type *);
|
||||||
|
extern void pop_stat_ptr
|
||||||
|
(void);
|
||||||
extern void lang_add_data
|
extern void lang_add_data
|
||||||
(int type, union etree_union *);
|
(int type, union etree_union *);
|
||||||
extern void lang_add_reloc
|
extern void lang_add_reloc
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue