Bug 13023 - gold misinterprets dot assignments in sections
Summary: gold misinterprets dot assignments in sections
Status: RESOLVED FIXED
Alias: None
Product: binutils
Classification: Unclassified
Component: gold (show other bugs)
Version: 2.21
: P2 normal
Target Milestone: ---
Assignee: Cary Coutant
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-07-23 18:47 UTC by Andy Lutomirski
Modified: 2011-12-19 21:14 UTC (History)
4 users (show)

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


Attachments
Test case, part 1 (63 bytes, text/x-csrc)
2011-07-23 18:47 UTC, Andy Lutomirski
Details
Test case, part 2 (61 bytes, application/octet-stream)
2011-07-23 18:48 UTC, Andy Lutomirski
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Andy Lutomirski 2011-07-23 18:47:48 UTC
Created attachment 5858 [details]
Test case, part 1

Gold seems to think that numbers assigned to '.' inside of an output section are absolute.  They should be relative.  Small test case attached.

This breaks the Linux kernel build as of this change:

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=9fd67b4ed0714ab718f1f9bd14c344af336a6df7
Comment 1 Andy Lutomirski 2011-07-23 18:48:13 UTC
Created attachment 5859 [details]
Test case, part 2
Comment 2 Andy Lutomirski 2011-07-23 18:49:53 UTC
To reproduce, save 'part 1' as foo.c and 'part 2' as foo.lds.  Then do:

$ gcc -c foo.c
$ ld.gold -o foo2.o -T foo.lds foo.o
ld.gold: error: dot may not move backward

or

$ ld.bfd -o foo2.o -T foo.lds foo.o
[works fine]

Alternatively, change the dot assignment to:
. = 0x1010;

and watch gold put the symbol b in the wrong place.
Comment 3 Andy Lutomirski 2011-07-23 19:04:28 UTC
This is a little bit gross but appears to produce the expected result on ld.bfd and gold:

SECTIONS {
 .test 0x1000 : {
   __workaround = .;
   *(.a)

   . = __workaround + 0x10;
   *(.b);
 }
}
Comment 4 Cary Coutant 2011-10-28 21:31:47 UTC
Proposed patch:

http://sourceware.org/ml/binutils/2011-10/msg00293.html
Comment 5 Sourceware Commits 2011-10-31 22:51:07 UTC
CVSROOT:	/cvs/src
Module name:	src
Changes by:	ccoutant@sourceware.org	2011-10-31 22:51:03

Modified files:
	gold           : ChangeLog expression.cc script-sections.cc 
	                 script.cc script.h 
	gold/testsuite : script_test_2.t 

Log message:
	PR gold/13023
	* expression.cc (Expression::eval_with_dot): Add
	is_section_dot_assignment parameter.
	(Expression::eval_maybe_dot): Likewise.  Adjust value when rhs is
	absolute and assigning to dot within a section.
	* script-sections.cc
	(Output_section_element_assignment::set_section_addresses): Pass
	dot_section to set_if_absolute.
	(Output_section_element_dot_assignment::finalize_symbols): Pass TRUE
	as is_section_dot_assignment flag to eval_with_dot.
	(Output_section_element_dot_assignment::set_section_addresses):
	Likewise.
	* script.cc (Symbol_assignment::set_if_absolute): Add dot_section
	parameter.  Also set value if relative to dot_section; set the
	symbol's output_section.
	* script.h (Expression::eval_with_dot): Add is_section_dot_assignment
	parameter.  Adjust all callers.
	(Expression::eval_maybe_dot): Likewise.
	(Symbol_assignment::set_if_absolute): Add dot_section parameter.
	Adjust all callers.
	* testsuite/script_test_2.t: Test assignment of an absolute value
	to dot within an output section element.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/ChangeLog.diff?cvsroot=src&r1=1.847&r2=1.848
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/expression.cc.diff?cvsroot=src&r1=1.18&r2=1.19
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/script-sections.cc.diff?cvsroot=src&r1=1.54&r2=1.55
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/script.cc.diff?cvsroot=src&r1=1.84&r2=1.85
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/script.h.diff?cvsroot=src&r1=1.37&r2=1.38
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/testsuite/script_test_2.t.diff?cvsroot=src&r1=1.3&r2=1.4
Comment 6 Cary Coutant 2011-10-31 23:15:20 UTC
Fixed in trunk.
Comment 7 Sourceware Commits 2011-12-19 21:14:46 UTC
CVSROOT:	/cvs/src
Module name:	src
Branch: 	binutils-2_22-branch
Changes by:	ian@sourceware.org	2011-12-19 21:14:40

