This is the mail archive of the binutils-cvs@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]

[binutils-gdb] Fix forced allocation of common (-d) during -r links.


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

commit 89ede9f53b74f84febcd1c2a6db8b03f390b62ec
Author: Cary Coutant <ccoutant@gmail.com>
Date:   Mon Dec 19 10:37:23 2016 -0800

    Fix forced allocation of common (-d) during -r links.
    
    If the .bss section has other data in it besides common allocations,
    gold was subtracting the wrong section start address from the symbol
    value.
    
    gold/
    	PR gold/20976
    	* symtab.cc (Symbol_table::sized_write_globals): Use address of
    	output section, not input section.
    	* testsuite/Makefile.am (pr20976): New test case.
    	* testsuite/Makefile.in: Regenerate.
    	* testsuite/pr20976.c: New source file.

Diff:
---
 gold/ChangeLog             |  9 +++++++++
 gold/symtab.cc             |  6 +++++-
 gold/testsuite/Makefile.am |  7 +++++++
 gold/testsuite/Makefile.in | 29 ++++++++++++++++++++++++++---
 gold/testsuite/pr20976.c   | 34 ++++++++++++++++++++++++++++++++++
 5 files changed, 81 insertions(+), 4 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index b40f7b8..a9ead08 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,12 @@
+2016-12-19  Cary Coutant  <ccoutant@gmail.com>
+
+	PR gold/20976
+	* symtab.cc (Symbol_table::sized_write_globals): Use address of
+	output section, not input section.
+	* testsuite/Makefile.am (pr20976): New test case.
+	* testsuite/Makefile.in: Regenerate.
+	* testsuite/pr20976.c: New source file.
+
 2016-12-13  Cary Coutant  <ccoutant@gmail.com>
 
 	PR gold/20749
diff --git a/gold/symtab.cc b/gold/symtab.cc
index c872f47..6865190 100644
--- a/gold/symtab.cc
+++ b/gold/symtab.cc
@@ -3111,7 +3111,11 @@ Symbol_table::sized_write_globals(const Stringpool* sympool,
 	    // In object files symbol values are section
 	    // relative.
 	    if (parameters->options().relocatable())
-	      sym_value -= od->address();
+	      {
+		Output_section* os = od->output_section();
+		gold_assert(os != NULL);
+		sym_value -= os->address();
+	      }
 	  }
 	  break;
 
diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
index 4d0aaa1..ab743c7 100644
--- a/gold/testsuite/Makefile.am
+++ b/gold/testsuite/Makefile.am
@@ -2923,6 +2923,13 @@ defsym_test: defsym_test.o gcctestdir/ld
 defsym_test.o: defsym_test.c
 	$(COMPILE) -c -o $@ $<
 
+# Test that the -d option (force common allocation) works correctly.
+check_PROGRAMS += pr20976
+pr20976: pr20976-d.o gcctestdir/ld
+	$(LINK) -Bgcctestdir/ pr20976-d.o
+pr20976-d.o: pr20976.o gcctestdir/ld
+	gcctestdir/ld -r -d -o $@ pr20976.o
+
 # End-to-end incremental linking tests.
 # Incremental linking is currently supported only on the x86_64 target.
 
diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
index a70322c..5de841a 100644
--- a/gold/testsuite/Makefile.in
+++ b/gold/testsuite/Makefile.in
@@ -718,11 +718,13 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
 # Test that __ehdr_start is defined correctly when used with a linker script.
 
 # Test that __ehdr_start is not overridden when supplied by the user.
+
+# Test that the -d option (force common allocation) works correctly.
 @GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_71 = start_lib_test \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	ehdr_start_test_1 \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	ehdr_start_test_2 \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	ehdr_start_test_3 \
-@GCC_TRUE@@NATIVE_LINKER_TRUE@	ehdr_start_test_5
+@GCC_TRUE@@NATIVE_LINKER_TRUE@	ehdr_start_test_5 pr20976
 
 # Test that --gdb-index functions correctly without gcc-generated pubnames.
 
