[ARM] fix handling of "merge strings" sections

Christophe LYON christophe.lyon@st.com
Wed Nov 28 13:41:00 GMT 2007


On 28.11.2007 01:26, Paul Brook wrote:
> On Tuesday 27 November 2007, Christophe LYON wrote:
>> Hello,
>>
>> I propose the following patch to address an issue with code generated by
>> ARM's RVCT 2.2 compiler (which was fixed by 3.0 SP1).
> 
> Code generated by RVCT2.2 and code generated by gcc are fundamentally 
> incompatible in this area. ie. fixing one will break the other. rvct2.2 
> assumes that a relocation refers to the string at the location after applying 
> the relocation addend. gcc assumes the relocation refers to the object at the 
> location of the base symbol.
> 
> The ELF standard gives no clear indication which answer is correct. After 
> consultation withe ARM is was decided that the the ARM EABI should follow the 
> gcc semantics.

OK, I knew that last point.

Thanks for your examples breaking GCC semantics.

The problem I have is that I have to link using GNU ld, using libraries 
compiled with RVCT-2.2 (no way to upgrade the compiler), so the only 
possible workaround I see is modifying GNU ld to handle this corner case.
I propose to restrain further the condition to the ".conststring" 
section (which I believe is not used by GCC) to be safer.

Christophe.


Index: bfd/elf32-arm.c
===================================================================
--- bfd/elf32-arm.c     (revision 220)
+++ bfd/elf32-arm.c     (working copy)
@@ -5660,7 +5660,13 @@ elf32_arm_relocate_section (bfd *
                             + sec->output_offset
                             + sym->st_value);
               if ((sec->flags & SEC_MERGE)
-                      && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
+                 && (
+                     (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
+                     ||
+                     ( (sec->flags & SEC_STRINGS)
+                       && strcmp(sec->name, ".conststring")==0 )
+                     )
+                 )
                 {
                   asection *msec;
                   bfd_vma addend, value;



More information about the Binutils mailing list