* ldlang.h (struct lang_input_statement_flags): New, extract from..
(lang_input_statement_type): ..here. New field "flags". (input_flags): Declare. (missing_file): Delete. * ldmain.h (whole_archive): Delete. (add_DT_NEEDED_for_regular, add_DT_NEEDED_for_dynamic): Delete. * ld.h (ld_config_type <dynamic_link>): Delete. * ldmain.c (whole_archive): Delete. (add_DT_NEEDED_for_regular, add_DT_NEEDED_for_dynamic): Delete. * ldlang.c (missing_file, ldlang_sysrooted_script): Delete. (input_flags): New variable. Replace all uses of config.dynamic_link, missing_file, ldlang_sysrooted_script, whole_archive, add_DT_NEEDED_for_regular and add_DT_NEEDED_for_dynamic with fields from here. * ldfile.c: Likewise. * ldgram.y: Likewise. * ldmain.c: Likewise. * ldwrite.c: Likewise. * lexsup.c: Likewise. * plugin.c: Likewise. * emultempl/aix.em: Likewise. * emultempl/armelf.em: Likewise. * emultempl/elf32.em: Likewise. * emultempl/hppaelf.em: Likewise. * emultempl/linux.em: Likewise. * emultempl/pe.em: Likewise. * emultempl/pep.em: Likewise. * emultempl/ppc64elf.em: Likewise. * emultempl/scoreelf.em: Likewise. * emultempl/spuelf.em: Likewise. * emultempl/sunos.em: Likewise. * emultempl/vms.em: Likewise. * ldlang.c (new_afile): Use memset to init zero fields. (load_symbols): Simplify save and restore of flags around command file processing. * ldfile.c (is_sysrooted_pathname): Tidy.
This commit is contained in:
parent
d8df103b50
commit
66be105571
39
ld/ChangeLog
39
ld/ChangeLog
@ -1,3 +1,42 @@
|
||||
2012-03-06 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* ldlang.h (struct lang_input_statement_flags): New, extract from..
|
||||
(lang_input_statement_type): ..here. New field "flags".
|
||||
(input_flags): Declare.
|
||||
(missing_file): Delete.
|
||||
* ldmain.h (whole_archive): Delete.
|
||||
(add_DT_NEEDED_for_regular, add_DT_NEEDED_for_dynamic): Delete.
|
||||
* ld.h (ld_config_type <dynamic_link>): Delete.
|
||||
* ldmain.c (whole_archive): Delete.
|
||||
(add_DT_NEEDED_for_regular, add_DT_NEEDED_for_dynamic): Delete.
|
||||
* ldlang.c (missing_file, ldlang_sysrooted_script): Delete.
|
||||
(input_flags): New variable. Replace all uses of config.dynamic_link,
|
||||
missing_file, ldlang_sysrooted_script, whole_archive,
|
||||
add_DT_NEEDED_for_regular and add_DT_NEEDED_for_dynamic with fields
|
||||
from here.
|
||||
* ldfile.c: Likewise.
|
||||
* ldgram.y: Likewise.
|
||||
* ldmain.c: Likewise.
|
||||
* ldwrite.c: Likewise.
|
||||
* lexsup.c: Likewise.
|
||||
* plugin.c: Likewise.
|
||||
* emultempl/aix.em: Likewise.
|
||||
* emultempl/armelf.em: Likewise.
|
||||
* emultempl/elf32.em: Likewise.
|
||||
* emultempl/hppaelf.em: Likewise.
|
||||
* emultempl/linux.em: Likewise.
|
||||
* emultempl/pe.em: Likewise.
|
||||
* emultempl/pep.em: Likewise.
|
||||
* emultempl/ppc64elf.em: Likewise.
|
||||
* emultempl/scoreelf.em: Likewise.
|
||||
* emultempl/spuelf.em: Likewise.
|
||||
* emultempl/sunos.em: Likewise.
|
||||
* emultempl/vms.em: Likewise.
|
||||
* ldlang.c (new_afile): Use memset to init zero fields.
|
||||
(load_symbols): Simplify save and restore of flags around command
|
||||
file processing.
|
||||
* ldfile.c (is_sysrooted_pathname): Tidy.
|
||||
|
||||
2012-03-05 Hans-Peter Nilsson <hp@axis.com>
|
||||
|
||||
* configure.tgt (mips64*el-*-freebsd*, mips64*-*-freebsd*)
|
||||
|
@ -10,7 +10,7 @@ fragment <<EOF
|
||||
|
||||
/* AIX emulation code for ${EMULATION_NAME}
|
||||
Copyright 1991, 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
||||
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012
|
||||
Free Software Foundation, Inc.
|
||||
Written by Steve Chamberlain <sac@cygnus.com>
|
||||
AIX support by Ian Lance Taylor <ian@cygnus.com>
|
||||
@ -145,7 +145,7 @@ gld${EMULATION_NAME}_before_parse (void)
|
||||
{
|
||||
ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
|
||||
|
||||
config.dynamic_link = TRUE;
|
||||
input_flags.dynamic = TRUE;
|
||||
config.has_shared = TRUE;
|
||||
|
||||
/* The link_info.[init|fini]_functions are initialized in ld/lexsup.c.
|
||||
@ -669,7 +669,7 @@ gld${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry)
|
||||
*flpp = n;
|
||||
|
||||
ret = TRUE;
|
||||
entry->loaded = TRUE;
|
||||
entry->flags.loaded = TRUE;
|
||||
}
|
||||
|
||||
fclose (e);
|
||||
@ -1505,7 +1505,7 @@ gld${EMULATION_NAME}_open_dynamic_archive (const char *arch,
|
||||
{
|
||||
char *path;
|
||||
|
||||
if (!entry->maybe_archive)
|
||||
if (!entry->flags.maybe_archive)
|
||||
return FALSE;
|
||||
|
||||
path = concat (search->name, "/lib", entry->filename, arch, ".a", NULL);
|
||||
|
@ -1,6 +1,6 @@
|
||||
# This shell script emits a C file. -*- C -*-
|
||||
# Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
|
||||
# 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
||||
# 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of the GNU Binutils.
|
||||
@ -50,7 +50,7 @@ gld${EMULATION_NAME}_before_parse (void)
|
||||
#ifndef TARGET_ /* I.e., if not generic. */
|
||||
ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
|
||||
#endif /* not TARGET_ */
|
||||
config.dynamic_link = ${DYNAMIC_LINK-TRUE};
|
||||
input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
|
||||
config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
|
||||
}
|
||||
|
||||
@ -240,7 +240,7 @@ build_section_lists (lang_statement_union_type *statement)
|
||||
{
|
||||
asection *i = statement->input_section.section;
|
||||
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
|
||||
&& (i->flags & SEC_EXCLUDE) == 0
|
||||
&& i->output_section != NULL
|
||||
&& i->output_section->owner == link_info.output_bfd)
|
||||
|
@ -13,7 +13,7 @@ fragment <<EOF
|
||||
|
||||
/* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME}
|
||||
Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
||||
Free Software Foundation, Inc.
|
||||
Written by Steve Chamberlain <sac@cygnus.com>
|
||||
ELF support by Ian Lance Taylor <ian@cygnus.com>
|
||||
@ -102,7 +102,7 @@ static void
|
||||
gld${EMULATION_NAME}_before_parse (void)
|
||||
{
|
||||
ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
|
||||
config.dynamic_link = ${DYNAMIC_LINK-TRUE};
|
||||
input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
|
||||
config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
|
||||
}
|
||||
|
||||
@ -121,16 +121,16 @@ gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry)
|
||||
/* Tell the ELF linker that we don't want the output file to have a
|
||||
DT_NEEDED entry for this file, unless it is used to resolve
|
||||
references in a regular object. */
|
||||
if (entry->add_DT_NEEDED_for_regular)
|
||||
if (entry->flags.add_DT_NEEDED_for_regular)
|
||||
link_class = DYN_AS_NEEDED;
|
||||
|
||||
/* Tell the ELF linker that we don't want the output file to have a
|
||||
DT_NEEDED entry for any dynamic library in DT_NEEDED tags from
|
||||
this file at all. */
|
||||
if (!entry->add_DT_NEEDED_for_dynamic)
|
||||
if (!entry->flags.add_DT_NEEDED_for_dynamic)
|
||||
link_class |= DYN_NO_ADD_NEEDED;
|
||||
|
||||
if (entry->just_syms_flag
|
||||
if (entry->flags.just_syms
|
||||
&& (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0)
|
||||
einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"),
|
||||
entry->the_bfd);
|
||||
@ -862,7 +862,7 @@ gld${EMULATION_NAME}_check_needed (lang_input_statement_type *s)
|
||||
return;
|
||||
}
|
||||
|
||||
if (s->search_dirs_flag)
|
||||
if (s->flags.search_dirs)
|
||||
{
|
||||
const char *f = strrchr (s->filename, '/');
|
||||
if (f != NULL
|
||||
@ -1560,7 +1560,7 @@ ${ELF_INTERPRETER_SET_DEFAULT}
|
||||
char *msg;
|
||||
bfd_boolean ret;
|
||||
|
||||
if (is->just_syms_flag)
|
||||
if (is->flags.just_syms)
|
||||
continue;
|
||||
|
||||
s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
|
||||
@ -1621,7 +1621,7 @@ gld${EMULATION_NAME}_open_dynamic_archive
|
||||
const char *filename;
|
||||
char *string;
|
||||
|
||||
if (! entry->maybe_archive)
|
||||
if (! entry->flags.maybe_archive)
|
||||
return FALSE;
|
||||
|
||||
filename = entry->filename;
|
||||
@ -1675,7 +1675,7 @@ gld${EMULATION_NAME}_open_dynamic_archive
|
||||
if (bfd_check_format (entry->the_bfd, bfd_object)
|
||||
&& (entry->the_bfd->flags & DYNAMIC) != 0)
|
||||
{
|
||||
ASSERT (entry->maybe_archive && entry->search_dirs_flag);
|
||||
ASSERT (entry->flags.maybe_archive && entry->flags.search_dirs);
|
||||
|
||||
/* Rather than duplicating the logic above. Just use the
|
||||
filename we recorded earlier. */
|
||||
|
@ -1,6 +1,6 @@
|
||||
# This shell script emits a C file. -*- C -*-
|
||||
# Copyright 1991, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||
# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
# 2005, 2006, 2007, 2008, 2009, 2012 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of the GNU Binutils.
|
||||
#
|
||||
@ -229,7 +229,7 @@ build_section_lists (lang_statement_union_type *statement)
|
||||
{
|
||||
asection *i = statement->input_section.section;
|
||||
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
|
||||
&& (i->flags & SEC_EXCLUDE) == 0
|
||||
&& i->output_section != NULL
|
||||
&& i->output_section->owner == link_info.output_bfd)
|
||||
|
@ -10,7 +10,7 @@ fragment <<EOF
|
||||
|
||||
/* Linux a.out emulation code for ${EMULATION_NAME}
|
||||
Copyright 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002,
|
||||
2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
||||
2003, 2004, 2005, 2007, 2008, 2012 Free Software Foundation, Inc.
|
||||
Written by Steve Chamberlain <sac@cygnus.com>
|
||||
Linux support by Eric Youngdale <ericy@cais.cais.com>
|
||||
|
||||
@ -49,7 +49,7 @@ static void
|
||||
gld${EMULATION_NAME}_before_parse (void)
|
||||
{
|
||||
ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
|
||||
config.dynamic_link = TRUE;
|
||||
input_flags.dynamic = TRUE;
|
||||
config.has_shared = TRUE;
|
||||
}
|
||||
|
||||
@ -62,7 +62,7 @@ gld${EMULATION_NAME}_open_dynamic_archive
|
||||
{
|
||||
char *string;
|
||||
|
||||
if (! entry->maybe_archive)
|
||||
if (! entry->flags.maybe_archive)
|
||||
return FALSE;
|
||||
|
||||
string = (char *) xmalloc (strlen (search->name)
|
||||
|
@ -9,7 +9,8 @@ rm -f e${EMULATION_NAME}.c
|
||||
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
|
||||
fragment <<EOF
|
||||
/* Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
||||
2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
|
||||
2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU Binutils.
|
||||
|
||||
@ -164,7 +165,7 @@ gld_${EMULATION_NAME}_before_parse (void)
|
||||
ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
|
||||
output_filename = "${EXECUTABLE_NAME:-a.exe}";
|
||||
#ifdef DLL_SUPPORT
|
||||
config.dynamic_link = TRUE;
|
||||
input_flags.dynamic = TRUE;
|
||||
config.has_shared = 1;
|
||||
EOF
|
||||
|
||||
@ -2093,7 +2094,7 @@ gld_${EMULATION_NAME}_open_dynamic_archive
|
||||
unsigned int i;
|
||||
|
||||
|
||||
if (! entry->maybe_archive)
|
||||
if (! entry->flags.maybe_archive)
|
||||
return FALSE;
|
||||
|
||||
filename = entry->filename;
|
||||
|
@ -8,7 +8,7 @@ fi
|
||||
rm -f e${EMULATION_NAME}.c
|
||||
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
|
||||
fragment <<EOF
|
||||
/* Copyright 2006, 2007, 2008, 2009, 2010, 2011
|
||||
/* Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
||||
Free Software Foundation, Inc.
|
||||
Written by Kai Tietz, OneVision Software GmbH&CoKg.
|
||||
|
||||
@ -139,7 +139,7 @@ gld_${EMULATION_NAME}_before_parse (void)
|
||||
ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
|
||||
output_filename = "${EXECUTABLE_NAME:-a.exe}";
|
||||
#ifdef DLL_SUPPORT
|
||||
config.dynamic_link = TRUE;
|
||||
input_flags.dynamic = TRUE;
|
||||
config.has_shared = 1;
|
||||
link_info.pei386_auto_import = 1;
|
||||
link_info.pei386_runtime_pseudo_reloc = 2; /* Use by default version 2. */
|
||||
@ -1830,7 +1830,7 @@ gld_${EMULATION_NAME}_open_dynamic_archive
|
||||
unsigned int i;
|
||||
|
||||
|
||||
if (! entry->maybe_archive)
|
||||
if (! entry->flags.maybe_archive)
|
||||
return FALSE;
|
||||
|
||||
filename = entry->filename;
|
||||
|
@ -435,7 +435,7 @@ build_toc_list (lang_statement_union_type *statement)
|
||||
{
|
||||
asection *i = statement->input_section.section;
|
||||
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
|
||||
&& (i->flags & SEC_EXCLUDE) == 0
|
||||
&& i->output_section == toc_section)
|
||||
{
|
||||
@ -453,7 +453,7 @@ build_section_lists (lang_statement_union_type *statement)
|
||||
{
|
||||
asection *i = statement->input_section.section;
|
||||
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
|
||||
&& (i->flags & SEC_EXCLUDE) == 0
|
||||
&& i->output_section != NULL
|
||||
&& i->output_section->owner == link_info.output_bfd)
|
||||
|
@ -1,5 +1,5 @@
|
||||
# This shell script emits a C file. -*- C -*-
|
||||
# Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
# Copyright 2006, 2007, 2008, 2009, 2012 Free Software Foundation, Inc.
|
||||
# Contributed by:
|
||||
# Brain.lin (brain.lin@sunplusct.com)
|
||||
# Mei Ligang (ligang@sunnorth.com.cn)
|
||||
@ -36,7 +36,7 @@ gld${EMULATION_NAME}_before_parse ()
|
||||
#ifndef TARGET_ /* I.e., if not generic. */
|
||||
ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
|
||||
#endif /* not TARGET_ */
|
||||
config.dynamic_link = ${DYNAMIC_LINK-TRUE};
|
||||
input_flags.dynamic = ${DYNAMIC_LINK-TRUE};
|
||||
config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
# This shell script emits a C file. -*- C -*-
|
||||
# Copyright 2006, 2007, 2008, 2009, 2010, 2011
|
||||
# Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of the GNU Binutils.
|
||||
@ -579,7 +579,7 @@ embedded_spu_file (lang_input_statement_type *entry, const char *flags)
|
||||
|
||||
/* Ensure bfd sections are excluded from the output. */
|
||||
bfd_section_list_clear (entry->the_bfd);
|
||||
entry->loaded = TRUE;
|
||||
entry->flags.loaded = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -10,7 +10,8 @@ fragment <<EOF
|
||||
|
||||
/* SunOS emulation code for ${EMULATION_NAME}
|
||||
Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008, 2012
|
||||
Free Software Foundation, Inc.
|
||||
Written by Steve Chamberlain <sac@cygnus.com>
|
||||
SunOS shared library support by Ian Lance Taylor <ian@cygnus.com>
|
||||
|
||||
@ -85,7 +86,7 @@ static void
|
||||
gld${EMULATION_NAME}_before_parse (void)
|
||||
{
|
||||
ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
|
||||
config.dynamic_link = TRUE;
|
||||
input_flags.dynamic = TRUE;
|
||||
config.has_shared = TRUE;
|
||||
}
|
||||
|
||||
@ -156,9 +157,9 @@ gld${EMULATION_NAME}_find_so (lang_input_statement_type *inp)
|
||||
char *alc;
|
||||
struct stat st;
|
||||
|
||||
if (! inp->search_dirs_flag
|
||||
|| ! inp->maybe_archive
|
||||
|| ! inp->dynamic)
|
||||
if (! inp->flags.search_dirs
|
||||
|| ! inp->flags.maybe_archive
|
||||
|| ! inp->flags.dynamic)
|
||||
return;
|
||||
|
||||
ASSERT (CONST_STRNEQ (inp->local_sym_name, "-l"));
|
||||
@ -188,7 +189,7 @@ gld${EMULATION_NAME}_find_so (lang_input_statement_type *inp)
|
||||
|
||||
/* Turn off the search_dirs_flag to prevent ldfile_open_file from
|
||||
searching for this file again. */
|
||||
inp->search_dirs_flag = FALSE;
|
||||
inp->flags.search_dirs = FALSE;
|
||||
|
||||
free (found);
|
||||
|
||||
@ -891,7 +892,7 @@ gld${EMULATION_NAME}_count_need (lang_input_statement_type *inp)
|
||||
{
|
||||
++need_entries;
|
||||
need_size += NEED_ENTRY_SIZE;
|
||||
if (! inp->maybe_archive)
|
||||
if (! inp->flags.maybe_archive)
|
||||
need_size += strlen (inp->filename) + 1;
|
||||
else
|
||||
{
|
||||
@ -919,7 +920,7 @@ gld${EMULATION_NAME}_set_need (lang_input_statement_type *inp)
|
||||
referential locality. */
|
||||
bfd_put_32 (link_info.output_bfd, need_pnames - need_contents,
|
||||
need_pinfo);
|
||||
if (! inp->maybe_archive)
|
||||
if (! inp->flags.maybe_archive)
|
||||
{
|
||||
bfd_put_32 (link_info.output_bfd, (bfd_vma) 0, need_pinfo + 4);
|
||||
bfd_put_16 (link_info.output_bfd, (bfd_vma) 0, need_pinfo + 8);
|
||||
|
@ -1,5 +1,5 @@
|
||||
# This shell script emits a C file. -*- C -*-
|
||||
# Copyright 2010
|
||||
# Copyright 2010, 2012
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of the GNU Binutils.
|
||||
@ -29,7 +29,7 @@ static void
|
||||
gld${EMULATION_NAME}_before_parse (void)
|
||||
{
|
||||
ldfile_set_output_arch ("${ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
|
||||
config.dynamic_link = TRUE;
|
||||
input_flags.dynamic = TRUE;
|
||||
config.has_shared = FALSE; /* Not yet. */
|
||||
}
|
||||
|
||||
@ -54,7 +54,7 @@ gld${EMULATION_NAME}_open_dynamic_archive (const char *arch ATTRIBUTE_UNUSED,
|
||||
{
|
||||
char *string;
|
||||
|
||||
if (! entry->maybe_archive)
|
||||
if (! entry->flags.maybe_archive)
|
||||
return FALSE;
|
||||
|
||||
string = (char *) xmalloc (strlen (search->name)
|
||||
|
3
ld/ld.h
3
ld/ld.h
@ -250,9 +250,6 @@ typedef struct {
|
||||
bfd_boolean magic_demand_paged;
|
||||
bfd_boolean make_executable;
|
||||
|
||||
/* If TRUE, doing a dynamic link. */
|
||||
bfd_boolean dynamic_link;
|
||||
|
||||
/* If TRUE, -shared is supported. */
|
||||
/* ??? A better way to do this is perhaps to define this in the
|
||||
ld_emulation_xfer_struct since this is really a target dependent
|
||||
|
67
ld/ldfile.c
67
ld/ldfile.c
@ -72,27 +72,29 @@ static search_arch_type **search_arch_tail_ptr = &search_arch_head;
|
||||
static bfd_boolean
|
||||
is_sysrooted_pathname (const char *name, bfd_boolean notsame)
|
||||
{
|
||||
char * realname = ld_canon_sysroot ? lrealpath (name) : NULL;
|
||||
char *realname;
|
||||
int len;
|
||||
bfd_boolean result;
|
||||
|
||||
if (! realname)
|
||||
if (ld_canon_sysroot == NULL)
|
||||
return FALSE;
|
||||
|
||||
realname = lrealpath (name);
|
||||
len = strlen (realname);
|
||||
result = FALSE;
|
||||
if (len == ld_canon_sysroot_len)
|
||||
result = !notsame;
|
||||
else if (len > ld_canon_sysroot_len
|
||||
&& IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len]))
|
||||
{
|
||||
result = TRUE;
|
||||
realname[ld_canon_sysroot_len] = '\0';
|
||||
}
|
||||
|
||||
if (((! notsame && len == ld_canon_sysroot_len)
|
||||
|| (len >= ld_canon_sysroot_len
|
||||
&& IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len])
|
||||
&& (realname[ld_canon_sysroot_len] = '\0') == '\0'))
|
||||
&& FILENAME_CMP (ld_canon_sysroot, realname) == 0)
|
||||
result = TRUE;
|
||||
else
|
||||
result = FALSE;
|
||||
|
||||
if (realname)
|
||||
free (realname);
|
||||
if (result)
|
||||
result = FILENAME_CMP (ld_canon_sysroot, realname) == 0;
|
||||
|
||||
free (realname);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -164,7 +166,7 @@ ldfile_try_open_bfd (const char *attempt,
|
||||
checks out compatible, do not exit early returning TRUE, or
|
||||
the plugins will not get a chance to claim the file. */
|
||||
|
||||
if (entry->search_dirs_flag || !entry->dynamic)
|
||||
if (entry->flags.search_dirs || !entry->flags.dynamic)
|
||||
{
|
||||
bfd *check;
|
||||
|
||||
@ -178,7 +180,7 @@ ldfile_try_open_bfd (const char *attempt,
|
||||
if (! bfd_check_format (check, bfd_object))
|
||||
{
|
||||
if (check == entry->the_bfd
|
||||
&& entry->search_dirs_flag
|
||||
&& entry->flags.search_dirs
|
||||
&& bfd_get_error () == bfd_error_file_not_recognized
|
||||
&& ! ldemul_unrecognized_file (entry))
|
||||
{
|
||||
@ -274,7 +276,7 @@ ldfile_try_open_bfd (const char *attempt,
|
||||
goto success;
|
||||
}
|
||||
|
||||
if (!entry->dynamic && (entry->the_bfd->flags & DYNAMIC) != 0)
|
||||
if (!entry->flags.dynamic && (entry->the_bfd->flags & DYNAMIC) != 0)
|
||||
{
|
||||
einfo (_("%F%P: attempted static link of dynamic object `%s'\n"),
|
||||
attempt);
|
||||
@ -283,7 +285,7 @@ ldfile_try_open_bfd (const char *attempt,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (entry->search_dirs_flag
|
||||
if (entry->flags.search_dirs
|
||||
&& !bfd_arch_get_compatible (check, link_info.output_bfd,
|
||||
command_line.accept_unknown_input_arch)
|
||||
/* XCOFF archives can have 32 and 64 bit objects. */
|
||||
@ -348,9 +350,9 @@ ldfile_open_file_search (const char *arch,
|
||||
|
||||
/* If this is not an archive, try to open it in the current
|
||||
directory first. */
|
||||
if (! entry->maybe_archive)
|
||||
if (! entry->flags.maybe_archive)
|
||||
{
|
||||
if (entry->sysrooted && IS_ABSOLUTE_PATH (entry->filename))
|
||||
if (entry->flags.sysrooted && IS_ABSOLUTE_PATH (entry->filename))
|
||||
{
|
||||
char *name = concat (ld_sysroot, entry->filename,
|
||||
(const char *) NULL);
|
||||
@ -363,8 +365,9 @@ ldfile_open_file_search (const char *arch,
|
||||
}
|
||||
else if (ldfile_try_open_bfd (entry->filename, entry))
|
||||
{
|
||||
entry->sysrooted = IS_ABSOLUTE_PATH (entry->filename)
|
||||
&& is_sysrooted_pathname (entry->filename, TRUE);
|
||||
entry->flags.sysrooted
|
||||
= (IS_ABSOLUTE_PATH (entry->filename)
|
||||
&& is_sysrooted_pathname (entry->filename, TRUE));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -376,16 +379,16 @@ ldfile_open_file_search (const char *arch,
|
||||
{
|
||||
char *string;
|
||||
|
||||
if (entry->dynamic && ! link_info.relocatable)
|
||||
if (entry->flags.dynamic && ! link_info.relocatable)
|
||||
{
|
||||
if (ldemul_open_dynamic_archive (arch, search, entry))
|
||||
{
|
||||
entry->sysrooted = search->sysrooted;
|
||||
entry->flags.sysrooted = search->sysrooted;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (entry->maybe_archive)
|
||||
if (entry->flags.maybe_archive)
|
||||
string = concat (search->name, slash, lib, entry->filename,
|
||||
arch, suffix, (const char *) NULL);
|
||||
else
|
||||
@ -395,7 +398,7 @@ ldfile_open_file_search (const char *arch,
|
||||
if (ldfile_try_open_bfd (string, entry))
|
||||
{
|
||||
entry->filename = string;
|
||||
entry->sysrooted = search->sysrooted;
|
||||
entry->flags.sysrooted = search->sysrooted;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -416,7 +419,7 @@ ldfile_open_file (lang_input_statement_type *entry)
|
||||
if (entry->the_bfd != NULL)
|
||||
return;
|
||||
|
||||
if (! entry->search_dirs_flag)
|
||||
if (! entry->flags.search_dirs)
|
||||
{
|
||||
if (ldfile_try_open_bfd (entry->filename, entry))
|
||||
return;
|
||||
@ -427,8 +430,8 @@ ldfile_open_file (lang_input_statement_type *entry)
|
||||
else
|
||||
einfo (_("%P: cannot find %s: %E\n"), entry->local_sym_name);
|
||||
|
||||
entry->missing_file = TRUE;
|
||||
missing_file = TRUE;
|
||||
entry->flags.missing_file = TRUE;
|
||||
input_flags.missing_file = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -454,18 +457,18 @@ ldfile_open_file (lang_input_statement_type *entry)
|
||||
/* If we have found the file, we don't need to search directories
|
||||
again. */
|
||||
if (found)
|
||||
entry->search_dirs_flag = FALSE;
|
||||
entry->flags.search_dirs = FALSE;
|
||||
else
|
||||
{
|
||||
if (entry->sysrooted
|
||||
if (entry->flags.sysrooted
|
||||
&& ld_sysroot
|
||||
&& IS_ABSOLUTE_PATH (entry->local_sym_name))
|
||||
einfo (_("%P: cannot find %s inside %s\n"),
|
||||
entry->local_sym_name, ld_sysroot);
|
||||
else
|
||||
einfo (_("%P: cannot find %s\n"), entry->local_sym_name);
|
||||
entry->missing_file = TRUE;
|
||||
missing_file = TRUE;
|
||||
entry->flags.missing_file = TRUE;
|
||||
input_flags.missing_file = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
15
ld/ldgram.y
15
ld/ldgram.y
@ -386,17 +386,20 @@ input_list:
|
||||
{ lang_add_input_file($2,lang_input_file_is_l_enum,
|
||||
(char *)NULL); }
|
||||
| AS_NEEDED '('
|
||||
{ $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
|
||||
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
|
||||
input_flags.add_DT_NEEDED_for_regular = TRUE; }
|
||||
input_list ')'
|
||||
{ add_DT_NEEDED_for_regular = $<integer>3; }
|
||||
{ input_flags.add_DT_NEEDED_for_regular = $<integer>3; }
|
||||
| input_list ',' AS_NEEDED '('
|
||||
{ $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
|
||||
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
|
||||
input_flags.add_DT_NEEDED_for_regular = TRUE; }
|
||||
input_list ')'
|
||||
{ add_DT_NEEDED_for_regular = $<integer>5; }
|
||||
{ input_flags.add_DT_NEEDED_for_regular = $<integer>5; }
|
||||
| input_list AS_NEEDED '('
|
||||
{ $<integer>$ = add_DT_NEEDED_for_regular; add_DT_NEEDED_for_regular = TRUE; }
|
||||
{ $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
|
||||
input_flags.add_DT_NEEDED_for_regular = TRUE; }
|
||||
input_list ')'
|
||||
{ add_DT_NEEDED_for_regular = $<integer>4; }
|
||||
{ input_flags.add_DT_NEEDED_for_regular = $<integer>4; }
|
||||
;
|
||||
|
||||
sections:
|
||||
|
149
ld/ldlang.c
149
ld/ldlang.c
@ -69,7 +69,6 @@ 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];
|
||||
static struct unique_sections *unique_section_list;
|
||||
static bfd_boolean ldlang_sysrooted_script = FALSE;
|
||||
|
||||
/* Forward declarations. */
|
||||
static void exp_init_os (etree_type *);
|
||||
@ -100,6 +99,7 @@ lang_statement_list_type file_chain = { NULL, NULL };
|
||||
lang_statement_list_type input_file_chain;
|
||||
struct bfd_sym_chain entry_symbol = { NULL, NULL };
|
||||
const char *entry_section = ".text";
|
||||
struct lang_input_statement_flags input_flags;
|
||||
bfd_boolean entry_from_cmdline;
|
||||
bfd_boolean undef_from_cmdline;
|
||||
bfd_boolean lang_has_input_file = FALSE;
|
||||
@ -108,7 +108,6 @@ bfd_boolean lang_float_flag = FALSE;
|
||||
bfd_boolean delete_output_file_on_failure = FALSE;
|
||||
struct lang_phdr *lang_phdr_list;
|
||||
struct lang_nocrossrefs *nocrossref_list;
|
||||
bfd_boolean missing_file = FALSE;
|
||||
|
||||
/* Functions that traverse the linker script and might evaluate
|
||||
DEFINED() need to increment this. */
|
||||
@ -731,7 +730,7 @@ walk_wild_section (lang_wild_statement_type *ptr,
|
||||
callback_t callback,
|
||||
void *data)
|
||||
{
|
||||
if (file->just_syms_flag)
|
||||
if (file->flags.just_syms)
|
||||
return;
|
||||
|
||||
(*ptr->walk_wild_section_handler) (ptr, file, callback, data);
|
||||
@ -1046,6 +1045,8 @@ new_afile (const char *name,
|
||||
{
|
||||
lang_input_statement_type *p;
|
||||
|
||||
lang_has_input_file = TRUE;
|
||||
|
||||
if (add_to_list)
|
||||
p = (lang_input_statement_type *) new_stat (lang_input_statement, stat_ptr);
|
||||
else
|
||||
@ -1056,9 +1057,13 @@ new_afile (const char *name,
|
||||
p->header.next = NULL;
|
||||
}
|
||||
|
||||
lang_has_input_file = TRUE;
|
||||
memset (&p->the_bfd, 0,
|
||||
sizeof (*p) - offsetof (lang_input_statement_type, the_bfd));
|
||||
p->target = target;
|
||||
p->sysrooted = FALSE;
|
||||
p->flags.dynamic = input_flags.dynamic;
|
||||
p->flags.add_DT_NEEDED_for_dynamic = input_flags.add_DT_NEEDED_for_dynamic;
|
||||
p->flags.add_DT_NEEDED_for_regular = input_flags.add_DT_NEEDED_for_regular;
|
||||
p->flags.whole_archive = input_flags.whole_archive;
|
||||
|
||||
if (file_type == lang_input_file_is_l_enum
|
||||
&& name[0] == ':' && name[1] != '\0')
|
||||
@ -1071,70 +1076,41 @@ new_afile (const char *name,
|
||||
{
|
||||
case lang_input_file_is_symbols_only_enum:
|
||||
p->filename = name;
|
||||
p->maybe_archive = FALSE;
|
||||
p->real = TRUE;
|
||||
p->local_sym_name = name;
|
||||
p->just_syms_flag = TRUE;
|
||||
p->search_dirs_flag = FALSE;
|
||||
p->flags.real = TRUE;
|
||||
p->flags.just_syms = TRUE;
|
||||
break;
|
||||
case lang_input_file_is_fake_enum:
|
||||
p->filename = name;
|
||||
p->maybe_archive = FALSE;
|
||||
p->real = FALSE;
|
||||
p->local_sym_name = name;
|
||||
p->just_syms_flag = FALSE;
|
||||
p->search_dirs_flag = FALSE;
|
||||
break;
|
||||
case lang_input_file_is_l_enum:
|
||||
p->maybe_archive = TRUE;
|
||||
p->filename = name;
|
||||
p->real = TRUE;
|
||||
p->local_sym_name = concat ("-l", name, (const char *) NULL);
|
||||
p->just_syms_flag = FALSE;
|
||||
p->search_dirs_flag = TRUE;
|
||||
p->flags.maybe_archive = TRUE;
|
||||
p->flags.real = TRUE;
|
||||
p->flags.search_dirs = TRUE;
|
||||
break;
|
||||
case lang_input_file_is_marker_enum:
|
||||
p->filename = name;
|
||||
p->maybe_archive = FALSE;
|
||||
p->real = FALSE;
|
||||
p->local_sym_name = name;
|
||||
p->just_syms_flag = FALSE;
|
||||
p->search_dirs_flag = TRUE;
|
||||
p->flags.search_dirs = TRUE;
|
||||
break;
|
||||
case lang_input_file_is_search_file_enum:
|
||||
p->sysrooted = ldlang_sysrooted_script;
|
||||
p->filename = name;
|
||||
p->maybe_archive = FALSE;
|
||||
p->real = TRUE;
|
||||
p->local_sym_name = name;
|
||||
p->just_syms_flag = FALSE;
|
||||
p->search_dirs_flag = TRUE;
|
||||
p->flags.real = TRUE;
|
||||
p->flags.search_dirs = TRUE;
|
||||
p->flags.sysrooted = input_flags.sysrooted;
|
||||
break;
|
||||
case lang_input_file_is_file_enum:
|
||||
p->filename = name;
|
||||
p->maybe_archive = FALSE;
|
||||
p->real = TRUE;
|
||||
p->local_sym_name = name;
|
||||
p->just_syms_flag = FALSE;
|
||||
p->search_dirs_flag = FALSE;
|
||||
p->flags.real = TRUE;
|
||||
break;
|
||||
default:
|
||||
FAIL ();
|
||||
}
|
||||
p->the_bfd = NULL;
|
||||
p->next_real_file = NULL;
|
||||
p->next = NULL;
|
||||
p->dynamic = config.dynamic_link;
|
||||
p->add_DT_NEEDED_for_dynamic = add_DT_NEEDED_for_dynamic;
|
||||
p->add_DT_NEEDED_for_regular = add_DT_NEEDED_for_regular;
|
||||
p->whole_archive = whole_archive;
|
||||
p->loaded = FALSE;
|
||||
p->missing_file = FALSE;
|
||||
#ifdef ENABLE_PLUGINS
|
||||
p->claimed = FALSE;
|
||||
p->claim_archive = FALSE;
|
||||
p->reload = FALSE;
|
||||
#endif /* ENABLE_PLUGINS */
|
||||
|
||||
lang_statement_append (&input_file_chain,
|
||||
(lang_statement_union_type *) p,
|
||||
@ -2012,7 +1988,7 @@ lang_map (void)
|
||||
asection *s;
|
||||
|
||||
if ((file->the_bfd->flags & (BFD_LINKER_CREATED | DYNAMIC)) != 0
|
||||
|| file->just_syms_flag)
|
||||
|| file->flags.just_syms)
|
||||
continue;
|
||||
|
||||
for (s = file->the_bfd->sections; s != NULL; s = s->next)
|
||||
@ -2234,7 +2210,7 @@ section_already_linked (bfd *abfd, asection *sec, void *data)
|
||||
|
||||
/* If we are only reading symbols from this object, then we want to
|
||||
discard all sections. */
|
||||
if (entry->just_syms_flag)
|
||||
if (entry->flags.just_syms)
|
||||
{
|
||||
bfd_link_just_syms (abfd, sec, &link_info);
|
||||
return;
|
||||
@ -2619,7 +2595,7 @@ lookup_name (const char *name)
|
||||
|
||||
/* If we have already added this file, or this file is not real
|
||||
don't add this file. */
|
||||
if (search->loaded || !search->real)
|
||||
if (search->flags.loaded || !search->flags.real)
|
||||
return search;
|
||||
|
||||
if (! load_symbols (search, NULL))
|
||||
@ -2697,23 +2673,20 @@ load_symbols (lang_input_statement_type *entry,
|
||||
{
|
||||
char **matching;
|
||||
|
||||
if (entry->loaded)
|
||||
if (entry->flags.loaded)
|
||||
return TRUE;
|
||||
|
||||
ldfile_open_file (entry);
|
||||
|
||||
/* Do not process further if the file was missing. */
|
||||
if (entry->missing_file)
|
||||
if (entry->flags.missing_file)
|
||||
return TRUE;
|
||||
|
||||
if (! bfd_check_format (entry->the_bfd, bfd_archive)
|
||||
&& ! bfd_check_format_matches (entry->the_bfd, bfd_object, &matching))
|
||||
{
|
||||
bfd_error_type err;
|
||||
bfd_boolean save_ldlang_sysrooted_script;
|
||||
bfd_boolean save_add_DT_NEEDED_for_regular;
|
||||
bfd_boolean save_add_DT_NEEDED_for_dynamic;
|
||||
bfd_boolean save_whole_archive;
|
||||
struct lang_input_statement_flags save_flags;
|
||||
|
||||
err = bfd_get_error ();
|
||||
|
||||
@ -2739,30 +2712,26 @@ load_symbols (lang_input_statement_type *entry,
|
||||
entry->the_bfd = NULL;
|
||||
|
||||
/* Try to interpret the file as a linker script. */
|
||||
save_flags = input_flags;
|
||||
ldfile_open_command_file (entry->filename);
|
||||
|
||||
push_stat_ptr (place);
|
||||
save_ldlang_sysrooted_script = ldlang_sysrooted_script;
|
||||
ldlang_sysrooted_script = entry->sysrooted;
|
||||
save_add_DT_NEEDED_for_regular = add_DT_NEEDED_for_regular;
|
||||
add_DT_NEEDED_for_regular = entry->add_DT_NEEDED_for_regular;
|
||||
save_add_DT_NEEDED_for_dynamic = add_DT_NEEDED_for_dynamic;
|
||||
add_DT_NEEDED_for_dynamic = entry->add_DT_NEEDED_for_dynamic;
|
||||
save_whole_archive = whole_archive;
|
||||
whole_archive = entry->whole_archive;
|
||||
input_flags.sysrooted = entry->flags.sysrooted;
|
||||
input_flags.add_DT_NEEDED_for_regular
|
||||
= entry->flags.add_DT_NEEDED_for_regular;
|
||||
input_flags.add_DT_NEEDED_for_dynamic
|
||||
= entry->flags.add_DT_NEEDED_for_dynamic;
|
||||
input_flags.whole_archive = entry->flags.whole_archive;
|
||||
input_flags.dynamic = entry->flags.dynamic;
|
||||
|
||||
ldfile_assumed_script = TRUE;
|
||||
parser_input = input_script;
|
||||
/* We want to use the same -Bdynamic/-Bstatic as the one for
|
||||
ENTRY. */
|
||||
config.dynamic_link = entry->dynamic;
|
||||
yyparse ();
|
||||
ldfile_assumed_script = FALSE;
|
||||
|
||||
ldlang_sysrooted_script = save_ldlang_sysrooted_script;
|
||||
add_DT_NEEDED_for_regular = save_add_DT_NEEDED_for_regular;
|
||||
add_DT_NEEDED_for_dynamic = save_add_DT_NEEDED_for_dynamic;
|
||||
whole_archive = save_whole_archive;
|
||||
/* missing_file is sticky. */
|
||||
save_flags.missing_file |= input_flags.missing_file;
|
||||
input_flags = save_flags;
|
||||
pop_stat_ptr ();
|
||||
|
||||
return TRUE;
|
||||
@ -2782,7 +2751,7 @@ load_symbols (lang_input_statement_type *entry,
|
||||
|
||||
case bfd_object:
|
||||
#ifdef ENABLE_PLUGINS
|
||||
if (!entry->reload)
|
||||
if (!entry->flags.reload)
|
||||
#endif
|
||||
ldlang_add_file (entry);
|
||||
if (trace_files || trace_file_tries)
|
||||
@ -2792,7 +2761,7 @@ load_symbols (lang_input_statement_type *entry,
|
||||
case bfd_archive:
|
||||
check_excluded_libs (entry->the_bfd);
|
||||
|
||||
if (entry->whole_archive)
|
||||
if (entry->flags.whole_archive)
|
||||
{
|
||||
bfd *member = NULL;
|
||||
bfd_boolean loaded = TRUE;
|
||||
@ -2827,18 +2796,18 @@ load_symbols (lang_input_statement_type *entry,
|
||||
}
|
||||
}
|
||||
|
||||
entry->loaded = loaded;
|
||||
entry->flags.loaded = loaded;
|
||||
return loaded;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (bfd_link_add_symbols (entry->the_bfd, &link_info))
|
||||
entry->loaded = TRUE;
|
||||
entry->flags.loaded = TRUE;
|
||||
else
|
||||
einfo (_("%F%B: could not read symbols: %E\n"), entry->the_bfd);
|
||||
|
||||
return entry->loaded;
|
||||
return entry->flags.loaded;
|
||||
}
|
||||
|
||||
/* Handle a wild statement. S->FILENAME or S->SECTION_LIST or both
|
||||
@ -3022,7 +2991,7 @@ get_first_input_target (void)
|
||||
LANG_FOR_EACH_INPUT_STATEMENT (s)
|
||||
{
|
||||
if (s->header.type == lang_input_statement_enum
|
||||
&& s->real)
|
||||
&& s->flags.real)
|
||||
{
|
||||
ldfile_open_file (s);
|
||||
|
||||
@ -3255,7 +3224,7 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode)
|
||||
current_target = s->target_statement.target;
|
||||
break;
|
||||
case lang_input_statement_enum:
|
||||
if (s->input_statement.real)
|
||||
if (s->input_statement.flags.real)
|
||||
{
|
||||
lang_statement_union_type **os_tail;
|
||||
lang_statement_list_type add;
|
||||
@ -3271,22 +3240,22 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode)
|
||||
&& ((mode & OPEN_BFD_RESCAN) == 0
|
||||
|| plugin_insert == NULL)
|
||||
#endif
|
||||
&& !s->input_statement.whole_archive
|
||||
&& s->input_statement.loaded
|
||||
&& !s->input_statement.flags.whole_archive
|
||||
&& s->input_statement.flags.loaded
|
||||
&& bfd_check_format (s->input_statement.the_bfd,
|
||||
bfd_archive))
|
||||
s->input_statement.loaded = FALSE;
|
||||
s->input_statement.flags.loaded = FALSE;
|
||||
#ifdef ENABLE_PLUGINS
|
||||
/* When rescanning, reload --as-needed shared libs. */
|
||||
else if ((mode & OPEN_BFD_RESCAN) != 0
|
||||
&& plugin_insert == NULL
|
||||
&& s->input_statement.loaded
|
||||
&& s->input_statement.add_DT_NEEDED_for_regular
|
||||
&& s->input_statement.flags.loaded
|
||||
&& s->input_statement.flags.add_DT_NEEDED_for_regular
|
||||
&& ((s->input_statement.the_bfd->flags) & DYNAMIC) != 0
|
||||
&& plugin_should_reload (s->input_statement.the_bfd))
|
||||
{
|
||||
s->input_statement.loaded = FALSE;
|
||||
s->input_statement.reload = TRUE;
|
||||
s->input_statement.flags.loaded = FALSE;
|
||||
s->input_statement.flags.reload = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -3337,7 +3306,7 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode)
|
||||
}
|
||||
|
||||
/* Exit if any of the files were missing. */
|
||||
if (missing_file)
|
||||
if (input_flags.missing_file)
|
||||
einfo ("%F");
|
||||
}
|
||||
|
||||
@ -4648,7 +4617,7 @@ size_input_section
|
||||
lang_input_section_type *is = &((*this_ptr)->input_section);
|
||||
asection *i = is->section;
|
||||
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
|
||||
&& (i->flags & SEC_EXCLUDE) == 0)
|
||||
{
|
||||
bfd_size_type alignment_needed;
|
||||
@ -5819,7 +5788,7 @@ lang_check (void)
|
||||
{
|
||||
#ifdef ENABLE_PLUGINS
|
||||
/* Don't check format of files claimed by plugin. */
|
||||
if (file->input_statement.claimed)
|
||||
if (file->input_statement.flags.claimed)
|
||||
continue;
|
||||
#endif /* ENABLE_PLUGINS */
|
||||
input_bfd = file->input_statement.the_bfd;
|
||||
@ -6022,7 +5991,7 @@ lang_place_orphans (void)
|
||||
/* This section of the file is not attached, root
|
||||
around for a sensible place for it to go. */
|
||||
|
||||
if (file->just_syms_flag)
|
||||
if (file->flags.just_syms)
|
||||
bfd_link_just_syms (file->the_bfd, s, &link_info);
|
||||
else if ((s->flags & SEC_EXCLUDE) != 0)
|
||||
s->output_section = bfd_abs_section_ptr;
|
||||
@ -6334,7 +6303,7 @@ lang_gc_sections (void)
|
||||
{
|
||||
asection *sec;
|
||||
#ifdef ENABLE_PLUGINS
|
||||
if (f->claimed)
|
||||
if (f->flags.claimed)
|
||||
continue;
|
||||
#endif
|
||||
for (sec = f->the_bfd->sections; sec != NULL; sec = sec->next)
|
||||
@ -6499,8 +6468,8 @@ find_replacements_insert_point (void)
|
||||
claim1 != NULL;
|
||||
claim1 = &claim1->next->input_statement)
|
||||
{
|
||||
if (claim1->claimed)
|
||||
return claim1->claim_archive ? lastobject : claim1;
|
||||
if (claim1->flags.claimed)
|
||||
return claim1->flags.claim_archive ? lastobject : claim1;
|
||||
/* Update lastobject if this is a real object file. */
|
||||
if (claim1->the_bfd && (claim1->the_bfd->my_archive == NULL))
|
||||
lastobject = claim1;
|
||||
@ -6911,7 +6880,7 @@ lang_startup (const char *name)
|
||||
}
|
||||
first_file->filename = name;
|
||||
first_file->local_sym_name = name;
|
||||
first_file->real = TRUE;
|
||||
first_file->flags.real = TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
|
65
ld/ldlang.h
65
ld/ldlang.h
@ -1,6 +1,6 @@
|
||||
/* ldlang.h - linker command language support
|
||||
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU Binutils.
|
||||
@ -228,36 +228,16 @@ typedef struct
|
||||
bfd_vma output_offset;
|
||||
} lang_reloc_statement_type;
|
||||
|
||||
typedef struct lang_input_statement_struct
|
||||
struct lang_input_statement_flags
|
||||
{
|
||||
lang_statement_header_type header;
|
||||
/* Name of this file. */
|
||||
const char *filename;
|
||||
/* Name to use for the symbol giving address of text start.
|
||||
Usually the same as filename, but for a file spec'd with
|
||||
-l this is the -l switch itself rather than the filename. */
|
||||
const char *local_sym_name;
|
||||
|
||||
bfd *the_bfd;
|
||||
|
||||
struct flag_info *section_flag_list;
|
||||
|
||||
/* Point to the next file - whatever it is, wanders up and down
|
||||
archives */
|
||||
union lang_statement_union *next;
|
||||
|
||||
/* Point to the next file, but skips archive contents. */
|
||||
union lang_statement_union *next_real_file;
|
||||
|
||||
const char *target;
|
||||
|
||||
/* 1 means this file was specified in a -l option. */
|
||||
unsigned int maybe_archive : 1;
|
||||
|
||||
/* 1 means search a set of directories for this file. */
|
||||
unsigned int search_dirs_flag : 1;
|
||||
unsigned int search_dirs : 1;
|
||||
|
||||
/* 1 means this was found in a search directory marked as sysrooted,
|
||||
if search_dirs_flag is false, otherwise, that it should be
|
||||
if search_dirs is false, otherwise, that it should be
|
||||
searched in ld_sysroot before any other location, as long as it
|
||||
starts with a slash. */
|
||||
unsigned int sysrooted : 1;
|
||||
@ -265,7 +245,7 @@ typedef struct lang_input_statement_struct
|
||||
/* 1 means this is base file of incremental load.
|
||||
Do not load this file's text or data.
|
||||
Also default text_start to after this file's bss. */
|
||||
unsigned int just_syms_flag : 1;
|
||||
unsigned int just_syms : 1;
|
||||
|
||||
/* Whether to search for this entry as a dynamic archive. */
|
||||
unsigned int dynamic : 1;
|
||||
@ -300,7 +280,32 @@ typedef struct lang_input_statement_struct
|
||||
/* Set if reloading an --as-needed lib. */
|
||||
unsigned int reload : 1;
|
||||
#endif /* ENABLE_PLUGINS */
|
||||
};
|
||||
|
||||
typedef struct lang_input_statement_struct
|
||||
{
|
||||
lang_statement_header_type header;
|
||||
/* Name of this file. */
|
||||
const char *filename;
|
||||
/* Name to use for the symbol giving address of text start.
|
||||
Usually the same as filename, but for a file spec'd with
|
||||
-l this is the -l switch itself rather than the filename. */
|
||||
const char *local_sym_name;
|
||||
|
||||
bfd *the_bfd;
|
||||
|
||||
struct flag_info *section_flag_list;
|
||||
|
||||
/* Point to the next file - whatever it is, wanders up and down
|
||||
archives */
|
||||
union lang_statement_union *next;
|
||||
|
||||
/* Point to the next file, but skips archive contents. */
|
||||
union lang_statement_union *next_real_file;
|
||||
|
||||
const char *target;
|
||||
|
||||
struct lang_input_statement_flags flags;
|
||||
} lang_input_statement_type;
|
||||
|
||||
typedef struct
|
||||
@ -416,8 +421,6 @@ struct lang_phdr
|
||||
etree_type *flags;
|
||||
};
|
||||
|
||||
extern struct lang_phdr *lang_phdr_list;
|
||||
|
||||
/* This structure is used to hold a list of sections which may not
|
||||
cross reference each other. */
|
||||
|
||||
@ -435,8 +438,6 @@ struct lang_nocrossrefs
|
||||
lang_nocrossref_type *list;
|
||||
};
|
||||
|
||||
extern struct lang_nocrossrefs *nocrossref_list;
|
||||
|
||||
/* This structure is used to hold a list of input section names which
|
||||
will not match an output section in the linker script. */
|
||||
|
||||
@ -467,9 +468,12 @@ struct orphan_save
|
||||
lang_output_section_statement_type **os_tail;
|
||||
};
|
||||
|
||||
extern struct lang_phdr *lang_phdr_list;
|
||||
extern struct lang_nocrossrefs *nocrossref_list;
|
||||
extern const char *output_target;
|
||||
extern lang_output_section_statement_type *abs_output_section;
|
||||
extern lang_statement_list_type lang_output_section_statement;
|
||||
extern struct lang_input_statement_flags input_flags;
|
||||
extern bfd_boolean lang_has_input_file;
|
||||
extern etree_type *base;
|
||||
extern lang_statement_list_type *stat_ptr;
|
||||
@ -482,7 +486,6 @@ extern lang_statement_list_type file_chain;
|
||||
extern lang_statement_list_type input_file_chain;
|
||||
|
||||
extern int lang_statement_iteration;
|
||||
extern bfd_boolean missing_file;
|
||||
|
||||
extern void lang_init
|
||||
(void);
|
||||
|
16
ld/ldmain.c
16
ld/ldmain.c
@ -95,18 +95,6 @@ bfd_boolean trace_file_tries;
|
||||
instead of complaining if no input files are given. */
|
||||
bfd_boolean version_printed;
|
||||
|
||||
/* Nonzero means link in every member of an archive. */
|
||||
bfd_boolean whole_archive;
|
||||
|
||||
/* True means only create DT_NEEDED entries for dynamic libraries
|
||||
if they actually satisfy some reference in a regular object. */
|
||||
bfd_boolean add_DT_NEEDED_for_regular;
|
||||
|
||||
/* True means create DT_NEEDED entries for dynamic libraries that
|
||||
are DT_NEEDED by dynamic libraries specifically mentioned on
|
||||
the command line. */
|
||||
bfd_boolean add_DT_NEEDED_for_dynamic;
|
||||
|
||||
/* TRUE if we should demangle symbol names. */
|
||||
bfd_boolean demangling;
|
||||
|
||||
@ -767,9 +755,9 @@ add_archive_element (struct bfd_link_info *info,
|
||||
file.filesize = arelt_size (abfd);
|
||||
file.fd = fd;
|
||||
plugin_maybe_claim (&file, input);
|
||||
if (input->claimed)
|
||||
if (input->flags.claimed)
|
||||
{
|
||||
input->claim_archive = TRUE;
|
||||
input->flags.claim_archive = TRUE;
|
||||
*subsbfd = input->the_bfd;
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* ldmain.h -
|
||||
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2002, 2003, 2004,
|
||||
2005, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
2005, 2007, 2008, 2009, 2012 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU Binutils.
|
||||
|
||||
@ -33,9 +33,6 @@ extern char *default_target;
|
||||
extern bfd_boolean trace_files;
|
||||
extern bfd_boolean trace_file_tries;
|
||||
extern bfd_boolean version_printed;
|
||||
extern bfd_boolean whole_archive;
|
||||
extern bfd_boolean add_DT_NEEDED_for_regular;
|
||||
extern bfd_boolean add_DT_NEEDED_for_dynamic;
|
||||
extern bfd_boolean demangling;
|
||||
extern int g_switch_value;
|
||||
extern const char *output_filename;
|
||||
|
@ -241,7 +241,7 @@ build_link_order (lang_statement_union_type *statement)
|
||||
attached */
|
||||
asection *i = statement->input_section.section;
|
||||
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
|
||||
if (!((lang_input_statement_type *) i->owner->usrdata)->flags.just_syms
|
||||
&& (i->flags & SEC_EXCLUDE) == 0)
|
||||
{
|
||||
asection *output_section = i->output_section;
|
||||
|
30
ld/lexsup.c
30
ld/lexsup.c
@ -775,10 +775,10 @@ parse_args (unsigned argc, char **argv)
|
||||
``use only shared libraries'' but, then, we don't
|
||||
currently support shared libraries on HP/UX anyhow. */
|
||||
if (strcmp (optarg, "archive") == 0)
|
||||
config.dynamic_link = FALSE;
|
||||
input_flags.dynamic = FALSE;
|
||||
else if (strcmp (optarg, "shared") == 0
|
||||
|| strcmp (optarg, "default") == 0)
|
||||
config.dynamic_link = TRUE;
|
||||
input_flags.dynamic = TRUE;
|
||||
else
|
||||
einfo (_("%P%F: unrecognized -a option `%s'\n"), optarg);
|
||||
break;
|
||||
@ -807,10 +807,10 @@ parse_args (unsigned argc, char **argv)
|
||||
yyparse ();
|
||||
break;
|
||||
case OPTION_CALL_SHARED:
|
||||
config.dynamic_link = TRUE;
|
||||
input_flags.dynamic = TRUE;
|
||||
break;
|
||||
case OPTION_NON_SHARED:
|
||||
config.dynamic_link = FALSE;
|
||||
input_flags.dynamic = FALSE;
|
||||
break;
|
||||
case OPTION_CREF:
|
||||
command_line.cref = TRUE;
|
||||
@ -934,17 +934,17 @@ parse_args (unsigned argc, char **argv)
|
||||
case 'N':
|
||||
config.text_read_only = FALSE;
|
||||
config.magic_demand_paged = FALSE;
|
||||
config.dynamic_link = FALSE;
|
||||
input_flags.dynamic = FALSE;
|
||||
break;
|
||||
case OPTION_NO_OMAGIC:
|
||||
config.text_read_only = TRUE;
|
||||
config.magic_demand_paged = TRUE;
|
||||
/* NB/ Does not set dynamic_link to TRUE.
|
||||
/* NB/ Does not set input_flags.dynamic to TRUE.
|
||||
Use --call-shared or -Bdynamic for this. */
|
||||
break;
|
||||
case 'n':
|
||||
config.magic_demand_paged = FALSE;
|
||||
config.dynamic_link = FALSE;
|
||||
input_flags.dynamic = FALSE;
|
||||
break;
|
||||
case OPTION_NO_DEFINE_COMMON:
|
||||
command_line.inhibit_common_definition = TRUE;
|
||||
@ -1040,7 +1040,7 @@ parse_args (unsigned argc, char **argv)
|
||||
config.only_cmd_line_lib_dirs = TRUE;
|
||||
break;
|
||||
case OPTION_NO_WHOLE_ARCHIVE:
|
||||
whole_archive = FALSE;
|
||||
input_flags.whole_archive = FALSE;
|
||||
break;
|
||||
case 'O':
|
||||
/* FIXME "-O<non-digits> <value>" used to set the address of
|
||||
@ -1092,7 +1092,7 @@ parse_args (unsigned argc, char **argv)
|
||||
config.build_constructors = FALSE;
|
||||
config.magic_demand_paged = FALSE;
|
||||
config.text_read_only = FALSE;
|
||||
config.dynamic_link = FALSE;
|
||||
input_flags.dynamic = FALSE;
|
||||
break;
|
||||
case 'R':
|
||||
/* The GNU linker traditionally uses -R to mean to include
|
||||
@ -1313,7 +1313,7 @@ parse_args (unsigned argc, char **argv)
|
||||
config.build_constructors = TRUE;
|
||||
config.magic_demand_paged = FALSE;
|
||||
config.text_read_only = FALSE;
|
||||
config.dynamic_link = FALSE;
|
||||
input_flags.dynamic = FALSE;
|
||||
break;
|
||||
case 'u':
|
||||
ldlang_add_undef (optarg, TRUE);
|
||||
@ -1437,19 +1437,19 @@ parse_args (unsigned argc, char **argv)
|
||||
link_info.warn_alternate_em = TRUE;
|
||||
break;
|
||||
case OPTION_WHOLE_ARCHIVE:
|
||||
whole_archive = TRUE;
|
||||
input_flags.whole_archive = TRUE;
|
||||
break;
|
||||
case OPTION_ADD_DT_NEEDED_FOR_DYNAMIC:
|
||||
add_DT_NEEDED_for_dynamic = TRUE;
|
||||
input_flags.add_DT_NEEDED_for_dynamic = TRUE;
|
||||
break;
|
||||
case OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC:
|
||||
add_DT_NEEDED_for_dynamic = FALSE;
|
||||
input_flags.add_DT_NEEDED_for_dynamic = FALSE;
|
||||
break;
|
||||
case OPTION_ADD_DT_NEEDED_FOR_REGULAR:
|
||||
add_DT_NEEDED_for_regular = TRUE;
|
||||
input_flags.add_DT_NEEDED_for_regular = TRUE;
|
||||
break;
|
||||
case OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR:
|
||||
add_DT_NEEDED_for_regular = FALSE;
|
||||
input_flags.add_DT_NEEDED_for_regular = FALSE;
|
||||
break;
|
||||
case OPTION_WRAP:
|
||||
add_wrap (optarg);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Plugin control for the GNU linker.
|
||||
Copyright 2010, 2011 Free Software Foundation, Inc.
|
||||
Copyright 2010, 2011, 2012 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU Binutils.
|
||||
|
||||
@ -262,7 +262,7 @@ is_ir_dummy_bfd (const bfd *abfd)
|
||||
when processing DT_NEEDED dependencies. */
|
||||
return (abfd
|
||||
&& abfd->usrdata
|
||||
&& ((lang_input_statement_type *)(abfd->usrdata))->claimed);
|
||||
&& ((lang_input_statement_type *)(abfd->usrdata))->flags.claimed);
|
||||
}
|
||||
|
||||
/* Helpers to convert between BFD and GOLD symbol formats. */
|
||||
@ -873,7 +873,7 @@ plugin_maybe_claim (struct ld_plugin_input_file *file,
|
||||
if (entry->the_bfd->my_archive == NULL)
|
||||
bfd_close (entry->the_bfd);
|
||||
entry->the_bfd = file->handle;
|
||||
entry->claimed = TRUE;
|
||||
entry->flags.claimed = TRUE;
|
||||
bfd_make_readable (entry->the_bfd);
|
||||
}
|
||||
else
|
||||
@ -881,7 +881,7 @@ plugin_maybe_claim (struct ld_plugin_input_file *file,
|
||||
/* If plugin didn't claim the file, we don't need the dummy bfd.
|
||||
Can't avoid speculatively creating it, alas. */
|
||||
bfd_close_all_done (file->handle);
|
||||
entry->claimed = FALSE;
|
||||
entry->flags.claimed = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user