* output.h (sort_attached_input_sections): Change to be public. * script-sections.cc (Output_section_definition::set_section_addresses): Sort attached input sections according to section order before linker script assigns section addresses. (Orphan_output_section::set_section_addresses): Sort attached input sections according to section order before linker script assigns section addresses. * Makefile.am (final_layout.sh): Use a simple linker script to check if section ordering still works. * Makefile.in: Regenerate. Index: output.h =================================================================== RCS file: /cvs/src/src/gold/output.h,v retrieving revision 1.144 diff -u -u -p -r1.144 output.h --- output.h 12 Dec 2012 03:41:40 -0000 1.144 +++ output.h 9 Jan 2013 23:35:57 -0000 @@ -3300,6 +3300,10 @@ class Output_section : public Output_dat this->dynsym_index_ = index; } + // Sort the attached input sections. + void + sort_attached_input_sections(); + // Return whether the input sections sections attachd to this output // section may require sorting. This is used to handle constructor // priorities compatibly with GNU ld. @@ -4253,10 +4257,6 @@ class Output_section : public Output_dat add_output_merge_section(Output_section_data* posd, bool is_string, uint64_t entsize); - // Sort the attached input sections. - void - sort_attached_input_sections(); - // Find the merge section into which an input section with index SHNDX in // OBJECT has been added. Return NULL if none found. Output_section_data* Index: script-sections.cc =================================================================== RCS file: /cvs/src/src/gold/script-sections.cc,v retrieving revision 1.56 diff -u -u -p -r1.56 script-sections.cc --- script-sections.cc 14 Aug 2012 08:31:56 -0000 1.56 +++ script-sections.cc 9 Jan 2013 23:35:57 -0000 @@ -2294,6 +2294,15 @@ Output_section_definition::set_section_a uint64_t old_dot_value = *dot_value; uint64_t old_load_address = *load_address; + // If input section sorting is requested via --section-ordering-file or + // linker plugins, then do it here. This is important because we want + // any sorting specified in the linker scripts, which will be done after + // this, to take precedence. The final order of input sections is then + // guaranteed to be according to the linker script specification. + if (this->output_section_ != NULL + && this->output_section_->input_section_order_specified()) + this->output_section_->sort_attached_input_sections(); + // Decide the start address for the section. The algorithm is: // 1) If an address has been specified in a linker script, use that. // 2) Otherwise if a memory region has been specified for the section, @@ -2865,6 +2874,15 @@ Orphan_output_section::set_section_addre uint64_t address = *dot_value; address = align_address(address, this->os_->addralign()); + // If input section sorting is requested via --section-ordering-file or + // linker plugins, then do it here. This is important because we want + // any sorting specified in the linker scripts, which will be done after + // this, to take precedence. The final order of input sections is then + // guaranteed to be according to the linker script specification. + if (this->os_ != NULL + && this->os_->input_section_order_specified()) + this->os_->sort_attached_input_sections(); + // For a relocatable link, all orphan sections are put at // address 0. In general we expect all sections to be at // address 0 for a relocatable link, but we permit the linker Index: testsuite/Makefile.am =================================================================== RCS file: /cvs/src/src/gold/testsuite/Makefile.am,v retrieving revision 1.203 diff -u -u -p -r1.203 Makefile.am --- testsuite/Makefile.am 4 Jan 2013 23:50:27 -0000 1.203 +++ testsuite/Makefile.am 9 Jan 2013 23:35:57 -0000 @@ -251,8 +251,10 @@ final_layout.o: final_layout.cc $(CXXCOMPILE) -O0 -c -ffunction-sections -fdata-sections -g -o $@ $< final_layout_sequence.txt: (echo "*_Z3barv*" && echo ".text._Z3bazv" && echo "*_Z3foov*" && echo "*global_varb*" && echo "*global_vara*" && echo "*global_varc*") > final_layout_sequence.txt -final_layout: final_layout.o final_layout_sequence.txt gcctestdir/ld - $(CXXLINK) -Bgcctestdir/ -Wl,--section-ordering-file,final_layout_sequence.txt final_layout.o +final_layout_script.lds: + (echo ""SECTIONS { .text : { *(.text*) } .bss : { *(.bss*) } }") > final_layout_script.lds +final_layout: final_layout.o final_layout_sequence.txt final_layout_script.lds gcctestdir/ld + $(CXXLINK) -Bgcctestdir/ -Wl,--section-ordering-file,final_layout_sequence.txt -Wl,-T,final_layout_script.lds final_layout.o final_layout.stdout: final_layout $(TEST_NM) -n --synthetic final_layout > final_layout.stdout Index: testsuite/Makefile.in =================================================================== RCS file: /cvs/src/src/gold/testsuite/Makefile.in,v retrieving revision 1.214 diff -u -u -p -r1.214 Makefile.in --- testsuite/Makefile.in 4 Jan 2013 23:50:27 -0000 1.214 +++ testsuite/Makefile.in 9 Jan 2013 23:35:58 -0000 @@ -125,6 +125,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__E @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_safe_test icf_safe_so_test \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ final_layout \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ final_layout_sequence.txt \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ final_layout_script.lds \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ text_section_grouping \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_virtual_function_folding_test \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ icf_preemptible_functions_test \ @@ -4355,8 +4356,10 @@ uninstall-am: @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -O0 -c -ffunction-sections -fdata-sections -g -o $@ $< @GCC_TRUE@@NATIVE_LINKER_TRUE@final_layout_sequence.txt: @GCC_TRUE@@NATIVE_LINKER_TRUE@ (echo "*_Z3barv*" && echo ".text._Z3bazv" && echo "*_Z3foov*" && echo "*global_varb*" && echo "*global_vara*" && echo "*global_varc*") > final_layout_sequence.txt -@GCC_TRUE@@NATIVE_LINKER_TRUE@final_layout: final_layout.o final_layout_sequence.txt gcctestdir/ld -@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -Wl,--section-ordering-file,final_layout_sequence.txt final_layout.o +@GCC_TRUE@@NATIVE_LINKER_TRUE@final_layout_script.lds: +@GCC_TRUE@@NATIVE_LINKER_TRUE@ (echo "SECTIONS { .text : { *(.text*) } .bss : { *(.bss*) } }") > final_layout_script.lds +@GCC_TRUE@@NATIVE_LINKER_TRUE@final_layout: final_layout.o final_layout_sequence.txt final_layout_script.lds gcctestdir/ld +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -Wl,--section-ordering-file,final_layout_sequence.txt -Wl,-T,final_layout_script.lds final_layout.o @GCC_TRUE@@NATIVE_LINKER_TRUE@final_layout.stdout: final_layout @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_NM) -n --synthetic final_layout > final_layout.stdout @GCC_TRUE@@NATIVE_LINKER_TRUE@text_section_grouping.o: text_section_grouping.cc