This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Linker scripts and Section Reordering.


On Wed, Jan 9, 2013 at 7:46 AM, Ian Lance Taylor <iant@google.com> wrote:
> On Tue, Jan 8, 2013 at 2:59 PM, Sriraman Tallam <tmsriram@google.com> wrote:
>>
>>   Using linker scripts along with section reordering, either through
>> --section-ordering-file or the plugin, can cause bugs during segment
>> address computation.
>>
>>   Linker scripts fire first, in file layout.cc,  function
>> "relaxation_loop_body" calls function
>> "set_section_addresses_from_script" and computes an output section
>> address for ".text". This can also sort text input sections if
>> specified via the linker script.
>>
>>    Section ordering sorting comes later and is called in a chain of
>> events starting from function "set_segment_offsets" which is called
>> again from function "relaxation_loop_body" in layout.cc. With section
>> ordering sorting, the output_section size can change, considering
>> alignment. If the resulting size happens to be smaller than what was
>> computed earlier, we get an error  of the form "address of section
>> <section-name> moves backward from XXX to YYY". This error will
>> correspond to the section that follows ".text" in the linker script as
>> its start address begins  where ".text" ends. This error code is
>> located in file output.cc in function "set_section_list_addresses".
>>
>>    The other problem is that of handling section sorting when it is
>> specified via linker scripts and section reordering. We encountered
>> this problem with the kernel where we cannot do without linker
>> scripts. We found that plugin based section reordering in the kernel
>> improves the performance of some applications but we also wanted the
>> ordering to be compatible with the linker script used.
>>
>>    To solve these problems, I propose the following simple patch. This
>> patch will invoke section sorting earlier, before the linker script
>> can compute the address of the output section. Then, the linker script
>> can re-sort the sections and the new computed address will be correct
>> as the order of sections will not change.
>>
>>   With the patch, the resulting order of input sections is definitely
>> agreeable with the linker script specification. All other input
>> sections which the linker script did not care about will be agreeable
>> with the section ordering spec. If we make the linker script sorting
>> glob generic, like specify just ".text.*"  within the sections clause,
>> then we can get the sorting from section ordering alone.
>>
>>
>> Patch attached.
>>
>>         * output.h (sort_attached_input_sections): Change to be public.
>>         * script-sections.cc (set_section_addresses): Call
>> sort_attached_input_sections
>>         before linker script assigns section addresses.
>
>>    // Sort the attached input sections.
>> -  void
>> -  sort_attached_input_sections();
>> +  // void
>> +  // sort_attached_input_sections();
>
> Remove this, don't just comment it out.

Sorry, this was just oversight.

>
>> +      if (os != NULL
>> +       && os->input_section_order_specified())
>> +     os->sort_attached_input_sections();
>
> It seems to me that this should be in
> Output_section_definition::set_section_addresses.  You may need it in
> Orphan_output_section::set_section_addresses but probably not.

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.

>
> Your patch implies that the ordering in the linker script overrides
> --section-ordering-file or a plugin.  This should be documented in a
> comment at least.

Done now.

I also updated the section_ordering_file testcase to use a simple linker script.
Thanks,

Sri

>
> Ian

Attachment: script_ordering_bug.txt
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]