aboutsummaryrefslogtreecommitdiff
path: root/gold/script.cc
diff options
context:
space:
mode:
authorSterling Augustine <saugustine@google.com>2011-11-17 17:46:54 +0000
committerSterling Augustine <saugustine@google.com>2011-11-17 17:46:54 +0000
commit628f39beca35cfdf725fdb4f855272c1166ad656 (patch)
tree1b820aae7730c0b44b8c10f05c98b58dd9650afe /gold/script.cc
parenta7bbf4e9b9ed14909afef85db4ffc91a6f4cb50a (diff)
downloadbinutils-628f39beca35cfdf725fdb4f855272c1166ad656.zip
binutils-628f39beca35cfdf725fdb4f855272c1166ad656.tar.gz
binutils-628f39beca35cfdf725fdb4f855272c1166ad656.tar.bz2
2011-11-17 Sterling Augustine <saugustine@google.com>
* script.cc (script_include_directive): Implement. (read_script_file): New local variables name and search_path. Update comment. Call IS_ABSOLUTE_PATH and Dirsearch::find_file_in_dir_list. * dirsearch.h (Dirsearch::find_file_in_dir_list): Declare new method. * dirsearch.cc (Dirsearch::find_file_in_dir_list): Implement it.
Diffstat (limited to 'gold/script.cc')
-rw-r--r--gold/script.cc29
1 files changed, 20 insertions, 9 deletions
diff --git a/gold/script.cc b/gold/script.cc
index b471cf9..6a10c40 100644
--- a/gold/script.cc
+++ b/gold/script.cc
@@ -1535,18 +1535,26 @@ read_input_script(Workqueue* workqueue, Symbol_table* symtab, Layout* layout,
return true;
}
-// Helper function for read_version_script() and
-// read_commandline_script(). Processes the given file in the mode
-// indicated by first_token and lex_mode.
+// Helper function for read_version_script(), read_commandline_script() and
+// script_include_directive(). Processes the given file in the mode indicated
+// by first_token and lex_mode.
static bool
read_script_file(const char* filename, Command_line* cmdline,
Script_options* script_options,
int first_token, Lex::Mode lex_mode)
{
- // TODO: if filename is a relative filename, search for it manually
- // using "." + cmdline->options()->search_path() -- not dirsearch.
Dirsearch dirsearch;
+ std::string name = filename;
+
+ // If filename is a relative filename, search for it manually using "." +
+ // cmdline->options()->library_path() -- not dirsearch.
+ if (!IS_ABSOLUTE_PATH(filename))
+ {
+ const General_options::Dir_list& search_path =
+ cmdline->options().library_path();
+ name = Dirsearch::find_file_in_dir_list(name, search_path, ".");
+ }
// The file locking code wants to record a Task, but we haven't
// started the workqueue yet. This is only for debugging purposes,
@@ -1557,7 +1565,7 @@ read_script_file(const char* filename, Command_line* cmdline,
Position_dependent_options posdep = cmdline->position_dependent_options();
if (posdep.format_enum() == General_options::OBJECT_FORMAT_BINARY)
posdep.set_format_enum(General_options::OBJECT_FORMAT_ELF);
- Input_file_argument input_argument(filename,
+ Input_file_argument input_argument(name.c_str(),
Input_file_argument::INPUT_FILE_TYPE_FILE,
"", false, posdep);
Input_file input_file(&input_argument);
@@ -3351,10 +3359,13 @@ script_parse_memory_attr(void* closurev, const char* attrs, size_t attrlen,
}
extern "C" void
-script_include_directive(void* closurev, const char*, size_t)
+script_include_directive(void* closurev, const char* filename, size_t length)
{
- // FIXME: Implement ?
- yyerror (closurev, _("GOLD does not currently support INCLUDE directives"));
+ Parser_closure* closure = static_cast<Parser_closure*>(closurev);
+ std::string name(filename, length);
+ Command_line* cmdline = closure->command_line();
+ read_script_file(name.c_str(), cmdline, &cmdline->script_options(),
+ PARSING_LINKER_SCRIPT, Lex::LINKER_SCRIPT);
}
// Functions for memory regions.