This is the mail archive of the binutils@sources.redhat.com 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: Don't use STT_ARM_TFUNC for final links


On Thursday 18 November 2004 20:03, Richard Earnshaw wrote:
> > I made this change only for final links because it's less of
> > a compatibility
> > issue than for relocatable output.  For EABI objects,
> > presumably we should
> > do the same.  For non-EABI objects, I'm not sure if it should
> > be changed or
> > left alone; I have no idea what other tools are affected.
> > However, since
> > dynamic objects containing Thumb symbols did not work
> > properly before my
> > last change, I see no reason to conditionalize it.
>
> It needs to be done for objects too.  Without it, other toolchains can't
> consume GAS assembled objects that claim to conform to the EABI.
>
> There's no reason why the tricks shouldn't work on objects, so I think
> it should be done there too.
>
> As to the issue of backward compatibility, there shouldn't be a problem
> in binutils, they will just do the appropriate transformation when
> reading in object files.  As for other tools, then I think they are just
> going to have to get used to the new form.  It is better that functions
> really are tagged with STT_FUNC rather than a machine-dependent value,
> and Thumb-ness really isn't that special.

The attached patch does this. I pushed the transformation down into 
bfd_swap_symbol_{in,out} so that objcopy works. I had to make this change 
unconditionally because objcopy does not set the EABI version in e_flags 
until after the symbol table has been written out.

This means and ABI change for thumb objects.  New binutils/BFD will 
transparently handle both new and old format symbol tables.

Tested with cross to arm-none-eabi, and light testing on arm-linux.
Ok?

Paul

2004-11-19  Paul Brook  <paul@codesourcery.com>

bfd/
 * elf32-arm.c (elf32_arm_swap_symbol_in): New function.
 (elf32_arm_swap_symbol_out): New function.
 (elf32_arm_size_info): Add.
 (elf_backend_size_info): Define.
ld/
 * testsuite/ld-arm/mixed-lib.sym: Update for THUMB_FUNC change.
Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.10
diff -u -p -r1.10 elf32-arm.c
--- bfd/elf32-arm.c	19 Nov 2004 11:58:02 -0000	1.10
+++ bfd/elf32-arm.c	19 Nov 2004 14:34:15 -0000
@@ -5662,6 +5662,82 @@ elf32_arm_symbol_processing (bfd *abfd A
     elfsym->symbol.flags |= BSF_FUNCTION;
 }
 
+
+/* Mangle thumb function symbols as we read them in.  */
+
+static void
+elf32_arm_swap_symbol_in (bfd * abfd,
+			  const void *psrc,
+			  const void *pshn,
+			  Elf_Internal_Sym *dst)
+{
+  bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst);
+
+  /* New EABI objects mark thumb function symbols by setting the low bit of
+     the address.  Turn these into STT_ARM_TFUNC.  */
+  if (ELF_ST_TYPE (dst->st_info) == STT_FUNC
+      && (dst->st_value & 1))
+    {
+      dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
+      dst->st_value &= ~(bfd_vma) 1;
+    }
+}
+
+
+/* Mangle thumb function symbols as we write them out.  */
+
+static void
+elf32_arm_swap_symbol_out (bfd *abfd,
+			   const Elf_Internal_Sym *src,
+			   void *cdst,
+			   void *shndx)
+{
+  Elf_Internal_Sym newsym;
+
+  /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit
+     of the address set, as per the new EABI.  We do this unconditionally
+     because objcopy does not set the elf header flags until after
+     it writes out the symbol table.  */
+  if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC)
+    {
+      newsym = *src;
+      newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC);
+      newsym.st_value |= 1;
+      
+      src = &newsym;
+    }
+  bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
+}
+
+/* We use this to override swap_symbol_in and swap_symbol_out.  */
+const struct elf_size_info elf32_arm_size_info = {
+  sizeof (Elf32_External_Ehdr),
+  sizeof (Elf32_External_Phdr),
+  sizeof (Elf32_External_Shdr),
+  sizeof (Elf32_External_Rel),
+  sizeof (Elf32_External_Rela),
+  sizeof (Elf32_External_Sym),
+  sizeof (Elf32_External_Dyn),
+  sizeof (Elf_External_Note),
+  4,
+  1,
+  32, 2,
+  ELFCLASS32, EV_CURRENT,
+  bfd_elf32_write_out_phdrs,
+  bfd_elf32_write_shdrs_and_ehdr,
+  bfd_elf32_write_relocs,
+  elf32_arm_swap_symbol_in,
+  elf32_arm_swap_symbol_out,
+  bfd_elf32_slurp_reloc_table,
+  bfd_elf32_slurp_symbol_table,
+  bfd_elf32_swap_dyn_in,
+  bfd_elf32_swap_dyn_out,
+  bfd_elf32_swap_reloc_in,
+  bfd_elf32_swap_reloc_out,
+  bfd_elf32_swap_reloca_in,
+  bfd_elf32_swap_reloca_out
+};
+
 #define ELF_ARCH			bfd_arch_arm
 #define ELF_MACHINE_CODE		EM_ARM
 #ifdef __QNXTARGET__
@@ -5701,6 +5777,7 @@ elf32_arm_symbol_processing (bfd *abfd A
 #define elf_backend_final_write_processing      elf32_arm_final_write_processing
 #define elf_backend_copy_indirect_symbol        elf32_arm_copy_indirect_symbol
 #define elf_backend_symbol_processing		elf32_arm_symbol_processing
+#define elf_backend_size_info			elf32_arm_size_info
 
 #define elf_backend_can_refcount    1
 #define elf_backend_can_gc_sections 1
Index: ld/testsuite/ld-arm/mixed-lib.sym
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/mixed-lib.sym,v
retrieving revision 1.1
diff -u -p -r1.1 mixed-lib.sym
--- ld/testsuite/ld-arm/mixed-lib.sym	17 Nov 2004 17:50:27 -0000	1.1
+++ ld/testsuite/ld-arm/mixed-lib.sym	19 Nov 2004 14:34:16 -0000
@@ -3,7 +3,7 @@ Symbol table for image:
   Num Buc:    Value  Size   Type   Bind Vis      Ndx Name
    ..  ..: ........     0  NOTYPE GLOBAL DEFAULT ABS _edata
    ..  ..: .......0    20    FUNC GLOBAL DEFAULT   6 lib_func1
-   ..  ..: .......0     2  THUMB_FUNC GLOBAL DEFAULT   6 lib_func2
+   ..  ..: .......1     2    FUNC GLOBAL DEFAULT   6 lib_func2
    ..  ..: ........     0  NOTYPE GLOBAL DEFAULT ABS _bss_end__
    ..  ..: ........     0  OBJECT GLOBAL DEFAULT ABS _DYNAMIC
    ..  ..: ........     0  NOTYPE GLOBAL DEFAULT ABS __bss_end__

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