Index: dirsearch.cc =================================================================== RCS file: /cvs/src/src/gold/dirsearch.cc,v retrieving revision 1.14 diff -u -r1.14 dirsearch.cc --- dirsearch.cc 3 Jul 2011 04:16:13 -0000 1.14 +++ dirsearch.cc 17 Nov 2011 17:43:26 -0000 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include "debug.h" @@ -277,4 +278,28 @@ return std::string(); } +// Search for a file in a directory list. This is a low-level function and +// therefore can be used before options and parameters are set. + +std::string +Dirsearch::find_file_in_dir_list(const std::string& name, + const General_options::Dir_list& directories, + const std::string& extra_search_dir) +{ + struct stat buf; + std::string extra_name = extra_search_dir + '/' + name; + + if (stat(extra_name.c_str(), &buf) == 0) + return extra_name; + for (General_options::Dir_list::const_iterator dir = directories.begin(); + dir != directories.end(); + ++dir) + { + std::string full_name = dir->name() + '/' + name; + if (stat(full_name.c_str(), &buf) == 0) + return full_name; + } + return name; +} + } // End namespace gold. Index: dirsearch.h =================================================================== RCS file: /cvs/src/src/gold/dirsearch.h,v retrieving revision 1.9 diff -u -r1.9 dirsearch.h --- dirsearch.h 25 May 2011 06:15:28 -0000 1.9 +++ dirsearch.h 17 Nov 2011 17:43:26 -0000 @@ -67,6 +67,13 @@ token() { return &this->token_; } + // Search for a file in a directory list. This is a low-level function and + // therefore can be used before options and parameters are set. + static std::string + find_file_in_dir_list(const std::string& name, + const General_options::Dir_list& directories, + const std::string& extra_search_dir); + private: // We can not copy this class. Dirsearch(const Dirsearch&); Index: script.cc =================================================================== RCS file: /cvs/src/src/gold/script.cc,v retrieving revision 1.85 diff -u -r1.85 script.cc --- script.cc 31 Oct 2011 22:51:03 -0000 1.85 +++ script.cc 17 Nov 2011 17:43:26 -0000 @@ -1535,18 +1535,26 @@ 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 @@ 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 @@ } 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(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.