[ bfd/ChangeLog ]
[deliverable/binutils-gdb.git] / ld / ldmain.c
index ef84e877550f2a65ed2b76c721105ca636729f7d..b18b580e83fd2d3d5511e0e1844e26f5ada9e0bc 100644 (file)
@@ -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
+   2002, 2003
    Free Software Foundation, Inc.
    Written by Steve Chamberlain steve@cygnus.com
 
    Free Software Foundation, Inc.
    Written by Steve Chamberlain steve@cygnus.com
 
@@ -42,7 +42,7 @@
 #include "ldemul.h"
 #include "ldctor.h"
 
 #include "ldemul.h"
 #include "ldctor.h"
 
-/* Somewhere above, sys/stat.h got included . . . .  */
+/* Somewhere above, sys/stat.h got included.  */
 #if !defined(S_ISDIR) && defined(S_IFDIR)
 #define        S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
 #endif
 #if !defined(S_ISDIR) && defined(S_IFDIR)
 #define        S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
 #endif
 
 #ifdef HAVE_SBRK
 #ifdef NEED_DECLARATION_SBRK
 
 #ifdef HAVE_SBRK
 #ifdef NEED_DECLARATION_SBRK
-extern PTR sbrk ();
+extern void *sbrk ();
 #endif
 #endif
 
 #endif
 #endif
 
-int main PARAMS ((int, char **));
-
-static char *get_emulation PARAMS ((int, char **));
-static void set_scripts_dir PARAMS ((void));
+#ifndef TARGET_SYSTEM_ROOT
+#define TARGET_SYSTEM_ROOT ""
+#endif
 
 /* EXPORTS */
 
 
 /* EXPORTS */
 
@@ -68,6 +67,13 @@ const char *output_filename = "a.out";
 /* Name this program was invoked by.  */
 char *program_name;
 
 /* Name this program was invoked by.  */
 char *program_name;
 
+/* The prefix for system library directories.  */
+char *ld_sysroot;
+
+/* The canonical representation of ld_sysroot.  */
+char * ld_canon_sysroot;
+int ld_canon_sysroot_len;
+
 /* The file that we're creating.  */
 bfd *output_bfd = 0;
 
 /* The file that we're creating.  */
 bfd *output_bfd = 0;
 
@@ -94,46 +100,44 @@ args_type command_line;
 
 ld_config_type config;
 
 
 ld_config_type config;
 
