mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 02:24:46 +08:00
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.
This commit is contained in:
parent
a2aee68068
commit
adb9ac5f39
2
gas/as.c
2
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
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
path = notes_alloc (len + include_dir_maxlen + 2);
|
||||
FILE *try = search_and_open (filename, path);
|
||||
if (try)
|
||||
fclose (try);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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. */
|
||||
|
102
gas/read.c
102
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);
|
||||
path = XNEWVEC (char, len + include_dir_maxlen + 2);
|
||||
binfile = search_and_open (filename, path);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (binfile == NULL)
|
||||
as_bad (_("file not found: %s"), filename);
|
||||
}
|
||||
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
|
||||
init_include_dir (void)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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_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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user