This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: [PATCH/RFC] ld checks for input/output file conflicts
On Sat, Oct 05, 2002 at 02:06:31PM -0400, Daniel Jacobowitz wrote:
> Duplications? I'm not sure you can disallow them. For instance, do ar
> archives go through that routine? If so, you broke GCC - -lgcc -c
> -lgcc.
>
> The other bit I like.
OK.
ld/ChangeLog
2002-10-05 Elias Athanasopoulos <eathan@otenet.gr>
* ldlang.c (lang_file_exist): New function.
(new_afile): Abort if the filename to be added matches the linker
output filename.
* ldlang.h: Add prototype for lang_file_exist.
* lexsup.c (parse_args): Abort if the output filename matches
one of the input filenames.
--- ldlang.c.orig Fri Oct 4 19:15:58 2002
+++ ldlang.c Sun Oct 6 03:18:44 2002
@@ -476,6 +476,27 @@ new_statement (type, size, list)
return new;
}
+/* Check if a file exist in the input_file_chain list */
+
+boolean
+lang_file_exist (name)
+ const char *name;
+{
+ lang_input_statement_type *p;
+
+ for (p = (lang_input_statement_type *) input_file_chain.head;
+ p != (lang_input_statement_type *) NULL;
+ p = (lang_input_statement_type *) p->next_real_file)
+ {
+ if (p->filename != (char *) NULL
+ && name != (char *) NULL
+ && strcmp (p->filename, name) == 0)
+ return 1;
+ }
+
+ return 0;
+}
+
/* Build a new input file node for the language. There are several
ways in which we treat an input file, eg, we only look at symbols,
or prefix it with a -l etc.
@@ -493,7 +514,14 @@ new_afile (name, file_type, target, add_
boolean add_to_list;
{
lang_input_statement_type *p;
-
+
+ /* We abort if the input file is identical with the output. */
+ if (name != NULL && output_filename != NULL && !strcmp (name, output_filename))
+ {
+ einfo ("%P%F: input file %s has been used as output. Aborting.\n", name);
+ xexit (1);
+ }
+
if (add_to_list)
p = new_stat (lang_input_statement, stat_ptr);
else
--- ldlang.h.orig Fri Oct 4 19:14:05 2002
+++ ldlang.h Fri Oct 4 20:37:50 2002
@@ -483,5 +483,6 @@ extern void lang_register_vers_node
struct bfd_elf_version_deps *));
boolean unique_section_p PARAMS ((const char *));
extern void lang_add_unique PARAMS ((const char *));
+extern boolean lang_file_exist PARAMS ((const char *));
#endif
--- lexsup.c.orig Fri Oct 4 18:54:41 2002
+++ lexsup.c Sat Oct 5 19:43:53 2002
@@ -796,7 +796,12 @@ parse_args (argc, argv)
link_info.optimize = strtoul (optarg, NULL, 0) ? true : false;
break;
case 'o':
- lang_add_output (optarg, 0);
+ if (lang_file_exist (optarg))
+ {
+ einfo ("%P%F: output file %s has been used as input. Aborting.\n", optarg);
+ xexit (1);
+ }
+ lang_add_output (optarg, 0);
break;
case OPTION_OFORMAT:
lang_add_output_format (optarg, (char *) NULL, (char *) NULL, 0);