Modified files:
	gold           : ChangeLog Makefile.am Makefile.in configure 
	                 configure.ac dwarf_reader.cc expression.cc 
	                 fileread.cc gold.cc i386.cc incremental.cc 
	                 incremental.h layout.cc options.cc options.h 
	                 output.cc output.h plugin.cc powerpc.cc 
	                 readsyms.cc resolve.cc script-sections.cc 
	                 script.cc script.h sparc.cc symtab.cc symtab.h 
	                 x86_64.cc 
	gold/testsuite : Makefile.in plugin_test_2.sh script_test_2.t 

Log message:
	Copy from mainline to binutils 2.22 branch:
	
	2011-12-17  Cary Coutant  <ccoutant@google.com>
	
	* dwarf_reader.cc (Sized_dwarf_line_info::read_lines): Add casts.
	* resolve.cc (Symbol_table::resolve): Likewise.
	* i386.cc (Target_i386::do_code_fill): Use char constants for nop
	arrays.
	* x86_64.cc (Target_x86_64::do_code_fill): Likewise.
	
	2011-10-31  Cary Coutant  <ccoutant@google.com>
	
	PR gold/13023
	* expression.cc (Expression::eval_with_dot): Add
	is_section_dot_assignment parameter.
	(Expression::eval_maybe_dot): Likewise.  Adjust value when rhs is
	absolute and assigning to dot within a section.
	* script-sections.cc
	(Output_section_element_assignment::set_section_addresses): Pass
	dot_section to set_if_absolute.
	(Output_section_element_dot_assignment::finalize_symbols): Pass TRUE
	as is_section_dot_assignment flag to eval_with_dot.
	(Output_section_element_dot_assignment::set_section_addresses):
	Likewise.
	* script.cc (Symbol_assignment::set_if_absolute): Add dot_section
	parameter.  Also set value if relative to dot_section; set the
	symbol's output_section.
	* script.h (Expression::eval_with_dot): Add is_section_dot_assignment
	parameter.  Adjust all callers.
	(Expression::eval_maybe_dot): Likewise.
	(Symbol_assignment::set_if_absolute): Add dot_section parameter.
	Adjust all callers.
	* testsuite/script_test_2.t: Test assignment of an absolute value
	to dot within an output section element.
	
	2011-10-31  Cary Coutant  <ccoutant@google.com>
	
	* options.h (class General_options): Add --[no-]gnu-unique options.
	* symtab.cc (Symbol_table::sized_write_globals): Convert
	STB_GNU_UNIQUE to STB_GLOBAL if --no-gnu-unique.
	
	2011-10-31  Cary Coutant  <ccoutant@google.com>
	
	PR gold/13359
	* i386.cc (Target_i386::Relocate::relocate_tls): Remove
	unnecessary assertion.
	* x86_64.cc (Target_x86_64::Relocate::relocate_tls): Likewise.
	
	2011-10-31 Sriraman Tallam  <tmsriram@google.com>
	
	* symtab.h (Symbol_table::gc_mark_symbol_for_shlib): Rename to
	gc_mark_symbol.
	* symtab.cc (Symbol_table::gc_mark_symbol_for_shlib): Rename to
	gc_mark_symbol.
	Change to just keep the section associated with symbol.
	(Symbol_table::add_from_relobj): Mark symbols as not garbage when
	they are externally visible and --export-dynamic is turned on.
	(Symbol_table::gc_mark_dyn_syms): Call gc_mark_symbol.
	
	2011-10-19  Ian Lance Taylor  <iant@google.com>
	
	PR gold/13163
	* script-sections.cc
	(Output_section_element_dot_assignment::needs_output_section): New
	function.
	
	2011-10-19  Ian Lance Taylor  <iant@google.com>
	
	PR gold/13204
	* layout.cc (Layout::segment_precedes): Don't assert failure if a
	--section-start option was seen.
	* options.h (General_options::any_section_start): New function.
	
	2011-10-18  Cary Coutant  <ccoutant@google.com>
	
	* output.cc (posix_fallocate): Return 0 on success, errno on failure.
	(Output_file::map_no_anonymous): Check for non-zero
	return code from posix_fallocate.
	
	2011-10-17  Cary Coutant  <ccoutant@google.com>
	
	PR gold/13245
	* plugin.cc (is_visible_from_outside): Check for symbols
	referenced from dynamic objects.
	* resolve.cc (Symbol_table::resolve): Don't count references
	from dynamic objects as references from real ELF files.
	* testsuite/plugin_test_2.sh: Adjust expected result.
	
	2011-10-17  Cary Coutant  <ccoutant@google.com>
	
	* readsyms.cc (Read_symbols::run): Don't queue an unblocker
	task for members of lib groups.
	
	2011-10-17  Cary Coutant  <ccoutant@google.com>
	
	PR gold/13288
	* fileread.cc (File_read::find_view): Add assert.
	(File_read::make_view): Move bounds check (replace with assert)...
	(File_read::find_or_make_view): ... to here.
	
	2011-10-12  Cary Coutant  <ccoutant@google.com>
	
	* output.cc (Output_file::open_base_file): Handle case where
	::read returns less than requested size.
	
	2011-10-10  Cary Coutant  <ccoutant@google.com>
	
	* incremental.cc (Sized_relobj_incr::Sized_relobj_incr):
	Initialize defined_count_.
	(Sized_relobj_incr::do_add_symbols): Count defined symbols.
	(Sized_relobj_incr::do_get_global_symbol_counts): Rewrite.
	(Sized_incr_dynobj::Sized_incr_dynobj): Initialize defined_count_.
	(Sized_incr_dynobj::do_add_symbols): Count defined symbols.
	(Sized_incr_dynobj::do_get_global_symbol_counts): Rewrite.
	* incremental.h (Sized_relobj_incr::defined_count_): New data
	member.
	(Sized_incr_dynobj::defined_count_): New data member.
	* plugin.cc (Sized_pluginobj::do_get_global_symbol_counts):
	Return zeroes instead of internal error.
	
	2011-10-10  Cary Coutant  <ccoutant@google.com>
	
	PR gold/13249
	* output.cc (Output_reloc::Output_reloc): Add use_plt_offset flag.
	(Output_reloc::symbol_value): Return PLT offset if flag is set.
	* output.h (class Output_reloc): Add use_plt_offset flag.
	(Output_reloc::type_): Adjust size of bit field.
	(Output_reloc::use_plt_offset_): New bit field.
	(class Output_data_reloc): Adjust all calls to Output_reloc_type.
	(Output_data_reloc::add_local_relative): (RELA only) Add use_plt_offset
	flag.  Adjust all callers.
	* x86_64.cc (Target_x86_64::Scan::local): Check for IFUNC when
	creating RELATIVE relocations.
	
	2011-10-03   Diego Novillo  <dnovillo@google.com>
	
	* options.cc (parse_uint): Fix dereference of RETVAL.
	
	2011-09-29  Cary Coutant  <ccoutant@google.com>
	
	* incremental.cc (Sized_incremental_binary::do_process_got_plt):
	Check for NULL.
	* symtab.cc (Symbol_table::add_from_relobj): Ignore version
	symbols during incremental update.
	(Symbol_table::add_from_dynobj): Likewise.
	
	2011-09-26  Cary Coutant  <ccoutant@google.com>
	
	* gold.cc (queue_initial_tasks): Move option checks ...
	* options.cc (General_options::finalize): ... to here. Disable
	some options; make others fatal.
	
	2011-09-23  Simon Baldwin  <simonb@google.com>
	
	* configure.ac: Add new --with-gold-ldadd and --with-gold-ldflags
	configuration options.
	* configure: Regenerate.
	* Makefile.am: Handle GOLD_LDADD and GOLD_LDFLAGS.
	* Makefile.in: Regenerate.
	* testsuite/Makefile.in: Regenerate.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/ChangeLog.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.824.2.6&r2=1.824.2.7
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/Makefile.am.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.62&r2=1.62.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/Makefile.in.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.89&r2=1.89.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/configure.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.69&r2=1.69.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/configure.ac.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.66&r2=1.66.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/dwarf_reader.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.33&r2=1.33.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/expression.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.18&r2=1.18.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/fileread.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.74&r2=1.74.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/gold.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.94&r2=1.94.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/i386.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.141&r2=1.141.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/incremental.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.47&r2=1.47.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/incremental.h.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.28&r2=1.28.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/layout.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.220&r2=1.220.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/options.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.114&r2=1.114.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/options.h.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.169.2.1&r2=1.169.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/output.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.159&r2=1.159.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/output.h.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.128&r2=1.128.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/plugin.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.48.2.1&r2=1.48.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/powerpc.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.39&r2=1.39.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/readsyms.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.51&r2=1.51.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/resolve.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.63&r2=1.63.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/script-sections.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.53&r2=1.53.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/script.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.84&r2=1.84.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/script.h.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.37&r2=1.37.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/sparc.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.48.2.1&r2=1.48.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/symtab.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.159.2.1&r2=1.159.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/symtab.h.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.125&r2=1.125.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/x86_64.cc.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.139&r2=1.139.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/testsuite/Makefile.in.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.191.2.2&r2=1.191.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/testsuite/plugin_test_2.sh.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.2&r2=1.2.8.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gold/testsuite/script_test_2.t.diff?cvsroot=src&only_with_tag=binutils-2_22-branch&r1=1.3&r2=1.3.14.1