projects
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add x86_64-mingw64 target
[binutils-gdb.git]
/
ld
/
ldmain.c
diff --git
a/ld/ldmain.c
b/ld/ldmain.c
index 4a767bc51ede7522de8fc7893814bae5d1429bab..bc03e0274357179a7d0d0eb39e269eb57f8b255a 100644
(file)
--- a/
ld/ldmain.c
+++ b/
ld/ldmain.c
@@
-1,6
+1,6
@@
/* Main program of GNU linker.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
/* Main program of GNU linker.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- 2002, 2003, 2004
+ 2002, 2003, 2004
, 2005, 2006
Free Software Foundation, Inc.
Written by Steve Chamberlain steve@cygnus.com
Free Software Foundation, Inc.
Written by Steve Chamberlain steve@cygnus.com
@@
-18,8
+18,8
@@
You should have received a copy of the GNU General Public License
along with GLD; see the file COPYING. If not, write to the Free
You should have received a copy of the GNU General Public License
along with GLD; see the file COPYING. If not, write to the Free
- Software Foundation, 5
9 Temple Place - Suite 330
, Boston, MA
- 0211
1-1307
, USA. */
+ Software Foundation, 5
1 Franklin Street - Fifth Floor
, Boston, MA
+ 0211
0-1301
, USA. */
#include "bfd.h"
#include "sysdep.h"
#include "bfd.h"
#include "sysdep.h"
@@
-50,7
+50,7
@@
#include <string.h>
#ifdef HAVE_SBRK
#include <string.h>
#ifdef HAVE_SBRK
-#if
def NEED_DECLARATION
_SBRK
+#if
!HAVE_DECL
_SBRK
extern void *sbrk ();
#endif
#endif
extern void *sbrk ();
#endif
#endif
@@
-160,7
+160,8
@@
static struct bfd_link_callbacks link_callbacks =
reloc_overflow,
reloc_dangerous,
unattached_reloc,
reloc_overflow,
reloc_dangerous,
unattached_reloc,
- notice
+ notice,
+ einfo
};
struct bfd_link_info link_info;
};
struct bfd_link_info link_info;
@@
-173,7
+174,7
@@
remove_output (void)
if (output_bfd)
bfd_cache_close (output_bfd);
if (delete_output_file_on_failure)
if (output_bfd)
bfd_cache_close (output_bfd);
if (delete_output_file_on_failure)
- unlink (output_filename);
+ unlink
_if_ordinary
(output_filename);
}
}
}
}
@@
-197,6
+198,8
@@
main (int argc, char **argv)
START_PROGRESS (program_name, 0);
START_PROGRESS (program_name, 0);
+ expandargv (&argc, &argv);
+
bfd_init ();
bfd_set_error_program_name (program_name);
bfd_init ();
bfd_set_error_program_name (program_name);
@@
-209,7
+212,7
@@
main (int argc, char **argv)
{
if (*TARGET_SYSTEM_ROOT == 0)
{
{
if (*TARGET_SYSTEM_ROOT == 0)
{
- einfo ("%P%F: this linker was not configured to use sysroots");
+ einfo ("%P%F: this linker was not configured to use sysroots
\n
");
ld_sysroot = "";
}
else
ld_sysroot = "";
}
else
@@
-301,6
+304,8
@@
main (int argc, char **argv)
link_info.create_object_symbols_section = NULL;
link_info.gc_sym_list = NULL;
link_info.base_file = NULL;
link_info.create_object_symbols_section = NULL;
link_info.gc_sym_list = NULL;
link_info.base_file = NULL;
+ link_info.emit_hash = TRUE;
+ link_info.emit_gnu_hash = FALSE;
/* SVR4 linkers seem to set DT_INIT and DT_FINI based on magic _init
and _fini symbols. We are compatible. */
link_info.init_function = "_init";
/* SVR4 linkers seem to set DT_INIT and DT_FINI based on magic _init
and _fini symbols. We are compatible. */
link_info.init_function = "_init";
@@
-310,8
+315,14
@@
main (int argc, char **argv)
link_info.spare_dynamic_tags = 5;
link_info.flags = 0;
link_info.flags_1 = 0;
link_info.spare_dynamic_tags = 5;
link_info.flags = 0;
link_info.flags_1 = 0;
- link_info.
need_relax_finalize = FALSE
;
+ link_info.
relax_pass = 1
;
link_info.warn_shared_textrel = FALSE;
link_info.warn_shared_textrel = FALSE;
+ link_info.gc_sections = FALSE;
+ link_info.print_gc_sections = FALSE;
+ link_info.dynamic = NULL;
+
+ config.maxpagesize = 0;
+ config.commonpagesize = 0;
ldfile_add_arch ("");
ldfile_add_arch ("");
@@
-331,11
+342,18
@@
main (int argc, char **argv)
if (config.hash_table_size != 0)
bfd_hash_set_default_size (config.hash_table_size);
if (config.hash_table_size != 0)
bfd_hash_set_default_size (config.hash_table_size);
+ if (config.maxpagesize != 0)
+ bfd_emul_set_maxpagesize (default_target, config.maxpagesize);
+
+ if (config.commonpagesize != 0)
+ bfd_emul_set_commonpagesize (default_target,
+ config.commonpagesize);
+
ldemul_set_symbols ();
if (link_info.relocatable)
{
ldemul_set_symbols ();
if (link_info.relocatable)
{
- if (
command_line
.gc_sections)
+ if (
link_info
.gc_sections)
einfo ("%P%F: --gc-sections and -r may not be used together\n");
else if (command_line.relax)
einfo (_("%P%F: --relax and -r may not be used together\n"));
einfo ("%P%F: --gc-sections and -r may not be used together\n");
else if (command_line.relax)
einfo (_("%P%F: --relax and -r may not be used together\n"));
@@
-343,9
+361,6
@@
main (int argc, char **argv)
einfo (_("%P%F: -r and -shared may not be used together\n"));
}
einfo (_("%P%F: -r and -shared may not be used together\n"));
}
- if (!config.dynamic_link && link_info.shared)
- einfo (_("%P%F: -static and -shared may not be used together\n"));
-
if (! link_info.shared)
{
if (command_line.filter_shlib)
if (! link_info.shared)
{
if (command_line.filter_shlib)
@@
-473,6
+488,8
@@
main (int argc, char **argv)
if (nocrossref_list != NULL)
check_nocrossrefs ();
if (nocrossref_list != NULL)
check_nocrossrefs ();
+ lang_finish ();
+
/* Even if we're producing relocatable output, some non-fatal errors should
be reported in the exit status. (What non-fatal errors, if any, do we
want to ignore for relocatable output?) */
/* Even if we're producing relocatable output, some non-fatal errors should
be reported in the exit status. (What non-fatal errors, if any, do we
want to ignore for relocatable output?) */
@@
-591,7
+608,7
@@
get_sysroot (int argc, char **argv)
const char *path;
for (i = 1; i < argc; i++)
const char *path;
for (i = 1; i < argc; i++)
- if (
strncmp (argv[i], "--sysroot=", strlen ("--sysroot=")) == 0
)
+ if (
CONST_STRNEQ (argv[i], "--sysroot=")
)
return argv[i] + strlen ("--sysroot=");
path = get_relative_sysroot (BINDIR);
return argv[i] + strlen ("--sysroot=");
path = get_relative_sysroot (BINDIR);
@@
-620,7
+637,7
@@
get_emulation (int argc, char **argv)
for (i = 1; i < argc; i++)
{
for (i = 1; i < argc; i++)
{
- if (
!strncmp (argv[i], "-m", 2
))
+ if (
CONST_STRNEQ (argv[i], "-m"
))
{
if (argv[i][2] == '\0')
{
{
if (argv[i][2] == '\0')
{
@@
-774,9
+791,10
@@
add_ysym (const char *name)
if (link_info.notice_hash == NULL)
{
link_info.notice_hash = xmalloc (sizeof (struct bfd_hash_table));
if (link_info.notice_hash == NULL)
{
link_info.notice_hash = xmalloc (sizeof (struct bfd_hash_table));
- if (! bfd_hash_table_init_n (link_info.notice_hash,
- bfd_hash_newfunc,
- 61))
+ if (!bfd_hash_table_init_n (link_info.notice_hash,
+ bfd_hash_newfunc,
+ sizeof (struct bfd_hash_entry),
+ 61))
einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
}
einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
}
@@
-792,9
+810,10
@@
add_wrap (const char *name)
if (link_info.wrap_hash == NULL)
{
link_info.wrap_hash = xmalloc (sizeof (struct bfd_hash_table));
if (link_info.wrap_hash == NULL)
{
link_info.wrap_hash = xmalloc (sizeof (struct bfd_hash_table));
- if (! bfd_hash_table_init_n (link_info.wrap_hash,
- bfd_hash_newfunc,
- 61))
+ if (!bfd_hash_table_init_n (link_info.wrap_hash,
+ bfd_hash_newfunc,
+ sizeof (struct bfd_hash_entry),
+ 61))
einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
}
einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
}
@@
-824,7
+843,8
@@
add_keepsyms_file (const char *filename)
}
link_info.keep_hash = xmalloc (sizeof (struct bfd_hash_table));
}
link_info.keep_hash = xmalloc (sizeof (struct bfd_hash_table));
- if (! bfd_hash_table_init (link_info.keep_hash, bfd_hash_newfunc))
+ if (!bfd_hash_table_init (link_info.keep_hash, bfd_hash_newfunc,
+ sizeof (struct bfd_hash_entry)))
einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
bufsize = 100;
einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
bufsize = 100;
@@
-872,7
+892,7
@@
add_keepsyms_file (const char *filename)
a link. */
static bfd_boolean
a link. */
static bfd_boolean
-add_archive_element (struct bfd_link_info *info
ATTRIBUTE_UNUSED
,
+add_archive_element (struct bfd_link_info *info,
bfd *abfd,
const char *name)
{
bfd *abfd,
const char *name)
{
@@
-903,7
+923,7
@@
add_archive_element (struct bfd_link_info *info ATTRIBUTE_UNUSED,
bfd *from;
int len;
bfd *from;
int len;
- h = bfd_link_hash_lookup (
link_info.
hash, name, FALSE, FALSE, TRUE);
+ h = bfd_link_hash_lookup (
info->
hash, name, FALSE, FALSE, TRUE);
if (h == NULL)
from = NULL;
if (h == NULL)
from = NULL;
@@
-1144,7
+1164,7
@@
constructor_callback (struct bfd_link_info *info,
/* Ensure that BFD_RELOC_CTOR exists now, so that we can give a
useful error message. */
if (bfd_reloc_type_lookup (output_bfd, BFD_RELOC_CTOR) == NULL
/* Ensure that BFD_RELOC_CTOR exists now, so that we can give a
useful error message. */
if (bfd_reloc_type_lookup (output_bfd, BFD_RELOC_CTOR) == NULL
- && (
link_info.
relocatable
+ && (
info->
relocatable
|| bfd_reloc_type_lookup (abfd, BFD_RELOC_CTOR) == NULL))
einfo (_("%P%F: BFD backend error: BFD_RELOC_CTOR unsupported\n"));
|| bfd_reloc_type_lookup (abfd, BFD_RELOC_CTOR) == NULL))
einfo (_("%P%F: BFD backend error: BFD_RELOC_CTOR unsupported\n"));
@@
-1323,7
+1343,8
@@
undefined_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
if (hash == NULL)
{
hash = xmalloc (sizeof (struct bfd_hash_table));
if (hash == NULL)
{
hash = xmalloc (sizeof (struct bfd_hash_table));
- if (! bfd_hash_table_init (hash, bfd_hash_newfunc))
+ if (!bfd_hash_table_init (hash, bfd_hash_newfunc,
+ sizeof (struct bfd_hash_entry)))
einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
}
einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
}
@@
-1421,10
+1442,7
@@
reloc_overflow (struct bfd_link_info *info ATTRIBUTE_UNUSED,
if (overflow_cutoff_limit == -1)
return TRUE;
if (overflow_cutoff_limit == -1)
return TRUE;
- if (abfd == NULL)
- einfo (_("%P%X: generated"));
- else
- einfo ("%X%C:", abfd, section, address);
+ einfo ("%X%C:", abfd, section, address);
if (overflow_cutoff_limit >= 0
&& overflow_cutoff_limit-- == 0)
if (overflow_cutoff_limit >= 0
&& overflow_cutoff_limit-- == 0)
@@
-1449,7
+1467,9
@@
reloc_overflow (struct bfd_link_info *info ATTRIBUTE_UNUSED,
case bfd_link_hash_defweak:
einfo (_(" relocation truncated to fit: %s against symbol `%T' defined in %A section in %B"),
reloc_name, entry->root.string,
case bfd_link_hash_defweak:
einfo (_(" relocation truncated to fit: %s against symbol `%T' defined in %A section in %B"),
reloc_name, entry->root.string,
- entry->u.def.section, entry->u.def.section->owner);
+ entry->u.def.section,
+ entry->u.def.section == bfd_abs_section_ptr
+ ? output_bfd : entry->u.def.section->owner);
break;
default:
abort ();
break;
default:
abort ();
@@
-1474,11
+1494,8
@@
reloc_dangerous (struct bfd_link_info *info ATTRIBUTE_UNUSED,
asection *section,
bfd_vma address)
{
asection *section,
bfd_vma address)
{
- if (abfd == NULL)
- einfo (_("%P%X: generated"));
- else
- einfo ("%X%C:", abfd, section, address);
- einfo (_("dangerous relocation: %s\n"), message);
+ einfo (_("%X%C: dangerous relocation: %s\n"),
+ abfd, section, address, message);
return TRUE;
}
return TRUE;
}
@@
-1492,11
+1509,8
@@
unattached_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED,
asection *section,
bfd_vma address)
{
asection *section,
bfd_vma address)
{
- if (abfd == NULL)
- einfo (_("%P%X: generated"));
- else
- einfo ("%X%C:", abfd, section, address);
- einfo (_(" reloc refers to symbol `%T' which is not being output\n"), name);
+ einfo (_("%X%C: reloc refers to symbol `%T' which is not being output\n"),
+ abfd, section, address, name);
return TRUE;
}
return TRUE;
}
@@
-1511,6
+1525,13
@@
notice (struct bfd_link_info *info,
asection *section,
bfd_vma value)
{
asection *section,
bfd_vma value)
{
+ if (name == NULL)
+ {
+ if (command_line.cref || nocrossref_list != NULL)
+ return handle_asneeded_cref (abfd, value);
+ return TRUE;
+ }
+
if (! info->notice_all
|| (info->notice_hash != NULL
&& bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE) != NULL))
if (! info->notice_all
|| (info->notice_hash != NULL
&& bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE) != NULL))