summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2023-03-12 13:27:38 +1030
committerAlan Modra <amodra@gmail.com>2023-03-14 12:14:32 +1030
commitadb9ac5f3984b4ad2d8be1550dc5683d6129e1a6 (patch)
treef0c3287356bda7212583c29ef9b1dedc5a4244a5 /gas
parenta2aee680684ec8c79bbdc169d73fe5111e8e9a64 (diff)
downloadbinutils-gdb-adb9ac5f3984b4ad2d8be1550dc5683d6129e1a6.tar.gz
gas .include and .incbin
This fixes a bug in .include and .incbin where given an absolute path the -I dirs would be searched for the path. * read.c (include_dir_count, include_dir_maxlen): Make them size_t. (search_and_open): New function. (s_incbin, s_include): Use search_and_open. (init_include_dir): New function. (add_include_dir): Don't set initial "." dir here. * read.h (include_dir_count, include_dir_maxlen): Update. (init_include_dir, search_and_open): Declare. * as.c (gas_early_init): Call init_include_dir. * config/tc-rx.c (rx_include): Avoid warning by using size_t. * config/tc-tic54x.c (tic54x_set_default_include): Simplify and use notes for include path. (tic54x_mlib): Use search_and_open.
Diffstat (limited to 'gas')
-rw-r--r--gas/as.c2
-rw-r--r--gas/config/tc-rx.c4
-rw-r--r--gas/config/tc-tic54x.c55
-rw-r--r--gas/read.c102
-rw-r--r--gas/read.h8
5 files changed, 66 insertions, 105 deletions
diff --git a/gas/as.c b/gas/as.c
index a18438c2542..593eaec7f14 100644
--- a/gas/as.c
+++ b/gas/as.c
@@ -1308,6 +1308,8 @@ gas_early_init (int *argcp, char ***argvp)
expandargv (argcp, argvp);
+ init_include_dir ();
+
#ifdef HOST_SPECIAL_INIT
HOST_SPECIAL_INIT (*argcp, *argvp);
#endif
diff --git a/gas/config/tc-rx.c b/gas/config/tc-rx.c
index 36b7f0bf9c6..c011ec11b4b 100644
--- a/gas/config/tc-rx.c
+++ b/gas/config/tc-rx.c
@@ -380,9 +380,7 @@ rx_include (int ignore)
if (try == NULL)
{
- int i;
-
- for (i = 0; i < include_dir_count; i++)
+ for (size_t i = 0; i < include_dir_count; i++)
{
sprintf (path, "%s/%s", include_dirs[i], f);
if ((try = fopen (path, FOPEN_RT)) != NULL)
diff --git a/gas/config/tc-tic54x.c b/gas/config/tc-tic54x.c
index f687dfe5abb..4dc1dbf28d7 100644
--- a/gas/config/tc-tic54x.c
+++ b/gas/config/tc-tic54x.c
@@ -1909,35 +1909,22 @@ tic54x_clink (int ignored ATTRIBUTE_UNUSED)
}
/* Change the default include directory to be the current source file's
- directory, instead of the current working directory. If DOT is non-zero,
- set to "." instead. */
+ directory. */
static void
tic54x_set_default_include (void)
{
- char *dir, *tmp = NULL;
- const char *curfile;
unsigned lineno;
-
- curfile = as_where (&lineno);
- dir = xstrdup (curfile);
- tmp = strrchr (dir, '/');
+ const char *curfile = as_where (&lineno);
+ const char *tmp = strrchr (curfile, '/');
if (tmp != NULL)
{
- int len;
-
- *tmp = '\0';
- len = strlen (dir);
- if (include_dir_count == 0)
- {
- include_dirs = XNEWVEC (const char *, 1);
- include_dir_count = 1;
- }
- include_dirs[0] = dir;
+ size_t len = tmp - curfile;
if (len > include_dir_maxlen)
include_dir_maxlen = len;
+ include_dirs[0] = notes_memdup (curfile, len, len + 1);
}
- else if (include_dirs != NULL)
+ else
include_dirs[0] = ".";
}
@@ -2325,7 +2312,7 @@ tic54x_mlib (int ignore ATTRIBUTE_UNUSED)
{
char *filename;
char *path;
- int len, i;
+ int len;
bfd *abfd, *mbfd;
ILLEGAL_WITHIN_STRUCT ();
@@ -2353,31 +2340,11 @@ tic54x_mlib (int ignore ATTRIBUTE_UNUSED)
demand_empty_rest_of_line ();
tic54x_set_default_include ();
- path = XNEWVEC (char, (unsigned long) len + include_dir_maxlen + 5);
-
- for (i = 0; i < include_dir_count; i++)
- {
- FILE *try;
-
- strcpy (path, include_dirs[i]);
- strcat (path, "/");
- strcat (path, filename);
- if ((try = fopen (path, "r")) != NULL)
- {
- fclose (try);
- break;
- }
- }
-
- if (i >= include_dir_count)
- {
- free (path);
- path = filename;
- }
+ path = notes_alloc (len + include_dir_maxlen + 2);
+ FILE *try = search_and_open (filename, path);
+ if (try)
+ fclose (try);
- /* FIXME: if path is found, malloc'd storage is not freed. Of course, this
- happens all over the place, and since the assembler doesn't usually keep
- running for a very long time, it really doesn't matter. */
register_dependency (path);
/* Expand all archive entries to temporary files and include them. */
diff --git a/gas/read.c b/gas/read.c
index cff44623541..08312ff6d2f 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -40,6 +40,7 @@
#include "dw2gencfi.h"
#include "codeview.h"
#include "wchar.h"
+#include "filenames.h"
#include <limits.h>
@@ -173,10 +174,10 @@ int target_big_endian = TARGET_BYTES_BIG_ENDIAN;
const char **include_dirs;
/* How many are in the table. */
-int include_dir_count;
+size_t include_dir_count;
/* Length of longest in table. */
-int include_dir_maxlen = 1;
+size_t include_dir_maxlen;
#ifndef WORKING_DOT_WORD
struct broken_word *broken_words;
@@ -5746,6 +5747,30 @@ equals (char *sym_name, int reassign)
}
}
+/* Open FILENAME, first trying the unadorned file name, then if that
+ fails and the file name is not an absolute path, attempt to open
+ the file in current -I include paths. PATH is a preallocated
+ buffer which will be set to the file opened, or FILENAME if no file
+ is found. */
+
+FILE *
+search_and_open (const char *filename, char *path)
+{
+ FILE *f = fopen (filename, FOPEN_RB);
+ if (f == NULL && !IS_ABSOLUTE_PATH (filename))
+ {
+ for (size_t i = 0; i < include_dir_count; i++)
+ {
+ sprintf (path, "%s/%s", include_dirs[i], filename);
+ f = fopen (path, FOPEN_RB);
+ if (f != NULL)
+ return f;
+ }
+ }
+ strcpy (path, filename);
+ return f;
+}
+
/* .incbin -- include a file verbatim at the current location. */
void
@@ -5797,30 +5822,12 @@ s_incbin (int x ATTRIBUTE_UNUSED)
demand_empty_rest_of_line ();
- /* Try opening absolute path first, then try include dirs. */
- binfile = fopen (filename, FOPEN_RB);
- if (binfile == NULL)
- {
- int i;
-
- path = XNEWVEC (char, (unsigned long) len + include_dir_maxlen + 5);
-
- for (i = 0; i < include_dir_count; i++)
- {
- sprintf (path, "%s/%s", include_dirs[i], filename);
-
- binfile = fopen (path, FOPEN_RB);
- if (binfile != NULL)
- break;
- }
+ path = XNEWVEC (char, len + include_dir_maxlen + 2);
+ binfile = search_and_open (filename, path);
- if (binfile == NULL)
- as_bad (_("file not found: %s"), filename);
- }
+ if (binfile == NULL)
+ as_bad (_("file not found: %s"), filename);
else
- path = xstrdup (filename);
-
- if (binfile)
{
long file_len;
struct stat filestat;
@@ -5914,48 +5921,33 @@ s_include (int arg ATTRIBUTE_UNUSED)
}
demand_empty_rest_of_line ();
- path = notes_alloc ((size_t) i + include_dir_maxlen + 5);
- for (i = 0; i < include_dir_count; i++)
- {
- strcpy (path, include_dirs[i]);
- strcat (path, "/");
- strcat (path, filename);
- if (0 != (try_file = fopen (path, FOPEN_RT)))
- {
- fclose (try_file);
- goto gotit;
- }
- }
+ path = notes_alloc (i + include_dir_maxlen + 2);
+ try_file = search_and_open (filename, path);
+ if (try_file)
+ fclose (try_file);
- notes_free (path);
- path = filename;
- gotit:
register_dependency (path);
input_scrub_insert_file (path);
}
void
-add_include_dir (char *path)
+init_include_dir (void)
{
- int i;
-
- if (include_dir_count == 0)
- {
- include_dirs = XNEWVEC (const char *, 2);
- include_dirs[0] = "."; /* Current dir. */
- include_dir_count = 2;
- }
- else
- {
- include_dir_count++;
- include_dirs = XRESIZEVEC (const char *, include_dirs,
- include_dir_count);
- }
+ include_dirs = XNEWVEC (const char *, 1);
+ include_dirs[0] = "."; /* Current dir. */
+ include_dir_count = 1;
+ include_dir_maxlen = 1;
+}
+void
+add_include_dir (char *path)
+{
+ include_dir_count++;
+ include_dirs = XRESIZEVEC (const char *, include_dirs, include_dir_count);
include_dirs[include_dir_count - 1] = path; /* New one. */
- i = strlen (path);
+ size_t i = strlen (path);
if (i > include_dir_maxlen)
include_dir_maxlen = i;
}
diff --git a/gas/read.h b/gas/read.h
index 406b026d76f..42efce9e79d 100644
--- a/gas/read.h
+++ b/gas/read.h
@@ -79,8 +79,8 @@ extern const char line_separator_chars[];
/* Table of -I directories. */
extern const char **include_dirs;
-extern int include_dir_count;
-extern int include_dir_maxlen;
+extern size_t include_dir_count;
+extern size_t include_dir_maxlen;
/* The offset in the absolute section. */
extern addressT abs_section_offset;
@@ -124,7 +124,9 @@ extern unsigned int next_char_of_string (void);
extern void s_mri_sect (char *);
extern char *mri_comment_field (char *);
extern void mri_comment_end (char *, int);
-extern void add_include_dir (char *path);
+extern void init_include_dir (void);
+extern void add_include_dir (char *);
+extern FILE *search_and_open (const char *, char *);
extern void cons (int nbytes);
extern void demand_empty_rest_of_line (void);
extern void emit_expr (expressionS *exp, unsigned int nbytes);