Linker scripts and Section Reordering.

Sriraman Tallam tmsriram@google.com
Wed Jan 9 23:40:00 GMT 2013


On Wed, Jan 9, 2013 at 3:22 PM, Ian Lance Taylor <iant@google.com> wrote:
> On Wed, Jan 9, 2013 at 2:46 PM, Sriraman Tallam <tmsriram@google.com> wrote:
>>
>> I moved this to Output_section_definition::set_section_addresses. I
>> dont think this is necessary in
>> Orphan_output_section::set_section_addresses for the following reason.
>> Orphan_output_sections are for those not seen in the linker script.
>> Such an output section is created for every input section that is not
>> caught in the linker script. Such input sections are not grouped by
>> prefix as the output_section_name method in script-sections.cc is used
>> to group them. So, these input sections cannot be handled by section
>> ordering.

It seems like this is needed in
Orphan_output_section::set_section_addresses too. I can have cases
where there are multiple input sections with the same name that are
not referenced by the linker script. They will all be grouped under
one Orphan_output_section and this can be reordered later. I have
attached the new patch with this correction. Sorry about the
confusion. I have attached the new patch. I duplicated the code in
set_section_addresses. I did not create a new function as only the
comments are long and repeating.
Thanks,

Sri


>
> This patch is OK.
>
> Thanks.
>
> Ian
-------------- next part --------------
	* 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


More information about the Binutils mailing list