diff options
author | Tristan Gingold <gingold@adacore.com> | 2011-11-02 16:28:31 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2011-11-02 16:28:31 +0000 |
commit | a72173de2524e96e0d9515f36cc033016d619e0f (patch) | |
tree | 9c0d3b736287fc6dd79e484c31fa233be1873c17 /ld/emultempl/aix.em | |
parent | e0d08d4b30212f2eb03b8d1da8262d48e636bd71 (diff) | |
download | gdb-a72173de2524e96e0d9515f36cc033016d619e0f.zip gdb-a72173de2524e96e0d9515f36cc033016d619e0f.tar.gz gdb-a72173de2524e96e0d9515f36cc033016d619e0f.tar.bz2 |
2011-11-02 Tristan Gingold <gingold@adacore.com>
* emultempl/aix.em (read_file_list): New function.
(_handle_option): Handle '-f'.
* NEWS: Mention this feature.
Diffstat (limited to 'ld/emultempl/aix.em')
-rw-r--r-- | ld/emultempl/aix.em | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/ld/emultempl/aix.em b/ld/emultempl/aix.em index d374c0c..f4660ec 100644 --- a/ld/emultempl/aix.em +++ b/ld/emultempl/aix.em @@ -259,7 +259,7 @@ gld${EMULATION_NAME}_add_options {NULL, no_argument, NULL, 0} }; - /* Options supported by the AIX linker which we do not support: -f, + /* Options supported by the AIX linker which we do not support: -S, -v, -Z, -bbindcmds, -bbinder, -bbindopts, -bcalls, -bcaps, -bcror15, -bdebugopt, -bdbg, -bdelcsect, -bex?, -bfilelist, -bfl, -bgcbypass, -bglink, -binsert, -bi, -bloadmap, -bl, -bmap, -bnl, @@ -303,6 +303,76 @@ gld${EMULATION_NAME}_parse_args (int argc, char **argv) return FALSE; } +/* Helper for option '-f', which specify a list of input files. + Contrary to the native linker, we don't support shell patterns + (simply because glob isn't always available). */ + +static void +read_file_list (const char *filename) +{ + FILE *f; + /* An upper bound on the number of characters in the file. */ + long pos; + /* File in memory. */ + char *buffer; + size_t len; + char *b; + char *e; + + f = fopen (filename, FOPEN_RT); + if (f == NULL) + { + einfo ("%F%P: cannot open %s\n", filename); + return; + } + if (fseek (f, 0L, SEEK_END) == -1) + goto error; + pos = ftell (f); + if (pos == -1) + goto error; + if (fseek (f, 0L, SEEK_SET) == -1) + goto error; + + buffer = (char *) xmalloc (pos + 1); + len = fread (buffer, sizeof (char), pos, f); + if (len != (size_t) pos && ferror (f)) + goto error; + /* Add a NUL terminator. */ + buffer[len] = '\0'; + fclose (f); + + /* Parse files. */ + b = buffer; + while (1) + { + /* Skip empty lines. */ + while (*b == '\n' || *b == '\r') + b++; + + /* Stop if end of buffer. */ + if (b == buffer + len) + break; + + /* Eat any byte until end of line. */ + for (e = b; *e != '\0'; e++) + if (*e == '\n' || *e == '\r') + break; + + /* Replace end of line by nul. */ + if (*e != '\0') + *e++ = '\0'; + + if (b != e) + lang_add_input_file (b, lang_input_file_is_search_file_enum, NULL); + b = e; + } + return; + + error: + einfo ("%F%P: cannot read %s\n", optarg); + fclose (f); +} + static bfd_boolean gld${EMULATION_NAME}_handle_option (int optc) { @@ -318,6 +388,12 @@ gld${EMULATION_NAME}_handle_option (int optc) /* Long option which just sets a flag. */ break; + case 'f': + /* This overrides --auxiliary. This option specifies a file containing + a list of input files. */ + read_file_list (optarg); + break; + case 'D': val = bfd_scan_vma (optarg, &end, 0); if (*end != '\0') |