This is the mail archive of the
mailing list for the GCC project.
[Patch] Add support of AIX response files in collect2
- From: Tristan Gingold <gingold at adacore dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: David Edelsohn <dje dot gcc at gmail dot com>
- Date: Fri, 21 Oct 2011 12:39:38 +0200
- Subject: [Patch] Add support of AIX response files in collect2
the AIX linker supports response files with the '-fFILE' command line option.
With this patch, collect2 reads the content of the response files and listed object files are handled. Therefore these files are not forgotten by the collect2 machinery.
Although AIX ld supports glob(3) patterns, this isn't handled by this patch because glob() isn't available on all hosts, isn't present in libiberty and its use is not common. To be considered for the future.
I haven't added a testcase for this because I think this is not possible with only one file. But hints are welcome.
Reduced bootstrap on rs6000-aix
Ok for trunk ?
2011-10-21 Tristan Gingold <email@example.com>
* collect2.c (main): Add support of -f (response file) on AIX.
diff --git a/gcc/collect2.c b/gcc/collect2.c
index cf39693..fd747b5 100644
@@ -1091,6 +1091,7 @@ main (int argc, char **argv)
const char **ld2;
const char **object;
+ int object_nbr = argc;
@@ -1440,6 +1441,57 @@ main (int argc, char **argv)
+ /* File containing a list of input files to process. */
+ FILE *stream;
+ char buf[MAXPATHLEN + 2];
+ /* Number of additionnal object files. */
+ int add_nbr = 0;
+ /* Maximum of additionnal object files before vector
+ expansion. */
+ int add_max = 0;
+ const char *list_filename = arg + 2;
+ /* Accept -fFILENAME and -f FILENAME. */
+ if (*list_filename == '\0' && argv)
+ list_filename = *argv;
+ *ld1++ = *ld2++ = *argv;
+ stream = fopen (list_filename, "r");
+ if (stream == NULL)
+ fatal_error ("can't open %s: %m", list_filename);
+ while (fgets (buf, sizeof buf, stream) != NULL)
+ /* Remove end of line. */
+ int len = strlen (buf);
+ if (len >= 1 && buf[len - 1] =='\n')
+ buf[len - 1] = '\0';
+ /* Put on object vector.
+ Note: we only expanse vector here, so we must keep
+ extra space for remaining arguments. */
+ if (add_nbr >= add_max)
+ int pos = object - (const char **)object_lst;
+ add_max = (add_max == 0) ? 16 : add_max * 2;
+ object_lst = XRESIZEVEC(char *, object_lst,
+ object_nbr + add_max);
+ object = (const char **)object_lst + pos;
+ object_nbr += add_max;
+ *object++ = xstrdup(buf);
+ fclose (stream);