This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gold patch committed: Add support for EXTERN in linker scripts


I committed this patch to gold to add support for EXTERN in linker
scripts.  EXTERN names an undefined symbol, like -u on the command line.

Ian


2009-03-24  Ian Lance Taylor  <iant@google.com>

	* yyscript.y (file_cmd): Recognize EXTERN.
	(extern_name_list, extern_name_list_body): New nonterminals.
	* script.cc (script_add_extern): Define.
	* script-c.h (script_add_extern): Declare.


Index: script-c.h
===================================================================
RCS file: /cvs/src/src/gold/script-c.h,v
retrieving revision 1.13
diff -p -u -r1.13 script-c.h
--- script-c.h	14 Mar 2009 05:56:46 -0000	1.13
+++ script-c.h	24 Mar 2009 19:07:30 -0000
@@ -211,6 +211,12 @@ yylex(YYSTYPE*, void* closure);
 extern void
 yyerror(void* closure, const char*);
 
+/* Called by the bison parser to add an external symbol (a symbol in
+   an EXTERN declaration) to the link.  */
+
+extern void
+script_add_extern(void* closure, const char*, size_t);
+
 /* Called by the bison parser to add a file to the link.  */
 
 extern void
Index: script.cc
===================================================================
RCS file: /cvs/src/src/gold/script.cc,v
retrieving revision 1.51
diff -p -u -r1.51 script.cc
--- script.cc	14 Mar 2009 05:56:46 -0000	1.51
+++ script.cc	24 Mar 2009 19:07:30 -0000
@@ -2119,6 +2119,19 @@ yyerror(void* closurev, const char* mess
 	     closure->charpos(), message);
 }
 
+// Called by the bison parser to add an external symbol to the link.
+
+extern "C" void
+script_add_extern(void* closurev, const char* name, size_t length)
+{
+  // We treat exactly like -u NAME.  FIXME: If it seems useful, we
+  // could handle this after the command line has been read, by adding
+  // entries to the symbol table directly.
+  std::string arg("--undefined=");
+  arg.append(name, length);
+  script_parse_option(closurev, arg.c_str(), arg.size());
+}
+
 // Called by the bison parser to add a file to the link.
 
 extern "C" void
Index: yyscript.y
===================================================================
RCS file: /cvs/src/src/gold/yyscript.y,v
retrieving revision 1.19
diff -p -u -r1.19 yyscript.y
--- yyscript.y	14 Mar 2009 05:56:46 -0000	1.19
+++ yyscript.y	24 Mar 2009 19:07:30 -0000
@@ -234,7 +234,8 @@ linker_script:
 
 /* A command which may appear at top level of a linker script.  */
 file_cmd:
-	  FORCE_COMMON_ALLOCATION
+	  EXTERN '(' extern_name_list ')'
+	| FORCE_COMMON_ALLOCATION
 	    { script_set_common_allocation(closure, 1); }
 	| GROUP
 	    { script_start_group(closure); }
@@ -282,6 +283,25 @@ ignore_cmd:
 	  OUTPUT_ARCH '(' string ')'
 	;
 
+/* A list of external undefined symbols.  We put the lexer into
+   expression mode so that commas separate names; this is what the GNU
+   linker does.  */
+
+extern_name_list:
+	    { script_push_lex_into_expression_mode(closure); }
+	  extern_name_list_body
+	    { script_pop_lex_mode(closure); }
+	;
+
+extern_name_list_body:
+	  string
+	    { script_add_extern(closure, $1.value, $1.length); }
+	| extern_name_list_body string
+	    { script_add_extern(closure, $2.value, $2.length); }
+	| extern_name_list_body ',' string
+	    { script_add_extern(closure, $3.value, $3.length); }
+	;
+
 /* A list of input file names.  */
 input_list:
 	  input_list_element

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]