@@ -1191,7 +1193,8 @@ libgoldtest_a_OBJECTS = $(am_libgoldtest_a_OBJECTS)
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	ehdr_start_test_1$(EXEEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	ehdr_start_test_2$(EXEEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	ehdr_start_test_3$(EXEEXT) \
-@GCC_TRUE@@NATIVE_LINKER_TRUE@	ehdr_start_test_5$(EXEEXT)
+@GCC_TRUE@@NATIVE_LINKER_TRUE@	ehdr_start_test_5$(EXEEXT) \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@	pr20976$(EXEEXT)
 @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@am__EXEEXT_40 = incremental_test_2$(EXEEXT) \
 @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@	incremental_test_3$(EXEEXT) \
 @DEFAULT_TARGET_X86_64_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@	incremental_test_4$(EXEEXT) \
@@ -1917,6 +1920,13 @@ pr20308d_test_LINK = $(CCLD) $(pr20308d_test_CFLAGS) $(CFLAGS) \
 pr20308e_test_OBJECTS = $(am_pr20308e_test_OBJECTS)
 pr20308e_test_LINK = $(CCLD) $(pr20308e_test_CFLAGS) $(CFLAGS) \
 	$(pr20308e_test_LDFLAGS) $(LDFLAGS) -o $@
+pr20976_SOURCES = pr20976.c
+pr20976_OBJECTS = pr20976.$(OBJEXT)
+pr20976_LDADD = $(LDADD)
+pr20976_DEPENDENCIES = libgoldtest.a ../libgold.a \
+	../../libiberty/libiberty.a $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
 @GCC_TRUE@@NATIVE_LINKER_TRUE@am_protected_1_OBJECTS =  \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	protected_main_1.$(OBJEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	protected_main_2.$(OBJEXT) \
@@ -2381,7 +2391,7 @@ SOURCES = $(libgoldtest_a_SOURCES) basic_pic_test.c basic_pie_test.c \
 	$(pr20216c_test_SOURCES) $(pr20216d_test_SOURCES) \
 	$(pr20216e_test_SOURCES) $(pr20308a_test_SOURCES) \
 	$(pr20308b_test_SOURCES) $(pr20308c_test_SOURCES) \
-	$(pr20308d_test_SOURCES) $(pr20308e_test_SOURCES) \
+	$(pr20308d_test_SOURCES) $(pr20308e_test_SOURCES) pr20976.c \
 	$(protected_1_SOURCES) $(protected_2_SOURCES) \
 	$(relro_now_test_SOURCES) $(relro_script_test_SOURCES) \
 	$(relro_strip_test_SOURCES) $(relro_test_SOURCES) \
@@ -4050,6 +4060,12 @@ pr20308d_test$(EXEEXT): $(pr20308d_test_OBJECTS) $(pr20308d_test_DEPENDENCIES) $
 pr20308e_test$(EXEEXT): $(pr20308e_test_OBJECTS) $(pr20308e_test_DEPENDENCIES) $(EXTRA_pr20308e_test_DEPENDENCIES) 
 	@rm -f pr20308e_test$(EXEEXT)
 	$(pr20308e_test_LINK) $(pr20308e_test_OBJECTS) $(pr20308e_test_LDADD) $(LIBS)
+@GCC_FALSE@pr20976$(EXEEXT): $(pr20976_OBJECTS) $(pr20976_DEPENDENCIES) $(EXTRA_pr20976_DEPENDENCIES) 
+@GCC_FALSE@	@rm -f pr20976$(EXEEXT)
+@GCC_FALSE@	$(LINK) $(pr20976_OBJECTS) $(pr20976_LDADD) $(LIBS)
+@NATIVE_LINKER_FALSE@pr20976$(EXEEXT): $(pr20976_OBJECTS) $(pr20976_DEPENDENCIES) $(EXTRA_pr20976_DEPENDENCIES) 
+@NATIVE_LINKER_FALSE@	@rm -f pr20976$(EXEEXT)
+@NATIVE_LINKER_FALSE@	$(LINK) $(pr20976_OBJECTS) $(pr20976_LDADD) $(LIBS)
 protected_1$(EXEEXT): $(protected_1_OBJECTS) $(protected_1_DEPENDENCIES) $(EXTRA_protected_1_DEPENDENCIES) 
 	@rm -f protected_1$(EXEEXT)
 	$(protected_1_LINK) $(protected_1_OBJECTS) $(protected_1_LDADD) $(LIBS)
@@ -4409,6 +4425,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pr20308d_test-pr20308_def.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pr20308d_test-pr20308_main.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pr20308e_test-pr20308_main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pr20976.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protected_3.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protected_main_1.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protected_main_2.Po@am__quote@
@@ -5583,6 +5600,8 @@ ehdr_start_test_3.log: ehdr_start_test_3$(EXEEXT)
 	@p='ehdr_start_test_3$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
 ehdr_start_test_5.log: ehdr_start_test_5$(EXEEXT)
 	@p='ehdr_start_test_5$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
+pr20976.log: pr20976$(EXEEXT)
+	@p='pr20976$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
 incremental_test_2.log: incremental_test_2$(EXEEXT)
 	@p='incremental_test_2$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
 incremental_test_3.log: incremental_test_3$(EXEEXT)
@@ -7138,6 +7157,10 @@ uninstall-am:
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	$(LINK) -Bgcctestdir/ -Wl,--defsym=bar=foo defsym_test.o
 @GCC_TRUE@@NATIVE_LINKER_TRUE@defsym_test.o: defsym_test.c
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	$(COMPILE) -c -o $@ $<
+@GCC_TRUE@@NATIVE_LINKER_TRUE@pr20976: pr20976-d.o gcctestdir/ld
+@GCC_TRUE@@NATIVE_LINKER_TRUE@	$(LINK) -Bgcctestdir/ pr20976-d.o
+@GCC_TRUE@@NATIVE_LINKER_TRUE@pr20976-d.o: pr20976.o gcctestdir/ld
+@GCC_TRUE@@NATIVE_LINKER_TRUE@	gcctestdir/ld -r -d -o $@ pr20976.o
 
 # End-to-end incremental linking tests.
 # Incremental linking is currently supported only on the x86_64 target.
diff --git a/gold/testsuite/pr20976.c b/gold/testsuite/pr20976.c
new file mode 100644
index 0000000..353e749
--- /dev/null
+++ b/gold/testsuite/pr20976.c
@@ -0,0 +1,34 @@
+/* pr20976.c -- test forced common allocation
+
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Written by Cary Coutant <ccoutant@gmail.com>
+
+   This file is part of gold.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.
+
+   This test checks that forced common allocation (-d) with -r
+   produces the correct result when the .bss section contains
+   other allocated data besides common symbols. */
+
+int a = 0;
+int b;
+
+int main(void)
+{
+  a = 1;
+  return b;
+}


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