/* Main program of GNU linker.
- Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 1999
+ Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000
Free Software Foundation, Inc.
Written by Steve Chamberlain steve@cygnus.com
#include "libiberty.h"
#include "progress.h"
#include "bfdlink.h"
+#include "filenames.h"
#include "ld.h"
#include "ldmain.h"
static void warning_find_reloc PARAMS ((bfd *, asection *, PTR));
static boolean undefined_symbol PARAMS ((struct bfd_link_info *,
const char *, bfd *,
- asection *, bfd_vma));
+ asection *, bfd_vma, boolean));
static boolean reloc_overflow PARAMS ((struct bfd_link_info *, const char *,
const char *, bfd_vma,
bfd *, asection *, bfd_vma));
link_info.callbacks = &link_callbacks;
link_info.relocateable = false;
+ link_info.emitrelocations = false;
link_info.shared = false;
link_info.symbolic = false;
link_info.static_link = false;
link_info.notice_hash = NULL;
link_info.wrap_hash = NULL;
link_info.mpc860c0 = 0;
-
+ /* 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";
+ link_info.fini_function = "_fini";
+
ldfile_add_arch ("");
config.make_executable = true;
/* Print error messages for any missing symbols, for any warning
symbols, and possibly multiple definitions */
-
- if (config.text_read_only)
- {
- /* Look for a text section and mark the readonly attribute in it */
- asection *found = bfd_get_section_by_name (output_bfd, ".text");
-
- if (found != (asection *) NULL)
- {
+ /* Look for a text section and switch the readonly attribute in it. */
+ {
+ asection * found = bfd_get_section_by_name (output_bfd, ".text");
+
+ if (found != (asection *) NULL)
+ {
+ if (config.text_read_only)
found->flags |= SEC_READONLY;
- }
- }
+ else
+ found->flags &= ~SEC_READONLY;
+ }
+ }
if (link_info.relocateable)
output_bfd->flags &= ~EXEC_P;
/* Look for "ldscripts" in the dir where our binary is. */
end = strrchr (program_name, '/');
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+ {
+ /* We could have \foo\bar, or /foo\bar. */
+ char *bslash = strrchr (program_name, '\\');
+ if (bslash > end)
+ end = bslash;
+ }
+#endif
if (end == NULL)
{
/*ARGSUSED*/
static boolean
add_archive_element (info, abfd, name)
- struct bfd_link_info *info;
+ struct bfd_link_info *info ATTRIBUTE_UNUSED;
bfd *abfd;
const char *name;
{
/*ARGSUSED*/
static boolean
multiple_definition (info, name, obfd, osec, oval, nbfd, nsec, nval)
- struct bfd_link_info *info;
+ struct bfd_link_info *info ATTRIBUTE_UNUSED;
const char *name;
bfd *obfd;
asection *osec;
/*ARGSUSED*/
static boolean
multiple_common (info, name, obfd, otype, osize, nbfd, ntype, nsize)
- struct bfd_link_info *info;
+ struct bfd_link_info *info ATTRIBUTE_UNUSED;
const char *name;
bfd *obfd;
enum bfd_link_hash_type otype;
/*ARGSUSED*/
static boolean
add_to_set (info, h, reloc, abfd, section, value)
- struct bfd_link_info *info;
+ struct bfd_link_info *info ATTRIBUTE_UNUSED;
struct bfd_link_hash_entry *h;
bfd_reloc_code_real_type reloc;
bfd *abfd;
/*ARGSUSED*/
static boolean
warning_callback (info, warning, symbol, abfd, section, address)
- struct bfd_link_info *info;
+ struct bfd_link_info *info ATTRIBUTE_UNUSED;
const char *warning;
const char *symbol;
bfd *abfd;
/*ARGSUSED*/
static boolean
-undefined_symbol (info, name, abfd, section, address)
- struct bfd_link_info *info;
+undefined_symbol (info, name, abfd, section, address, fatal)
+ struct bfd_link_info *info ATTRIBUTE_UNUSED;
const char *name;
bfd *abfd;
asection *section;
bfd_vma address;
+ boolean fatal ATTRIBUTE_UNUSED;
{
static char *error_name;
static unsigned int error_count;
if (section != NULL)
{
if (error_count < MAX_ERRORS_IN_A_ROW)
- einfo (_("%X%C: undefined reference to `%T'\n"),
- abfd, section, address, name);
+ {
+ einfo (_("%C: undefined reference to `%T'\n"),
+ abfd, section, address, name);
+ if (fatal)
+ einfo ("%X");
+ }
else if (error_count == MAX_ERRORS_IN_A_ROW)
einfo (_("%D: more undefined references to `%T' follow\n"),
abfd, section, address, name);
else
{
if (error_count < MAX_ERRORS_IN_A_ROW)
- einfo (_("%X%B: undefined reference to `%T'\n"),
- abfd, name);
+ {
+ einfo (_("%B: undefined reference to `%T'\n"),
+ abfd, name);
+ if (fatal)
+ einfo ("%X");
+ }
else if (error_count == MAX_ERRORS_IN_A_ROW)
einfo (_("%B: more undefined references to `%T' follow\n"),
abfd, name);
/*ARGSUSED*/
static boolean
reloc_overflow (info, name, reloc_name, addend, abfd, section, address)
- struct bfd_link_info *info;
+ struct bfd_link_info *info ATTRIBUTE_UNUSED;
const char *name;
const char *reloc_name;
bfd_vma addend;
/*ARGSUSED*/
static boolean
reloc_dangerous (info, message, abfd, section, address)
- struct bfd_link_info *info;
+ struct bfd_link_info *info ATTRIBUTE_UNUSED;
const char *message;
bfd *abfd;
asection *section;
/*ARGSUSED*/
static boolean
unattached_reloc (info, name, abfd, section, address)
- struct bfd_link_info *info;
+ struct bfd_link_info *info ATTRIBUTE_UNUSED;
const char *name;
bfd *abfd;
asection *section;