From 1c4cd9c960a712116312670da9844f9df8af8e1c Mon Sep 17 00:00:00 2001 From: Alexander Ivchenko Date: Thu, 6 Jun 2013 15:16:46 +0400 Subject: [2.21], [2.22], [2.23] Backport of the patch for fixing large symbol alignment. 2013-06-05 Alexander Ivchenko gold/ * layout.cc (Layout::set_segment_offsets): Taking care of the case when the maximum segment alignment is larger than the page size. * testsuite/Makefile.am (large_symbol_alignment): Test that Gold correctly aligns the symbols with large alignemnt. * testsuite/Makefile.in: Regenerate. * testsuite/large_symbol_alignment.cc: New file. Change-Id: I2fe5b73b9e76050f0f42bbbc9086d0d5824c0020 Signed-off-by: Alexander Ivchenko --- binutils-2.22/gold/layout.cc | 8 +++- binutils-2.22/gold/testsuite/Makefile.am | 5 +++ binutils-2.22/gold/testsuite/Makefile.in | 51 ++++++++++++++-------- .../gold/testsuite/large_symbol_alignment.cc | 49 +++++++++++++++++++++ 4 files changed, 95 insertions(+), 18 deletions(-) create mode 100644 binutils-2.22/gold/testsuite/large_symbol_alignment.cc (limited to 'binutils-2.22/gold') diff --git a/binutils-2.22/gold/layout.cc b/binutils-2.22/gold/layout.cc index fbad272..fb53c21 100644 --- a/binutils-2.22/gold/layout.cc +++ b/binutils-2.22/gold/layout.cc @@ -3327,7 +3327,13 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg, if (!parameters->options().nmagic() && !parameters->options().omagic()) - off = align_file_offset(off, addr, abi_pagesize); + { + // Here we are also taking care of the case when + // the maximum segment alignment is larger than the page size. + off = align_file_offset(off, addr, + std::max(abi_pagesize, + (*p)->maximum_alignment())); + } else { // This is -N or -n with a section script which prevents diff --git a/binutils-2.22/gold/testsuite/Makefile.am b/binutils-2.22/gold/testsuite/Makefile.am index 64a5f59..52d78e3 100644 --- a/binutils-2.22/gold/testsuite/Makefile.am +++ b/binutils-2.22/gold/testsuite/Makefile.am @@ -273,6 +273,11 @@ icf_sht_rel_addend_test: icf_sht_rel_addend_test_1.o icf_sht_rel_addend_test_2.o icf_sht_rel_addend_test.stdout: icf_sht_rel_addend_test $(TEST_NM) icf_sht_rel_addend_test > icf_sht_rel_addend_test.stdout +check_PROGRAMS += large_symbol_alignment +large_symbol_alignment_SOURCES = large_symbol_alignment.cc +large_symbol_alignment_DEPENDENCIES = gcctestdir/ld +large_symbol_alignment_LDFLAGS = -Bgcctestdir/ + check_SCRIPTS += merge_string_literals.sh check_DATA += merge_string_literals.stdout MOSTLYCLEANFILES += merge_string_literals diff --git a/binutils-2.22/gold/testsuite/Makefile.in b/binutils-2.22/gold/testsuite/Makefile.in index 7ebad75..c23ea49 100644 --- a/binutils-2.22/gold/testsuite/Makefile.in +++ b/binutils-2.22/gold/testsuite/Makefile.in @@ -82,7 +82,6 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_safe_so_test.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ final_layout.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ text_section_grouping.sh \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ section_sorting_name.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_preemptible_functions_test.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_string_merge_test.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_sht_rel_addend_test.sh \ @@ -116,7 +115,6 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ final_layout.stdout \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ text_section_grouping.stdout \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ text_section_no_grouping.stdout \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ section_sorting_name.stdout \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_preemptible_functions_test.stdout \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_string_merge_test.stdout \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_sht_rel_addend_test.stdout \ @@ -131,7 +129,6 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ final_layout \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ text_section_grouping \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ text_section_no_grouping \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ section_sorting_name \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_virtual_function_folding_test \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_preemptible_functions_test \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_string_merge_test \ @@ -140,7 +137,18 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_shared.dbg \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ alt/weak_undef_lib.so @GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_5 = icf_virtual_function_folding_test \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ large_symbol_alignment \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ basic_test basic_pic_test +@GCC_FALSE@large_symbol_alignment_DEPENDENCIES = libgoldtest.a \ +@GCC_FALSE@ ../libgold.a ../../libiberty/libiberty.a \ +@GCC_FALSE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ +@GCC_FALSE@ $(am__DEPENDENCIES_1) +@NATIVE_LINKER_FALSE@large_symbol_alignment_DEPENDENCIES = \ +@NATIVE_LINKER_FALSE@ libgoldtest.a ../libgold.a \ +@NATIVE_LINKER_FALSE@ ../../libiberty/libiberty.a \ +@NATIVE_LINKER_FALSE@ $(am__DEPENDENCIES_1) \ +@NATIVE_LINKER_FALSE@ $(am__DEPENDENCIES_1) \ +@NATIVE_LINKER_FALSE@ $(am__DEPENDENCIES_1) @GCC_TRUE@@HAVE_STATIC_TRUE@@NATIVE_LINKER_TRUE@am__append_6 = basic_static_test \ @GCC_TRUE@@HAVE_STATIC_TRUE@@NATIVE_LINKER_TRUE@ basic_static_pic_test @GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_7 = basic_pie_test \ @@ -694,6 +702,7 @@ libgoldtest_a_OBJECTS = $(am_libgoldtest_a_OBJECTS) @NATIVE_OR_CROSS_LINKER_TRUE@ binary_unittest$(EXEEXT) \ @NATIVE_OR_CROSS_LINKER_TRUE@ leb128_unittest$(EXEEXT) @GCC_TRUE@@NATIVE_LINKER_TRUE@am__EXEEXT_2 = icf_virtual_function_folding_test$(EXEEXT) \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ large_symbol_alignment$(EXEEXT) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ basic_test$(EXEEXT) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ basic_pic_test$(EXEEXT) @GCC_TRUE@@HAVE_STATIC_TRUE@@NATIVE_LINKER_TRUE@am__EXEEXT_3 = basic_static_test$(EXEEXT) \ @@ -1299,6 +1308,12 @@ large_OBJECTS = $(am_large_OBJECTS) large_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(large_CFLAGS) $(CFLAGS) $(large_LDFLAGS) \ $(LDFLAGS) -o $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@am_large_symbol_alignment_OBJECTS = large_symbol_alignment.$(OBJEXT) +large_symbol_alignment_OBJECTS = $(am_large_symbol_alignment_OBJECTS) +large_symbol_alignment_LDADD = $(LDADD) +large_symbol_alignment_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(large_symbol_alignment_LDFLAGS) $(LDFLAGS) -o $@ @NATIVE_OR_CROSS_LINKER_TRUE@am_leb128_unittest_OBJECTS = \ @NATIVE_OR_CROSS_LINKER_TRUE@ leb128_unittest.$(OBJEXT) leb128_unittest_OBJECTS = $(am_leb128_unittest_OBJECTS) @@ -1856,12 +1871,13 @@ SOURCES = $(libgoldtest_a_SOURCES) basic_pic_test.c basic_pie_test.c \ incremental_test_6.c $(initpri1_SOURCES) $(initpri2_SOURCES) \ $(initpri3a_SOURCES) $(justsyms_SOURCES) \ $(justsyms_exec_SOURCES) $(large_SOURCES) \ - $(leb128_unittest_SOURCES) local_labels_test.c \ - many_sections_r_test.c $(many_sections_test_SOURCES) \ - $(object_unittest_SOURCES) permission_test.c plugin_test_1.c \ - plugin_test_2.c plugin_test_3.c plugin_test_4.c \ - plugin_test_5.c plugin_test_6.c plugin_test_7.c \ - plugin_test_8.c $(protected_1_SOURCES) $(protected_2_SOURCES) \ + $(large_symbol_alignment_SOURCES) $(leb128_unittest_SOURCES) \ + local_labels_test.c many_sections_r_test.c \ + $(many_sections_test_SOURCES) $(object_unittest_SOURCES) \ + permission_test.c plugin_test_1.c plugin_test_2.c \ + plugin_test_3.c plugin_test_4.c plugin_test_5.c \ + plugin_test_6.c plugin_test_7.c plugin_test_8.c \ + $(protected_1_SOURCES) $(protected_2_SOURCES) \ $(relro_now_test_SOURCES) $(relro_script_test_SOURCES) \ $(relro_strip_test_SOURCES) $(relro_test_SOURCES) \ $(script_test_1_SOURCES) $(script_test_2_SOURCES) \ @@ -2187,6 +2203,9 @@ LDADD = libgoldtest.a ../libgold.a ../../libiberty/libiberty.a $(LIBINTL) \ @NATIVE_OR_CROSS_LINKER_TRUE@object_unittest_SOURCES = object_unittest.cc @NATIVE_OR_CROSS_LINKER_TRUE@binary_unittest_SOURCES = binary_unittest.cc @NATIVE_OR_CROSS_LINKER_TRUE@leb128_unittest_SOURCES = leb128_unittest.cc +@GCC_TRUE@@NATIVE_LINKER_TRUE@large_symbol_alignment_SOURCES = large_symbol_alignment.cc +@GCC_TRUE@@NATIVE_LINKER_TRUE@large_symbol_alignment_DEPENDENCIES = gcctestdir/ld +@GCC_TRUE@@NATIVE_LINKER_TRUE@large_symbol_alignment_LDFLAGS = -Bgcctestdir/ @GCC_TRUE@@NATIVE_LINKER_TRUE@constructor_test_SOURCES = constructor_test.cc @GCC_TRUE@@NATIVE_LINKER_TRUE@constructor_test_DEPENDENCIES = gcctestdir/ld @GCC_TRUE@@NATIVE_LINKER_TRUE@constructor_test_LDFLAGS = -Bgcctestdir/ @@ -3114,6 +3133,9 @@ justsyms_exec$(EXEEXT): $(justsyms_exec_OBJECTS) $(justsyms_exec_DEPENDENCIES) large$(EXEEXT): $(large_OBJECTS) $(large_DEPENDENCIES) @rm -f large$(EXEEXT) $(large_LINK) $(large_OBJECTS) $(large_LDADD) $(LIBS) +large_symbol_alignment$(EXEEXT): $(large_symbol_alignment_OBJECTS) $(large_symbol_alignment_DEPENDENCIES) + @rm -f large_symbol_alignment$(EXEEXT) + $(large_symbol_alignment_LINK) $(large_symbol_alignment_OBJECTS) $(large_symbol_alignment_LDADD) $(LIBS) leb128_unittest$(EXEEXT): $(leb128_unittest_OBJECTS) $(leb128_unittest_DEPENDENCIES) @rm -f leb128_unittest$(EXEEXT) $(CXXLINK) $(leb128_unittest_OBJECTS) $(leb128_unittest_LDADD) $(LIBS) @@ -3497,6 +3519,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/justsyms_1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/justsyms_exec.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/large-large.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/large_symbol_alignment.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/leb128_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/local_labels_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/many_sections_r_test.Po@am__quote@ @@ -3833,8 +3856,6 @@ final_layout.sh.log: final_layout.sh @p='final_layout.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) text_section_grouping.sh.log: text_section_grouping.sh @p='text_section_grouping.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) -section_sorting_name.sh.log: section_sorting_name.sh - @p='section_sorting_name.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) icf_preemptible_functions_test.sh.log: icf_preemptible_functions_test.sh @p='icf_preemptible_functions_test.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) icf_string_merge_test.sh.log: icf_string_merge_test.sh @@ -3963,6 +3984,8 @@ leb128_unittest.log: leb128_unittest$(EXEEXT) @p='leb128_unittest$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) icf_virtual_function_folding_test.log: icf_virtual_function_folding_test$(EXEEXT) @p='icf_virtual_function_folding_test$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) +large_symbol_alignment.log: large_symbol_alignment$(EXEEXT) + @p='large_symbol_alignment$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) basic_test.log: basic_test$(EXEEXT) @p='basic_test$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) basic_pic_test.log: basic_pic_test$(EXEEXT) @@ -4486,12 +4509,6 @@ uninstall-am: @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_NM) -n --synthetic text_section_grouping > text_section_grouping.stdout @GCC_TRUE@@NATIVE_LINKER_TRUE@text_section_no_grouping.stdout: text_section_no_grouping @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_NM) -n --synthetic text_section_no_grouping > text_section_no_grouping.stdout -@GCC_TRUE@@NATIVE_LINKER_TRUE@section_sorting_name.o: section_sorting_name.cc -@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -O0 -c -ffunction-sections -g -o $@ $< -@GCC_TRUE@@NATIVE_LINKER_TRUE@section_sorting_name: section_sorting_name.o gcctestdir/ld -@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -Wl,--sort-section=name section_sorting_name.o -@GCC_TRUE@@NATIVE_LINKER_TRUE@section_sorting_name.stdout: section_sorting_name -@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_NM) -n --synthetic section_sorting_name > section_sorting_name.stdout @GCC_TRUE@@NATIVE_LINKER_TRUE@icf_virtual_function_folding_test.o: icf_virtual_function_folding_test.cc @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -O0 -c -ffunction-sections -fPIE -g -o $@ $< @GCC_TRUE@@NATIVE_LINKER_TRUE@icf_virtual_function_folding_test: icf_virtual_function_folding_test.o gcctestdir/ld diff --git a/binutils-2.22/gold/testsuite/large_symbol_alignment.cc b/binutils-2.22/gold/testsuite/large_symbol_alignment.cc new file mode 100644 index 0000000..1b4a63d --- /dev/null +++ b/binutils-2.22/gold/testsuite/large_symbol_alignment.cc @@ -0,0 +1,49 @@ +// large_symbol_alignment.cc -- a test case for gold + +// Copyright 2013 Free Software Foundation, Inc. +// Written by Alexander Ivchenko . + +// 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. + +// The goal of this program is to verify that Gold correctly aligns +// the symbol with a large alignemnt (often larger than the page size). + +#include + +__attribute__ ((aligned(8192))) int aligned_8k_var; +__attribute__ ((aligned(4096))) int aligned_4k_var; +__attribute__ ((aligned(16384))) int aligned_16k_var; + +bool +is_aligned(const int& var, int align) __attribute__((noinline)); + +bool +is_aligned(const int& var, int align) +{ + return (reinterpret_cast(&var) & (align - 1)) == 0; +} + +int +main() +{ + if (!is_aligned(aligned_16k_var, 16384) + || !is_aligned(aligned_8k_var, 8192) + || !is_aligned(aligned_4k_var, 4096)) + return 1; + return 0; +} -- cgit v1.1