+2001-04-27 Jeffrey Oldham <oldham@codesourcery.com>
+
+ * collect2.c (main): Add `-L' case to remove duplicate entries.
+ (is_in_args): New function to check for a duplicate argument.
+ * defaults.h (LINK_ELIMINATE_DUPLICATE_LDIRECTORIES): New macro.
+ * tm.texi (LINK_ELIMINATE_DUPLICATE_LDIRECTORIES): New documentation.
+ * config/mips/iris6.h (LINK_ELIMINATE_DUPLICATE_LDIRECTORIES):
+ Define to be nonzero.
+
2001-04-27 Andreas Jaeger <aj@suse.de>
Richard Henderson <rth@redhat.com>
#ifdef SCAN_LIBRARIES
static void scan_libraries PARAMS ((const char *));
#endif
+#if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
+static int is_in_args PARAMS ((const char *, const char **, const char **));
+#endif
#ifdef COLLECT_EXPORT_LIST
static int is_in_list PARAMS ((const char *, struct id *));
static void write_aix_file PARAMS ((FILE *, struct id *));
case 'L':
add_prefix (&cmdline_lib_dirs, arg+2);
break;
+#else
+#if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
+ case 'L':
+ if (is_in_args (arg, (const char **) ld1_argv, ld1-1))
+ --ld1;
+ break;
+#endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
#endif
case 'o':
}
}
+#if LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
+/* Given a STRING, return nonzero if it occurs in the list in range
+ [ARGS_BEGIN,ARGS_END). */
+
+static int
+is_in_args (string, args_begin, args_end)
+ const char *string;
+ const char **args_begin;
+ const char **args_end;
+{
+ const char **args_pointer;
+ for (args_pointer = args_begin; args_pointer != args_end; ++args_pointer)
+ if (strcmp (string, *args_pointer) == 0)
+ return 1;
+ return 0;
+}
+#endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
+
#ifdef COLLECT_EXPORT_LIST
/* This function is really used only on AIX, but may be useful. */
static int
#undef SUPPORTS_INIT_PRIORITY
#define SUPPORTS_INIT_PRIORITY 0
+/* A linker error can empirically be avoided by removing duplicate
+ library search directories. */
+#define LINK_ELIMINATE_DUPLICATE_LDIRECTORIES 1
+
#define POPSECTION_ASM_OP "\t.popsection"
#define DEBUG_INFO_SECTION ".debug_info,0x7000001e,0,0,1"
#define SUPPORTS_INIT_PRIORITY 1
#endif /* SUPPORTS_INIT_PRIORITY */
+/* If duplicate library search directories can be removed from a
+ linker command without changing the linker's semantics, give this
+ symbol a nonzero. */
+#ifndef LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
+#define LINK_ELIMINATE_DUPLICATE_LDIRECTORIES 0
+#endif /* LINK_ELIMINATE_DUPLICATE_LDIRECTORIES */
+
/* If we have a definition of INCOMING_RETURN_ADDR_RTX, assume that
the rest of the DWARF 2 frame unwind support is also provided. */
#if !defined (DWARF2_UNWIND_INFO) && defined (INCOMING_RETURN_ADDR_RTX)
line for invoking the linker and there is no other way to accomplish
the effect you need.
+@findex LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
+@item LINK_ELIMINATE_DUPLICATE_LDIRECTORIES
+A nonzero value causes collect2 to remove duplicate -L<directory> search
+directories from linking commands. Do not give it a nonzero value if
+removing duplicate search directories changes the linker's semantics.
+
@findex MULTILIB_DEFAULTS
@item MULTILIB_DEFAULTS
Define this macro as a C expression for the initializer of an array of