/* Main program of GNU linker.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- 2002, 2003
+ 2002, 2003, 2004
Free Software Foundation, Inc.
Written by Steve Chamberlain steve@cygnus.com
/* Nonzero means link in every member of an archive. */
bfd_boolean whole_archive;
+/* Nonzero means create DT_NEEDED entries only if a dynamic library
+ actually satisfies some reference in a regular object. */
+bfd_boolean as_needed;
+
+/* Nonzero means never create DT_NEEDED entries for dynamic libraries
+ in DT_NEEDED tags. */
+bfd_boolean add_needed = TRUE;
+
/* TRUE if we should demangle symbol names. */
bfd_boolean demangling;
ld_config_type config;
+sort_type sort_section;
+
static char *get_emulation
(int, char **);
static void set_scripts_dir
(struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma,
bfd_boolean);
static bfd_boolean reloc_overflow
- (struct bfd_link_info *, const char *, const char *, bfd_vma,
- bfd *, asection *, bfd_vma);
+ (struct bfd_link_info *, struct bfd_link_hash_entry *, const char *,
+ const char *, bfd_vma, bfd *, asection *, bfd_vma);
static bfd_boolean reloc_dangerous
(struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma);
static bfd_boolean unattached_reloc
reloc_overflow,
reloc_dangerous,
unattached_reloc,
- notice,
- error_handler
+ notice
};
struct bfd_link_info link_info;
{
if (output_filename)
{
- if (output_bfd && output_bfd->iostream)
- fclose ((FILE *) (output_bfd->iostream));
+ if (output_bfd)
+ bfd_cache_close (output_bfd);
if (delete_output_file_on_failure)
unlink (output_filename);
}
config.has_shared = FALSE;
config.split_by_reloc = (unsigned) -1;
config.split_by_file = (bfd_size_type) -1;
+ config.hash_table_size = 0;
command_line.force_common_definition = FALSE;
command_line.inhibit_common_definition = FALSE;
command_line.interpreter = NULL;
command_line.warn_mismatch = TRUE;
command_line.check_section_addresses = TRUE;
command_line.accept_unknown_input_arch = FALSE;
+ command_line.reduce_memory_overheads = FALSE;
+
+ sort_section = none;
/* We initialize DEMANGLING based on the environment variable
COLLECT_NO_DEMANGLE. The gcc collect2 program will demangle the
link_info.static_link = FALSE;
link_info.traditional_format = FALSE;
link_info.optimize = FALSE;
- link_info.no_undefined = FALSE;
- link_info.allow_shlib_undefined = TRUE;
+ link_info.unresolved_syms_in_objects = RM_NOT_YET_SET;
+ link_info.unresolved_syms_in_shared_libs = RM_NOT_YET_SET;
link_info.allow_multiple_definition = FALSE;
link_info.allow_undefined_version = TRUE;
+ link_info.create_default_symver = FALSE;
+ link_info.default_imported_symver = FALSE;
link_info.keep_memory = TRUE;
link_info.notice_all = FALSE;
link_info.nocopyreloc = FALSE;
link_info.new_dtags = FALSE;
link_info.combreloc = TRUE;
link_info.eh_frame_hdr = FALSE;
+ link_info.relro = FALSE;
link_info.strip_discarded = TRUE;
link_info.strip = strip_none;
link_info.discard = discard_sec_merge;
and _fini symbols. We are compatible. */
link_info.init_function = "_init";
link_info.fini_function = "_fini";
- link_info.mpc860c0 = 0;
link_info.pei386_auto_import = -1;
link_info.pei386_runtime_pseudo_reloc = FALSE;
link_info.spare_dynamic_tags = 5;
link_info.flags = 0;
link_info.flags_1 = 0;
- link_info.relax_finalizing = FALSE;
+ link_info.need_relax_finalize = FALSE;
+ link_info.warn_shared_textrel = FALSE;
ldfile_add_arch ("");
lang_has_input_file = FALSE;
parse_args (argc, argv);
+ if (config.hash_table_size != 0)
+ bfd_hash_set_default_size (config.hash_table_size);
+
ldemul_set_symbols ();
if (link_info.relocatable)
{
if (command_line.gc_sections)
einfo ("%P%F: --gc-sections and -r may not be used together\n");
- if (link_info.mpc860c0)
- einfo (_("%P%F: -r and --mpc860c0 may not be used together\n"));
else if (command_line.relax)
einfo (_("%P%F: --relax and -r may not be used together\n"));
if (link_info.shared)
|| strcmp (argv[i], "-mips5") == 0
|| strcmp (argv[i], "-mips32") == 0
|| strcmp (argv[i], "-mips32r2") == 0
- || strcmp (argv[i], "-mips64") == 0)
+ || strcmp (argv[i], "-mips64") == 0
+ || strcmp (argv[i], "-mips64r2") == 0)
{
/* FIXME: The arguments -mips1, -mips2, -mips3, etc. are
passed to the linker by some MIPS compilers. They
bfd *abfd,
asection *section,
bfd_vma address,
- bfd_boolean fatal ATTRIBUTE_UNUSED)
+ bfd_boolean error)
{
static char *error_name;
static unsigned int error_count;
{
if (error_count < MAX_ERRORS_IN_A_ROW)
{
- einfo (_("%C: undefined reference to `%T'\n"),
- abfd, section, address, name);
- if (fatal)
- einfo ("%X");
+ if (error)
+ einfo (_("%X%C: undefined reference to `%T'\n"),
+ abfd, section, address, name);
+ else
+ einfo (_("%C: warning: undefined reference to `%T'\n"),
+ abfd, section, address, name);
}
else if (error_count == MAX_ERRORS_IN_A_ROW)
- einfo (_("%D: more undefined references to `%T' follow\n"),
- abfd, section, address, name);
+ {
+ if (error)
+ einfo (_("%X%D: more undefined references to `%T' follow\n"),
+ abfd, section, address, name);
+ else
+ einfo (_("%D: warning: more undefined references to `%T' follow\n"),
+ abfd, section, address, name);
+ }
+ else if (error)
+ einfo ("%X");
}
else
{
if (error_count < MAX_ERRORS_IN_A_ROW)
{
- einfo (_("%B: undefined reference to `%T'\n"),
- abfd, name);
- if (fatal)
- einfo ("%X");
+ if (error)
+ einfo (_("%X%B: undefined reference to `%T'\n"),
+ abfd, name);
+ else
+ einfo (_("%B: warning: undefined reference to `%T'\n"),
+ abfd, name);
}
else if (error_count == MAX_ERRORS_IN_A_ROW)
- einfo (_("%B: more undefined references to `%T' follow\n"),
- abfd, name);
+ {
+ if (error)
+ einfo (_("%X%B: more undefined references to `%T' follow\n"),
+ abfd, name);
+ else
+ einfo (_("%B: warning: more undefined references to `%T' follow\n"),
+ abfd, name);
+ }
+ else if (error)
+ einfo ("%X");
}
return TRUE;
static bfd_boolean
reloc_overflow (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+ struct bfd_link_hash_entry *entry,
const char *name,
const char *reloc_name,
bfd_vma addend,
return TRUE;
}
- einfo (_(" relocation truncated to fit: %s %T"), reloc_name, name);
+ if (entry)
+ {
+ while (entry->type == bfd_link_hash_indirect
+ || entry->type == bfd_link_hash_warning)
+ entry = entry->u.i.link;
+ switch (entry->type)
+ {
+ case bfd_link_hash_undefined:
+ case bfd_link_hash_undefweak:
+ einfo (_(" relocation truncated to fit: %s against undefined symbol `%T'"),
+ reloc_name, entry->root.string);
+ break;
+ case bfd_link_hash_defined:
+ 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);
+ break;
+ default:
+ abort ();
+ break;
+ }
+ }
+ else
+ einfo (_(" relocation truncated to fit: %s against `%T'"),
+ reloc_name, name);
if (addend != 0)
einfo ("+%v", addend);
einfo ("\n");