Bug 18048 - None-top-level INCLUDE not properly supported
Summary: None-top-level INCLUDE not properly supported
Status: RESOLVED FIXED
Alias: None
Product: binutils
Classification: Unclassified
Component: gold (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Cary Coutant
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2015-02-27 17:28 UTC by Han Shen
Modified: 2015-03-22 04:24 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Han Shen 2015-02-27 17:28:45 UTC
We observed this problem building chromeos , I have a simplified case below - 

file: test.ld
SECTIONS
{
 INCLUDE "test-inc.ld"
}

file: test-inc.ld
.bss . : {
 . = ALIGN(8);
}

When specifying test.ld as linker script, gold errors - 
hdd2/gold64/build/gold/ld-new: error: test-inc.ld:1:6: syntax error, unexpected STRING
hdd2/gold64/build/gold/ld-new: internal error in place_orphan, at ../../binutils-working/gold/script-sections.cc:3447

Replacing the INCLUDE statement with content from test-inc.ld makes gold happy.
Comment 1 Han Shen 2015-02-27 17:32:18 UTC
By investigating, in script.cc, "script_include_directive" function always assumes "INCLUDE" is top-most level.

I'm working on a patch to expand each "INCLUDE" to reconstruct the script text and re-do the parsing.
Comment 2 Sourceware Commits 2015-03-22 02:57:40 UTC
The master branch has been updated by Cary Coutant <ccoutant@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=410da591ba7814912e11be826b20dfba9abed9f7

commit 410da591ba7814912e11be826b20dfba9abed9f7
Author: Cary Coutant <ccoutant@gmail.com>
Date:   Sat Mar 21 19:03:00 2015 -0700

    PR gold/18048: Fix INCLUDE directive support for gold
    
    This patch fixes INCLUDE directives in script files, so that when
    an INCLUDE appears inside a sections block, section commands block,
    or memory def block, the contents are parsed in the appropriate
    context.
    
    gold/
    	PR gold/18048
    	* script-c.h (script_include_directive): Add first_token parameter.
    	* script.cc (script_include_directive): Add first_token parameter, and
    	pass it to read_script_file.
    	* yyscript.y (PARSING_SECTIONS_BLOCK, PARSING_SECTION_CMDS)
    	(PARSING_MEMORY_DEF): New tokens.
    	(top): Add new productions for INCLUDE files.
    	(file_cmd): Replace file_or_sections_cmd with copy of its productions.
    	Pass PARSING_LINKER_SCRIPT to script_include_directive.
    	(section_block_cmd): Likewise; pass PARSING_SECTIONS_BLOCK.
    	(section_cmd): Pass PARSING_SECTION_CMDS.
    	(file_or_sections_cmd): Remove.
    	(memory_def): Pass PARSING_MEMORY_DEF.
    	* testsuite/Makefile.am (memory_test_2): New test.
    	* testsuite/Makefile.in: Regenerate.
    	* testsuite/memory_test_inc.t: New script file.
    	* testsuite/memory_test_inc_1.t.src: New script file.
    	* testsuite/memory_test_inc_2.t.src: New script file.
    	* testsuite/memory_test_inc_3.t.src: New script file.
Comment 3 Cary Coutant 2015-03-22 03:05:01 UTC
Fixed on trunk.
Comment 4 Han Shen 2015-03-22 04:24:35 UTC
Thanks.