When using linker scripts, place linker-generated sections by the output section name. 2016-12-12 Igor Kudrin Cary Coutant gold/ PR gold/14676 * script-sections.cc (Output_section_definition::output_section_name): For linker-generated sections, compare with output section name. * testsuite/Makefile.am (script_test_13): New test. * testsuite/Makefile.in: Regenerate. * testsuite/script_test_13.c: New source file. * testsuite/script_test_13.sh: New script. * testsuite/script_test_13.t: New linker script. diff --git a/gold/script-sections.cc b/gold/script-sections.cc index d970e57..90ec8d4 100644 --- a/gold/script-sections.cc +++ b/gold/script-sections.cc @@ -2291,6 +2291,17 @@ Output_section_definition::output_section_name( Script_sections::Section_type* psection_type, bool* keep) { + // If the input section is linker-created, just look for a match + // on the output section name. + if (file_name == NULL && this->name_ != "/DISCARD/") + { + if (this->name_ != section_name) + return NULL; + *slot = &this->output_section_; + *psection_type = this->section_type(); + return this->name_.c_str(); + } + // Ask each element whether it matches NAME. for (Output_section_elements::const_iterator p = this->elements_.begin(); p != this->elements_.end(); diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am index 25db2b8..4d0aaa1 100644 --- a/gold/testsuite/Makefile.am +++ b/gold/testsuite/Makefile.am @@ -2008,6 +2008,17 @@ script_test_12a.o: script_test_12a.c script_test_12b.o: script_test_12b.c $(COMPILE) -O0 -c -o $@ $< +# Test for ordering internally created sections with a linker script. +check_SCRIPTS += script_test_13.sh +check_DATA += script_test_13.stdout +MOSTLYCLEANFILES += script_test_13 +script_test_13.o: script_test_13.c + $(COMPILE) -O0 -c -fPIC -o $@ $< +script_test_13: $(srcdir)/script_test_13.t script_test_13.o gcctestdir/ld + gcctestdir/ld -shared -o $@ script_test_13.o -T $(srcdir)/script_test_13.t +script_test_13.stdout: script_test_13 + $(TEST_READELF) -SW script_test_13 > $@ + # Test for SORT_BY_INIT_PRIORITY. check_SCRIPTS += script_test_14.sh check_DATA += script_test_14.stdout diff --git a/gold/testsuite/script_test_13.c b/gold/testsuite/script_test_13.c new file mode 100644 index 0000000..83e0948 --- /dev/null +++ b/gold/testsuite/script_test_13.c @@ -0,0 +1,2 @@ +extern int a; +int* pa = &a; diff --git a/gold/testsuite/script_test_13.sh b/gold/testsuite/script_test_13.sh new file mode 100755 index 0000000..fff2772 --- /dev/null +++ b/gold/testsuite/script_test_13.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +# script_test_13.sh -- test that internally created sections obey +# the order from the linker script. + +# Copyright (C) 2016 Free Software Foundation, Inc. +# Written by Igor Kudrin . + +# 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. + +check() +{ + file=$1 + pattern=$2 + match_pattern=`grep -e "$pattern" $file` + if test -z "$match_pattern"; then + echo "Expected pattern was not found:" + echo " $pattern" + echo "" + echo "Actual output below:" + cat "$file" + exit 1 + fi +} + +check "script_test_13.stdout" "\\.rela\\.dyn[[:space:]]\\+RELA[[:space:]]\\+0\\+10000\\b" diff --git a/gold/testsuite/script_test_13.t b/gold/testsuite/script_test_13.t new file mode 100644 index 0000000..d51e1db --- /dev/null +++ b/gold/testsuite/script_test_13.t @@ -0,0 +1,7 @@ +SECTIONS +{ + .text 0 : { *(.text) } + + .rela.dyn 0x10000 : { *(.rela.init) } + .rel.dyn 0x10000 : { *(.rela.init) } +}