From: Cary Coutant Date: Mon, 19 Dec 2016 18:37:23 +0000 (-0800) Subject: Fix forced allocation of common (-d) during -r links. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=89ede9f53b74f84febcd1c2a6db8b03f390b62ec;p=binutils-gdb.git 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 --git a/gold/ChangeLog b/gold/ChangeLog index b40f7b8e20a..a9ead08170d 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,12 @@ +2016-12-19 Cary Coutant + + 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 PR gold/20749 diff --git a/gold/symtab.cc b/gold/symtab.cc index c872f47d386..6865190f880 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 4d0aaa1cb9b..ab743c71471 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 a70322c639f..5de841adb9b 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 00000000000..353e749205a --- /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 + + 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; +}