-static void remove_output PARAMS ((void));
-static bfd_boolean check_for_scripts_dir PARAMS ((char *dir));
-static bfd_boolean add_archive_element PARAMS ((struct bfd_link_info *, bfd *,
-                                           const char *));
-static bfd_boolean multiple_definition PARAMS ((struct bfd_link_info *,
-                                           const char *,
-                                           bfd *, asection *, bfd_vma,
-                                           bfd *, asection *, bfd_vma));
-static bfd_boolean multiple_common PARAMS ((struct bfd_link_info *,
-                                       const char *, bfd *,
-                                       enum bfd_link_hash_type, bfd_vma,
-                                       bfd *, enum bfd_link_hash_type,
-                                       bfd_vma));
-static bfd_boolean add_to_set PARAMS ((struct bfd_link_info *,
-                                  struct bfd_link_hash_entry *,
-                                  bfd_reloc_code_real_type,
-                                  bfd *, asection *, bfd_vma));
-static bfd_boolean constructor_callback PARAMS ((struct bfd_link_info *,
-                                            bfd_boolean constructor,
-                                            const char *name,
-                                            bfd *, asection *, bfd_vma));
-static bfd_boolean warning_callback PARAMS ((struct bfd_link_info *,
-                                        const char *, const char *, bfd *,
-                                        asection *, bfd_vma));
-static void warning_find_reloc PARAMS ((bfd *, asection *, PTR));
-static bfd_boolean undefined_symbol PARAMS ((struct bfd_link_info *,
-                                        const char *, bfd *,
-                                        asection *, bfd_vma, bfd_boolean));
-static bfd_boolean reloc_overflow PARAMS ((struct bfd_link_info *, const char *,
-                                      const char *, bfd_vma,
-                                      bfd *, asection *, bfd_vma));
-static bfd_boolean reloc_dangerous PARAMS ((struct bfd_link_info *, const char *,
-                                       bfd *, asection *, bfd_vma));
-static bfd_boolean unattached_reloc PARAMS ((struct bfd_link_info *,
-                                        const char *, bfd *, asection *,
-                                        bfd_vma));
-static bfd_boolean notice PARAMS ((struct bfd_link_info *, const char *,
-                              bfd *, asection *, bfd_vma));
-
-static struct bfd_link_callbacks link_callbacks = {
+static char *get_emulation
+  (int, char **);
+static void set_scripts_dir
+  (void);
+static bfd_boolean add_archive_element
+  (struct bfd_link_info *, bfd *, const char *);
+static bfd_boolean multiple_definition
+  (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma,
+   bfd *, asection *, bfd_vma);
+static bfd_boolean multiple_common
+  (struct bfd_link_info *, const char *, bfd *, enum bfd_link_hash_type,
+   bfd_vma, bfd *, enum bfd_link_hash_type, bfd_vma);
+static bfd_boolean add_to_set
+  (struct bfd_link_info *, struct bfd_link_hash_entry *,
+   bfd_reloc_code_real_type, bfd *, asection *, bfd_vma);
+static bfd_boolean constructor_callback
+  (struct bfd_link_info *, bfd_boolean, const char *, bfd *,
+   asection *, bfd_vma);
+static bfd_boolean warning_callback
+  (struct bfd_link_info *, const char *, const char *, bfd *,
+   asection *, bfd_vma);
+static void warning_find_reloc
+  (bfd *, asection *, void *);
+static bfd_boolean undefined_symbol
+  (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);
+static bfd_boolean reloc_dangerous
+  (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma);
+static bfd_boolean unattached_reloc
+  (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma);
+static bfd_boolean notice
+  (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma);
+
+static struct bfd_link_callbacks link_callbacks =
+{
   add_archive_element,
   multiple_definition,
   multiple_common,
   add_archive_element,
   multiple_definition,
   multiple_common,
@@ -144,13 +148,14 @@ static struct bfd_link_callbacks link_callbacks = {
   reloc_overflow,
   reloc_dangerous,
   unattached_reloc,
   reloc_overflow,
   reloc_dangerous,
   unattached_reloc,
-  notice
+  notice,
+  error_handler
 };
 
 struct bfd_link_info link_info;
 \f
 static void
 };
 
 struct bfd_link_info link_info;
 \f
 static void
-remove_output ()
+remove_output (void)
 {
   if (output_filename)
     {
 {
   if (output_filename)
     {
@@ -162,9 +167,7 @@ remove_output ()
 }
 
 int
 }
 
 int
-main (argc, argv)
-     int argc;
-     char **argv;
+main (int argc, char **argv)
 {
   char *emulation;
   long start_time = get_run_time ();
 {
   char *emulation;
   long start_time = get_run_time ();
@@ -189,6 +192,52 @@ main (argc, argv)
 
   xatexit (remove_output);
 
 
   xatexit (remove_output);
 
+#ifdef TARGET_SYSTEM_ROOT_RELOCATABLE
+  ld_sysroot = make_relative_prefix (program_name, BINDIR,
+                                    TARGET_SYSTEM_ROOT);
+
+  if (ld_sysroot)
+    {
+      struct stat s;
+      int res = stat (ld_sysroot, &s) == 0 && S_ISDIR (s.st_mode);
+
+      if (!res)
+       {
+         free (ld_sysroot);
+         ld_sysroot = NULL;
+       }
+    }
+
+  if (! ld_sysroot)
+    {
+      ld_sysroot = make_relative_prefix (program_name, TOOLBINDIR,
+                                        TARGET_SYSTEM_ROOT);
+
+      if (ld_sysroot)
+       {
+         struct stat s;
+         int res = stat (ld_sysroot, &s) == 0 && S_ISDIR (s.st_mode);
+
+         if (!res)
+           {
+             free (ld_sysroot);
+             ld_sysroot = NULL;
+           }
+       }
+    }
+
+  if (! ld_sysroot)
+#endif
+    ld_sysroot = TARGET_SYSTEM_ROOT;
+
+  if (ld_sysroot && *ld_sysroot)
+    ld_canon_sysroot = lrealpath (ld_sysroot);
+
+  if (ld_canon_sysroot)
+    ld_canon_sysroot_len = strlen (ld_canon_sysroot);
+  else
+    ld_canon_sysroot_len = -1;
+
   /* Set the default BFD target based on the configured target.  Doing
      this permits the linker to be configured for a particular target,
      and linked against a shared BFD library which was configured for
   /* Set the default BFD target based on the configured target.  Doing
      this permits the linker to be configured for a particular target,
      and linked against a shared BFD library which was configured for
@@ -220,6 +269,7 @@ main (argc, argv)
   command_line.rpath = NULL;
   command_line.warn_mismatch = TRUE;
   command_line.check_section_addresses = TRUE;
   command_line.rpath = NULL;
   command_line.warn_mismatch = TRUE;
   command_line.check_section_addresses = TRUE;
+  command_line.accept_unknown_input_arch = FALSE;
 
   /* We initialize DEMANGLING based on the environment variable
      COLLECT_NO_DEMANGLE.  The gcc collect2 program will demangle the
 
   /* We initialize DEMANGLING based on the environment variable
      COLLECT_NO_DEMANGLE.  The gcc collect2 program will demangle the
@@ -228,17 +278,19 @@ main (argc, argv)
      interface by default.  */
   demangling = getenv ("COLLECT_NO_DEMANGLE") == NULL;
 
      interface by default.  */
   demangling = getenv ("COLLECT_NO_DEMANGLE") == NULL;
 
-  link_info.relocateable = FALSE;
+  link_info.relocatable = FALSE;
   link_info.emitrelocations = FALSE;
   link_info.task_link = FALSE;
   link_info.shared = FALSE;
   link_info.emitrelocations = FALSE;
   link_info.task_link = FALSE;
   link_info.shared = FALSE;
+  link_info.pie = FALSE;
+  link_info.executable = FALSE;
   link_info.symbolic = FALSE;
   link_info.export_dynamic = FALSE;
   link_info.static_link = FALSE;
   link_info.traditional_format = FALSE;
   link_info.optimize = FALSE;
   link_info.symbolic = FALSE;
   link_info.export_dynamic = FALSE;
   link_info.static_link = FALSE;
   link_info.traditional_format = FALSE;
   link_info.optimize = FALSE;
-  link_info.no_undefined = FALSE;
-  link_info.allow_shlib_undefined = FALSE;
+  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.keep_memory = TRUE;
   link_info.allow_multiple_definition = FALSE;
   link_info.allow_undefined_version = TRUE;
   link_info.keep_memory = TRUE;
@@ -247,6 +299,7 @@ main (argc, argv)
   link_info.new_dtags = FALSE;
   link_info.combreloc = TRUE;
   link_info.eh_frame_hdr = FALSE;
   link_info.new_dtags = FALSE;
   link_info.combreloc = TRUE;
   link_info.eh_frame_hdr = FALSE;
+  link_info.strip_discarded = TRUE;
   link_info.strip = strip_none;
   link_info.discard = discard_sec_merge;
   link_info.common_skip_ar_aymbols = bfd_link_common_skip_none;
   link_info.strip = strip_none;
   link_info.discard = discard_sec_merge;
   link_info.common_skip_ar_aymbols = bfd_link_common_skip_none;
@@ -267,8 +320,9 @@ main (argc, argv)
   link_info.pei386_auto_import = -1;
   link_info.pei386_runtime_pseudo_reloc = FALSE;
   link_info.spare_dynamic_tags = 5;
   link_info.pei386_auto_import = -1;
   link_info.pei386_runtime_pseudo_reloc = FALSE;
   link_info.spare_dynamic_tags = 5;
-  link_info.flags = (bfd_vma) 0;
-  link_info.flags_1 = (bfd_vma) 0;
+  link_info.flags = 0;
+  link_info.flags_1 = 0;
+  link_info.relax_finalizing = FALSE;
 
   ldfile_add_arch ("");
 
 
   ldfile_add_arch ("");
 
@@ -287,7 +341,7 @@ main (argc, argv)
 
   ldemul_set_symbols ();
 
 
   ldemul_set_symbols ();
 
-  if (link_info.relocateable)
+  if (link_info.relocatable)
     {
       if (command_line.gc_sections)
        einfo ("%P%F: --gc-sections and -r may not be used together\n");
     {
       if (command_line.gc_sections)
        einfo ("%P%F: --gc-sections and -r may not be used together\n");
@@ -307,10 +361,13 @@ main (argc, argv)
        einfo (_("%P%F: -f may not be used without -shared\n"));
     }
 
        einfo (_("%P%F: -f may not be used without -shared\n"));
     }
 
+  if (! link_info.shared || link_info.pie)
+    link_info.executable = TRUE;
+
   /* Treat ld -r -s as ld -r -S -x (i.e., strip all local symbols).  I
      don't see how else this can be handled, since in this case we
      must preserve all externally visible symbols.  */
   /* Treat ld -r -s as ld -r -S -x (i.e., strip all local symbols).  I
      don't see how else this can be handled, since in this case we
      must preserve all externally visible symbols.  */
-  if (link_info.relocateable && link_info.strip == strip_all)
+  if (link_info.relocatable && link_info.strip == strip_all)
     {
       link_info.strip = strip_debugger;
       if (link_info.discard == discard_sec_merge)
     {
       link_info.strip = strip_debugger;
       if (link_info.discard == discard_sec_merge)
@@ -383,9 +440,7 @@ main (argc, argv)
     }
 
   if (trace_files)
     }
 
   if (trace_files)
-    {
-      info_msg (_("%P: mode %s\n"), emulation);
-    }
+    info_msg (_("%P: mode %s\n"), emulation);
 
   ldemul_after_parse ();
 
 
   ldemul_after_parse ();
 
@@ -411,8 +466,7 @@ main (argc, argv)
 
   /* Print error messages for any missing symbols, for any warning
      symbols, and possibly multiple definitions.  */
 
   /* Print error messages for any missing symbols, for any warning
      symbols, and possibly multiple definitions.  */
-
-  if (link_info.relocateable)
+  if (link_info.relocatable)
     output_bfd->flags &= ~EXEC_P;
   else
     output_bfd->flags |= EXEC_P;
     output_bfd->flags &= ~EXEC_P;
   else
     output_bfd->flags |= EXEC_P;
@@ -426,20 +480,16 @@ main (argc, argv)
   if (nocrossref_list != NULL)
     check_nocrossrefs ();
 
   if (nocrossref_list != NULL)
     check_nocrossrefs ();
 
-  /* Even if we're producing relocateable output, some non-fatal errors should
+  /* 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
      be reported in the exit status.  (What non-fatal errors, if any, do we
-     want to ignore for relocateable output?)  */
-
+     want to ignore for relocatable output?)  */
   if (!config.make_executable && !force_make_executable)
     {
       if (trace_files)
   if (!config.make_executable && !force_make_executable)
     {
       if (trace_files)
-       {
-         einfo (_("%P: link errors found, deleting executable `%s'\n"),
-                output_filename);
-       }
+       einfo (_("%P: link errors found, deleting executable `%s'\n"),
+              output_filename);
 
       /* The file will be removed by remove_output.  */
 
       /* The file will be removed by remove_output.  */
-
       xexit (1);
     }
   else
       xexit (1);
     }
   else
@@ -450,9 +500,10 @@ main (argc, argv)
       /* If the --force-exe-suffix is enabled, and we're making an
         executable file and it doesn't end in .exe, copy it to one
         which does.  */
       /* If the --force-exe-suffix is enabled, and we're making an
         executable file and it doesn't end in .exe, copy it to one
         which does.  */
-      if (! link_info.relocateable && command_line.force_exe_suffix)
+      if (! link_info.relocatable && command_line.force_exe_suffix)
        {
          int len = strlen (output_filename);
        {
          int len = strlen (output_filename);
+
          if (len < 4
              || (strcasecmp (output_filename + len - 4, ".exe") != 0
                  && strcasecmp (output_filename + len - 4, ".dll") != 0))
          if (len < 4
              || (strcasecmp (output_filename + len - 4, ".exe") != 0
                  && strcasecmp (output_filename + len - 4, ".dll") != 0))
@@ -463,28 +514,29 @@ main (argc, argv)
              char *buf = xmalloc (bsize);
              int l;
              char *dst_name = xmalloc (len + 5);
              char *buf = xmalloc (bsize);
              int l;
              char *dst_name = xmalloc (len + 5);
+
              strcpy (dst_name, output_filename);
              strcat (dst_name, ".exe");
              src = fopen (output_filename, FOPEN_RB);
              dst = fopen (dst_name, FOPEN_WB);
 
              if (!src)
              strcpy (dst_name, output_filename);
              strcat (dst_name, ".exe");
              src = fopen (output_filename, FOPEN_RB);
              dst = fopen (dst_name, FOPEN_WB);
 
              if (!src)
-               einfo (_("%X%P: unable to open for source of copy `%s'\n"), output_filename);
+               einfo (_("%X%P: unable to open for source of copy `%s'\n"),
+                      output_filename);
              if (!dst)
              if (!dst)
-               einfo (_("%X%P: unable to open for destination of copy `%s'\n"), dst_name);
+               einfo (_("%X%P: unable to open for destination of copy `%s'\n"),
+                      dst_name);
              while ((l = fread (buf, 1, bsize, src)) > 0)
                {
                  int done = fwrite (buf, 1, l, dst);
              while ((l = fread (buf, 1, bsize, src)) > 0)
                {
                  int done = fwrite (buf, 1, l, dst);
+
                  if (done != l)
                  if (done != l)
-                   {
-                     einfo (_("%P: Error writing file `%s'\n"), dst_name);
-                   }
+                   einfo (_("%P: Error writing file `%s'\n"), dst_name);
                }
                }
+
              fclose (src);
              if (fclose (dst) == EOF)
              fclose (src);
              if (fclose (dst) == EOF)
-               {
-                 einfo (_("%P: Error closing file `%s'\n"), dst_name);
-               }
+               einfo (_("%P: Error closing file `%s'\n"), dst_name);
              free (dst_name);
              free (buf);
            }
              free (dst_name);
              free (buf);
            }
@@ -496,7 +548,7 @@ main (argc, argv)
   if (config.stats)
     {
 #ifdef HAVE_SBRK
   if (config.stats)
     {
 #ifdef HAVE_SBRK
-      char *lim = (char *) sbrk (0);
+      char *lim = sbrk (0);
 #endif
       long run_time = get_run_time () - start_time;
 
 #endif
       long run_time = get_run_time () - start_time;
 
@@ -519,9 +571,7 @@ main (argc, argv)
    state that's needed by the lex&yacc argument parser (parse_args).  */
 
 static char *
    state that's needed by the lex&yacc argument parser (parse_args).  */
 
 static char *
-get_emulation (argc, argv)
-     int argc;
-     char **argv;
+get_emulation (int argc, char **argv)
 {
   char *emulation;
   int i;
 {
   char *emulation;
   int i;
@@ -543,17 +593,17 @@ get_emulation (argc, argv)
                  i++;
                }
              else
                  i++;
                }
              else
-               {
-                 einfo (_("%P%F: missing argument to -m\n"));
-               }
+               einfo (_("%P%F: missing argument to -m\n"));
            }
          else if (strcmp (argv[i], "-mips1") == 0
                   || strcmp (argv[i], "-mips2") == 0
                   || strcmp (argv[i], "-mips3") == 0
            }
          else if (strcmp (argv[i], "-mips1") == 0
                   || strcmp (argv[i], "-mips2") == 0
                   || strcmp (argv[i], "-mips3") == 0
+                  || strcmp (argv[i], "-mips4") == 0
+                  || strcmp (argv[i], "-mips5") == 0
                   || strcmp (argv[i], "-mips32") == 0
                   || strcmp (argv[i], "-mips32") == 0
+                  || strcmp (argv[i], "-mips32r2") == 0
                   || strcmp (argv[i], "-mips64") == 0
                   || strcmp (argv[i], "-mips64") == 0
-                  || strcmp (argv[i], "-mips4") == 0
-                  || strcmp (argv[i], "-mips5") == 0)
+                  || strcmp (argv[i], "-mips64r2") == 0)
            {
              /* FIXME: The arguments -mips1, -mips2, -mips3, etc. are
                 passed to the linker by some MIPS compilers.  They
            {
              /* FIXME: The arguments -mips1, -mips2, -mips3, etc. are
                 passed to the linker by some MIPS compilers.  They
@@ -585,8 +635,7 @@ get_emulation (argc, argv)
    else return FALSE.  */
 
 static bfd_boolean
    else return FALSE.  */
 
 static bfd_boolean
-check_for_scripts_dir (dir)
-     char *dir;
+check_for_scripts_dir (char *dir)
 {
   size_t dirlen;
   char *buf;
 {
   size_t dirlen;
   char *buf;
@@ -595,7 +644,7 @@ check_for_scripts_dir (dir)
 
   dirlen = strlen (dir);
   /* sizeof counts the terminating NUL.  */
 
   dirlen = strlen (dir);
   /* sizeof counts the terminating NUL.  */
-  buf = (char *) xmalloc (dirlen + sizeof ("/ldscripts"));
+  buf = xmalloc (dirlen + sizeof ("/ldscripts"));
   sprintf (buf, "%s/ldscripts", dir);
 
   res = stat (buf, &s) == 0 && S_ISDIR (s.st_mode);
   sprintf (buf, "%s/ldscripts", dir);
 
   res = stat (buf, &s) == 0 && S_ISDIR (s.st_mode);
@@ -609,15 +658,37 @@ check_for_scripts_dir (dir)
    Libraries will be searched for here too, but that's ok.
    We look for the "ldscripts" directory in:
 
    Libraries will be searched for here too, but that's ok.
    We look for the "ldscripts" directory in:
 
+   SCRIPTDIR (passed from Makefile)
+            (adjusted according to the current location of the binary)
    SCRIPTDIR (passed from Makefile)
    the dir where this program is (for using it from the build tree)
    SCRIPTDIR (passed from Makefile)
    the dir where this program is (for using it from the build tree)
-   the dir where this program is/../lib (for installing the tool suite elsewhere) */
+   the dir where this program is/../lib
+            (for installing the tool suite elsewhere).  */
 
 static void
 
 static void
-set_scripts_dir ()
+set_scripts_dir (void)
 {
   char *end, *dir;
   size_t dirlen;
 {
   char *end, *dir;
   size_t dirlen;
+  bfd_boolean found;
+
+  dir = make_relative_prefix (program_name, BINDIR, SCRIPTDIR);
+  if (dir)
+    {
+      found = check_for_scripts_dir (dir);
+      free (dir);
+      if (found)
+       return;
+    }
+
+  dir = make_relative_prefix (program_name, TOOLBINDIR, SCRIPTDIR);
+  if (dir)
+    {
+      found = check_for_scripts_dir (dir);
+      free (dir);
+      if (found)
+       return;
+    }
 
   if (check_for_scripts_dir (SCRIPTDIR))
     /* We've been installed normally.  */
 
   if (check_for_scripts_dir (SCRIPTDIR))
     /* We've been installed normally.  */
@@ -629,72 +700,66 @@ set_scripts_dir ()
   {
     /* We could have \foo\bar, or /foo\bar.  */
     char *bslash = strrchr (program_name, '\\');
   {
     /* We could have \foo\bar, or /foo\bar.  */
     char *bslash = strrchr (program_name, '\\');
+
     if (end == NULL || (bslash != NULL && bslash > end))
       end = bslash;
   }
 #endif
 
   if (end == NULL)
     if (end == NULL || (bslash != NULL && bslash > end))
       end = bslash;
   }
 #endif
 
   if (end == NULL)
-    {
-      /* Don't look for ldscripts in the current directory.  There is
-         too much potential for confusion.  */
-      return;
-    }
+    /* Don't look for ldscripts in the current directory.  There is
+       too much potential for confusion.  */
+    return;
 
   dirlen = end - program_name;
   /* Make a copy of program_name in dir.
      Leave room for later "/../lib".  */
 
   dirlen = end - program_name;
   /* Make a copy of program_name in dir.
      Leave room for later "/../lib".  */
-  dir = (char *) xmalloc (dirlen + 8);
+  dir = xmalloc (dirlen + 8);
   strncpy (dir, program_name, dirlen);
   dir[dirlen] = '\0';
 
   if (check_for_scripts_dir (dir))
   strncpy (dir, program_name, dirlen);
   dir[dirlen] = '\0';
 
   if (check_for_scripts_dir (dir))
-    /* Don't free dir.  */
-    return;
+    {
+      free (dir);
+      return;
+    }
 
   /* Look for "ldscripts" in <the dir where our binary is>/../lib.  */
   strcpy (dir + dirlen, "/../lib");
 
   /* Look for "ldscripts" in <the dir where our binary is>/../lib.  */
   strcpy (dir + dirlen, "/../lib");
-  if (check_for_scripts_dir (dir))
-    return;
-
-  /* Well, we tried.  */
+  check_for_scripts_dir (dir);
   free (dir);
 }
 
 void
   free (dir);
 }
 
 void
-add_ysym (name)
-     const char *name;
+add_ysym (const char *name)
 {
 {
-  if (link_info.notice_hash == (struct bfd_hash_table *) NULL)
+  if (link_info.notice_hash == NULL)
     {
     {
-      link_info.notice_hash = ((struct bfd_hash_table *)
-                              xmalloc (sizeof (struct bfd_hash_table)));
+      link_info.notice_hash = xmalloc (sizeof (struct bfd_hash_table));
       if (! bfd_hash_table_init_n (link_info.notice_hash,
                                   bfd_hash_newfunc,
                                   61))
        einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
     }
 
       if (! bfd_hash_table_init_n (link_info.notice_hash,
                                   bfd_hash_newfunc,
                                   61))
        einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
     }
 
-  if (bfd_hash_lookup (link_info.notice_hash, name, TRUE, TRUE)
-      == (struct bfd_hash_entry *) NULL)
+  if (bfd_hash_lookup (link_info.notice_hash, name, TRUE, TRUE) == NULL)
     einfo (_("%P%F: bfd_hash_lookup failed: %E\n"));
 }
 
 /* Record a symbol to be wrapped, from the --wrap option.  */
 
 void
     einfo (_("%P%F: bfd_hash_lookup failed: %E\n"));
 }
 
 /* Record a symbol to be wrapped, from the --wrap option.  */
 
 void
-add_wrap (name)
-     const char *name;
+add_wrap (const char *name)
 {
   if (link_info.wrap_hash == NULL)
     {
 {
   if (link_info.wrap_hash == NULL)
     {
-      link_info.wrap_hash = ((struct bfd_hash_table *)
-                            xmalloc (sizeof (struct bfd_hash_table)));
+      link_info.wrap_hash = xmalloc (sizeof (struct bfd_hash_table));
       if (! bfd_hash_table_init_n (link_info.wrap_hash,
                                   bfd_hash_newfunc,
                                   61))
        einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
     }
       if (! bfd_hash_table_init_n (link_info.wrap_hash,
                                   bfd_hash_newfunc,
                                   61))
        einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
     }
+
   if (bfd_hash_lookup (link_info.wrap_hash, name, TRUE, TRUE) == NULL)
     einfo (_("%P%F: bfd_hash_lookup failed: %E\n"));
 }
   if (bfd_hash_lookup (link_info.wrap_hash, name, TRUE, TRUE) == NULL)
     einfo (_("%P%F: bfd_hash_lookup failed: %E\n"));
 }
@@ -702,8 +767,7 @@ add_wrap (name)
 /* Handle the -retain-symbols-file option.  */
 
 void
 /* Handle the -retain-symbols-file option.  */
 
 void
-add_keepsyms_file (filename)
-     const char *filename;
+add_keepsyms_file (const char *filename)
 {
   FILE *file;
   char *buf;
 {
   FILE *file;
   char *buf;
@@ -714,20 +778,19 @@ add_keepsyms_file (filename)
     einfo (_("%X%P: error: duplicate retain-symbols-file\n"));
 
   file = fopen (filename, "r");
     einfo (_("%X%P: error: duplicate retain-symbols-file\n"));
 
   file = fopen (filename, "r");
-  if (file == (FILE *) NULL)
+  if (file == NULL)
     {
       bfd_set_error (bfd_error_system_call);
       einfo ("%X%P: %s: %E\n", filename);
       return;
     }
 
     {
       bfd_set_error (bfd_error_system_call);
       einfo ("%X%P: %s: %E\n", filename);
       return;
     }
 
-  link_info.keep_hash = ((struct bfd_hash_table *)
-                        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))
     einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
 
   bufsize = 100;
   if (! bfd_hash_table_init (link_info.keep_hash, bfd_hash_newfunc))
     einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
 
   bufsize = 100;
-  buf = (char *) xmalloc (bufsize);
+  buf = xmalloc (bufsize);
 
   c = getc (file);
   while (c != EOF)
 
   c = getc (file);
   while (c != EOF)
@@ -753,8 +816,7 @@ add_keepsyms_file (filename)
 
          buf[len] = '\0';
 
 
          buf[len] = '\0';
 
-         if (bfd_hash_lookup (link_info.keep_hash, buf, TRUE, TRUE)
-             == (struct bfd_hash_entry *) NULL)
+         if (bfd_hash_lookup (link_info.keep_hash, buf, TRUE, TRUE) == NULL)
            einfo (_("%P%F: bfd_hash_lookup for insertion failed: %E\n"));
        }
     }
            einfo (_("%P%F: bfd_hash_lookup for insertion failed: %E\n"));
        }
     }
@@ -762,6 +824,7 @@ add_keepsyms_file (filename)
   if (link_info.strip != strip_none)
     einfo (_("%P: `-retain-symbols-file' overrides `-s' and `-S'\n"));
 
   if (link_info.strip != strip_none)
     einfo (_("%P: `-retain-symbols-file' overrides `-s' and `-S'\n"));
 
+  free (buf);
   link_info.strip = strip_some;
 }
 \f
   link_info.strip = strip_some;
 }
 \f
@@ -771,15 +834,13 @@ add_keepsyms_file (filename)
    a link.  */
 
 static bfd_boolean
    a link.  */
 
 static bfd_boolean
-add_archive_element (info, abfd, name)
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     bfd *abfd;
-     const char *name;
+add_archive_element (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                    bfd *abfd,
+                    const char *name)
 {
   lang_input_statement_type *input;
 
 {
   lang_input_statement_type *input;
 
-  input = ((lang_input_statement_type *)
-          xmalloc (sizeof (lang_input_statement_type)));
+  input = xmalloc (sizeof (lang_input_statement_type));
   input->filename = abfd->filename;
   input->local_sym_name = abfd->filename;
   input->the_bfd = abfd;
   input->filename = abfd->filename;
   input->local_sym_name = abfd->filename;
   input->the_bfd = abfd;
@@ -797,7 +858,7 @@ add_archive_element (info, abfd, name)
 
   ldlang_add_file (input);
 
 
   ldlang_add_file (input);
 
-  if (config.map_file != (FILE *) NULL)
+  if (config.map_file != NULL)
     {
       static bfd_boolean header_printed;
       struct bfd_link_hash_entry *h;
     {
       static bfd_boolean header_printed;
       struct bfd_link_hash_entry *h;
@@ -884,15 +945,14 @@ add_archive_element (info, abfd, name)
    multiple times.  */
 
 static bfd_boolean
    multiple times.  */
 
 static bfd_boolean
-multiple_definition (info, name, obfd, osec, oval, nbfd, nsec, nval)
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     const char *name;
-     bfd *obfd;
-     asection *osec;
-     bfd_vma oval;
-     bfd *nbfd;
-     asection *nsec;
-     bfd_vma nval;
+multiple_definition (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                    const char *name,
+                    bfd *obfd,
+                    asection *osec,
+                    bfd_vma oval,
+                    bfd *nbfd,
+                    asection *nsec,
+                    bfd_vma nval)
 {
   /* If either section has the output_section field set to
      bfd_abs_section_ptr, it means that the section is being
 {
   /* If either section has the output_section field set to
      bfd_abs_section_ptr, it means that the section is being
@@ -909,7 +969,7 @@ multiple_definition (info, name, obfd, osec, oval, nbfd, nsec, nval)
 
   einfo (_("%X%C: multiple definition of `%T'\n"),
         nbfd, nsec, nval, name);
 
   einfo (_("%X%C: multiple definition of `%T'\n"),
         nbfd, nsec, nval, name);
-  if (obfd != (bfd *) NULL)
+  if (obfd != NULL)
     einfo (_("%D: first defined here\n"), obfd, osec, oval);
 
   if (command_line.relax)
     einfo (_("%D: first defined here\n"), obfd, osec, oval);
 
   if (command_line.relax)
@@ -927,15 +987,14 @@ multiple_definition (info, name, obfd, osec, oval, nbfd, nsec, nval)
    -warn-common was used.  */
 
 static bfd_boolean
    -warn-common was used.  */
 
 static bfd_boolean
-multiple_common (info, name, obfd, otype, osize, nbfd, ntype, nsize)
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     const char *name;
-     bfd *obfd;
-     enum bfd_link_hash_type otype;
-     bfd_vma osize;
-     bfd *nbfd;
-     enum bfd_link_hash_type ntype;
-     bfd_vma nsize;
+multiple_common (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                const char *name,
+                bfd *obfd,
+                enum bfd_link_hash_type otype,
+                bfd_vma osize,
+                bfd *nbfd,
+                enum bfd_link_hash_type ntype,
+                bfd_vma nsize)
 {
   if (! config.warn_common)
     return TRUE;
 {
   if (! config.warn_common)
     return TRUE;
@@ -993,13 +1052,12 @@ multiple_common (info, name, obfd, otype, osize, nbfd, ntype, nsize)
    represent a value which should be added to the set.  */
 
 static bfd_boolean
    represent a value which should be added to the set.  */
 
 static bfd_boolean
-add_to_set (info, h, reloc, abfd, section, value)
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     struct bfd_link_hash_entry *h;
-     bfd_reloc_code_real_type reloc;
-     bfd *abfd;
-     asection *section;
-     bfd_vma value;
+add_to_set (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+           struct bfd_link_hash_entry *h,
+           bfd_reloc_code_real_type reloc,
+           bfd *abfd,
+           asection *section,
+           bfd_vma value)
 {
   if (config.warn_constructors)
     einfo (_("%P: warning: global constructor %s used\n"),
 {
   if (config.warn_constructors)
     einfo (_("%P: warning: global constructor %s used\n"),
@@ -1008,7 +1066,7 @@ add_to_set (info, h, reloc, abfd, section, value)
   if (! config.build_constructors)
     return TRUE;
 
   if (! config.build_constructors)
     return TRUE;
 
-  ldctor_add_set_entry (h, reloc, (const char *) NULL, section, value);
+  ldctor_add_set_entry (h, reloc, NULL, section, value);
 
   if (h->type == bfd_link_hash_new)
     {
 
   if (h->type == bfd_link_hash_new)
     {
@@ -1028,13 +1086,12 @@ add_to_set (info, h, reloc, abfd, section, value)
    adding an element to a set, but less general.  */
 
 static bfd_boolean
    adding an element to a set, but less general.  */
 
 static bfd_boolean
-constructor_callback (info, constructor, name, abfd, section, value)
-     struct bfd_link_info *info;
-     bfd_boolean constructor;
-     const char *name;
-     bfd *abfd;
-     asection *section;
-     bfd_vma value;
+constructor_callback (struct bfd_link_info *info,
+                     bfd_boolean constructor,
+                     const char *name,
+                     bfd *abfd,
+                     asection *section,
+                     bfd_vma value)
 {
   char *s;
   struct bfd_link_hash_entry *h;
 {
   char *s;
   struct bfd_link_hash_entry *h;
@@ -1049,7 +1106,7 @@ constructor_callback (info, constructor, name, abfd, section, value)
   /* 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.relocateable
+      && (link_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"));
 
@@ -1080,7 +1137,8 @@ constructor_callback (info, constructor, name, abfd, section, value)
 /* A structure used by warning_callback to pass information through
    bfd_map_over_sections.  */
 
 /* A structure used by warning_callback to pass information through
    bfd_map_over_sections.  */
 
-struct warning_callback_info {
+struct warning_callback_info
+{
   bfd_boolean found;
   const char *warning;
   const char *symbol;
   bfd_boolean found;
   const char *warning;
   const char *symbol;
@@ -1090,13 +1148,12 @@ struct warning_callback_info {
 /* This is called when there is a reference to a warning symbol.  */
 
 static bfd_boolean
 /* This is called when there is a reference to a warning symbol.  */
 
 static bfd_boolean
-warning_callback (info, warning, symbol, abfd, section, address)
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     const char *warning;
-     const char *symbol;
-     bfd *abfd;
-     asection *section;
-     bfd_vma address;
+warning_callback (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                 const char *warning,
+                 const char *symbol,
+                 bfd *abfd,
+                 asection *section,
+                 bfd_vma address)
 {
   /* This is a hack to support warn_multiple_gp.  FIXME: This should
      have a cleaner interface, but what?  */
 {
   /* This is a hack to support warn_multiple_gp.  FIXME: This should
      have a cleaner interface, but what?  */
@@ -1118,7 +1175,6 @@ warning_callback (info, warning, symbol, abfd, section, address)
 
       /* Look through the relocs to see if we can find a plausible
         address.  */
 
       /* Look through the relocs to see if we can find a plausible
         address.  */
-
       entry = (lang_input_statement_type *) abfd->usrdata;
       if (entry != NULL && entry->asymbols != NULL)
        asymbols = entry->asymbols;
       entry = (lang_input_statement_type *) abfd->usrdata;
       if (entry != NULL && entry->asymbols != NULL)
        asymbols = entry->asymbols;
@@ -1130,7 +1186,7 @@ warning_callback (info, warning, symbol, abfd, section, address)
          symsize = bfd_get_symtab_upper_bound (abfd);
          if (symsize < 0)
            einfo (_("%B%F: could not read symbols: %E\n"), abfd);
          symsize = bfd_get_symtab_upper_bound (abfd);
          if (symsize < 0)
            einfo (_("%B%F: could not read symbols: %E\n"), abfd);
-         asymbols = (asymbol **) xmalloc (symsize);
+         asymbols = xmalloc (symsize);
          symbol_count = bfd_canonicalize_symtab (abfd, asymbols);
          if (symbol_count < 0)
            einfo (_("%B%F: could not read symbols: %E\n"), abfd);
          symbol_count = bfd_canonicalize_symtab (abfd, asymbols);
          if (symbol_count < 0)
            einfo (_("%B%F: could not read symbols: %E\n"), abfd);
@@ -1145,7 +1201,7 @@ warning_callback (info, warning, symbol, abfd, section, address)
       info.warning = warning;
       info.symbol = symbol;
       info.asymbols = asymbols;
       info.warning = warning;
       info.symbol = symbol;
       info.asymbols = asymbols;
-      bfd_map_over_sections (abfd, warning_find_reloc, (PTR) &info);
+      bfd_map_over_sections (abfd, warning_find_reloc, &info);
 
       if (! info.found)
        einfo ("%B: %s\n", abfd, warning);
 
       if (! info.found)
        einfo ("%B: %s\n", abfd, warning);
@@ -1163,12 +1219,9 @@ warning_callback (info, warning, symbol, abfd, section, address)
    to give an error message with a file and line number.  */
 
 static void
    to give an error message with a file and line number.  */
 
 static void
-warning_find_reloc (abfd, sec, iarg)
-     bfd *abfd;
-     asection *sec;
-     PTR iarg;
+warning_find_reloc (bfd *abfd, asection *sec, void *iarg)
 {
 {
-  struct warning_callback_info *info = (struct warning_callback_info *) iarg;
+  struct warning_callback_info *info = iarg;
   long relsize;
   arelent **relpp;
   long relcount;
   long relsize;
   arelent **relpp;
   long relcount;
@@ -1183,7 +1236,7 @@ warning_find_reloc (abfd, sec, iarg)
   if (relsize == 0)
     return;
 
   if (relsize == 0)
     return;
 
-  relpp = (arelent **) xmalloc (relsize);
+  relpp = xmalloc (relsize);
   relcount = bfd_canonicalize_reloc (abfd, sec, relpp, info->asymbols);
   if (relcount < 0)
     einfo (_("%B%F: could not read relocs: %E\n"), abfd);
   relcount = bfd_canonicalize_reloc (abfd, sec, relpp, info->asymbols);
   if (relcount < 0)
     einfo (_("%B%F: could not read relocs: %E\n"), abfd);
@@ -1211,13 +1264,12 @@ warning_find_reloc (abfd, sec, iarg)
 /* This is called when an undefined symbol is found.  */
 
 static bfd_boolean
 /* This is called when an undefined symbol is found.  */
 
 static bfd_boolean
-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;
-     bfd_boolean fatal ATTRIBUTE_UNUSED;
+undefined_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                 const char *name,
+                 bfd *abfd,
+                 asection *section,
+                 bfd_vma address,
+                 bfd_boolean error)
 {
   static char *error_name;
   static unsigned int error_count;
 {
   static char *error_name;
   static unsigned int error_count;
@@ -1229,11 +1281,9 @@ undefined_symbol (info, name, abfd, section, address, fatal)
       static struct bfd_hash_table *hash;
 
       /* Only warn once about a particular undefined symbol.  */
       static struct bfd_hash_table *hash;
 
       /* Only warn once about a particular undefined symbol.  */
-
       if (hash == NULL)
        {
       if (hash == NULL)
        {
-         hash = ((struct bfd_hash_table *)
-                 xmalloc (sizeof (struct bfd_hash_table)));
+         hash = xmalloc (sizeof (struct bfd_hash_table));
          if (! bfd_hash_table_init (hash, bfd_hash_newfunc))
            einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
        }
          if (! bfd_hash_table_init (hash, bfd_hash_newfunc))
            einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
        }
@@ -1247,13 +1297,13 @@ undefined_symbol (info, name, abfd, section, address, fatal)
 
   /* We never print more than a reasonable number of errors in a row
      for a single symbol.  */
 
   /* We never print more than a reasonable number of errors in a row
      for a single symbol.  */
-  if (error_name != (char *) NULL
+  if (error_name != NULL
       && strcmp (name, error_name) == 0)
     ++error_count;
   else
     {
       error_count = 0;
       && strcmp (name, error_name) == 0)
     ++error_count;
   else
     {
       error_count = 0;
-      if (error_name != (char *) NULL)
+      if (error_name != NULL)
        free (error_name);
       error_name = xstrdup (name);
     }
        free (error_name);
       error_name = xstrdup (name);
     }
@@ -1262,48 +1312,87 @@ undefined_symbol (info, name, abfd, section, address, fatal)
     {
       if (error_count < MAX_ERRORS_IN_A_ROW)
        {
     {
       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)
        }
       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)
        {
     }
   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)
        }
       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;
 }
 
     }
 
   return TRUE;
 }
 
+/* Counter to limit the number of relocation overflow error messages
+   to print.  Errors are printed as it is decremented.  When it's
+   called and the counter is zero, a final message is printed
+   indicating more relocations were omitted.  When it gets to -1, no
+   such errors are printed.  If it's initially set to a value less
+   than -1, all such errors will be printed (--verbose does this).  */
+
+int overflow_cutoff_limit = 10;
+
 /* This is called when a reloc overflows.  */
 
 static bfd_boolean
 /* This is called when a reloc overflows.  */
 
 static bfd_boolean
-reloc_overflow (info, name, reloc_name, addend, abfd, section, address)
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     const char *name;
-     const char *reloc_name;
-     bfd_vma addend;
-     bfd *abfd;
-     asection *section;
-     bfd_vma address;
+reloc_overflow (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+               const char *name,
+               const char *reloc_name,
+               bfd_vma addend,
+               bfd *abfd,
+               asection *section,
+               bfd_vma address)
 {
 {
-  if (abfd == (bfd *) NULL)
+  if (overflow_cutoff_limit == -1)
+    return TRUE;
+
+  if (abfd == NULL)
     einfo (_("%P%X: generated"));
   else
     einfo ("%X%C:", abfd, section, address);
     einfo (_("%P%X: generated"));
   else
     einfo ("%X%C:", abfd, section, address);
+
+  if (overflow_cutoff_limit >= 0
+      && overflow_cutoff_limit-- == 0)
+    {
+      einfo (_(" additional relocation overflows omitted from the output\n"));
+      return TRUE;
+    }
+
   einfo (_(" relocation truncated to fit: %s %T"), reloc_name, name);
   if (addend != 0)
     einfo ("+%v", addend);
   einfo (_(" relocation truncated to fit: %s %T"), reloc_name, name);
   if (addend != 0)
     einfo ("+%v", addend);
@@ -1314,14 +1403,13 @@ reloc_overflow (info, name, reloc_name, addend, abfd, section, address)
 /* This is called when a dangerous relocation is made.  */
 
 static bfd_boolean
 /* This is called when a dangerous relocation is made.  */
 
 static bfd_boolean
-reloc_dangerous (info, message, abfd, section, address)
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     const char *message;
-     bfd *abfd;
-     asection *section;
-     bfd_vma address;
+reloc_dangerous (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                const char *message,
+                bfd *abfd,
+                asection *section,
+                bfd_vma address)
 {
 {
-  if (abfd == (bfd *) NULL)
+  if (abfd == NULL)
     einfo (_("%P%X: generated"));
   else
     einfo ("%X%C:", abfd, section, address);
     einfo (_("%P%X: generated"));
   else
     einfo ("%X%C:", abfd, section, address);
@@ -1333,14 +1421,13 @@ reloc_dangerous (info, message, abfd, section, address)
    that is not being output.  */
 
 static bfd_boolean
    that is not being output.  */
 
 static bfd_boolean
-unattached_reloc (info, name, abfd, section, address)
-     struct bfd_link_info *info ATTRIBUTE_UNUSED;
-     const char *name;
-     bfd *abfd;
-     asection *section;
-     bfd_vma address;
+unattached_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                 const char *name,
+                 bfd *abfd,
+                 asection *section,
+                 bfd_vma address)
 {
 {
-  if (abfd == (bfd *) NULL)
+  if (abfd == NULL)
     einfo (_("%P%X: generated"));
   else
     einfo ("%X%C:", abfd, section, address);
     einfo (_("%P%X: generated"));
   else
     einfo ("%X%C:", abfd, section, address);
@@ -1353,12 +1440,11 @@ unattached_reloc (info, name, abfd, section, address)
    using the -y option.  */
 
 static bfd_boolean
    using the -y option.  */
 
 static bfd_boolean
-notice (info, name, abfd, section, value)
-     struct bfd_link_info *info;
-     const char *name;
-     bfd *abfd;
-     asection *section;
-     bfd_vma value;
+notice (struct bfd_link_info *info,
+       const char *name,
+       bfd *abfd,
+       asection *section,
+       bfd_vma value)
 {
   if (! info->notice_all
       || (info->notice_hash != NULL
 {
   if (! info->notice_all
       || (info->notice_hash != NULL
This page took 0.037541 seconds and 4 git commands to generate.