public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* RE: Don't use STT_ARM_TFUNC for final links
@ 2004-11-19 19:24 Richard Earnshaw
  0 siblings, 0 replies; 3+ messages in thread
From: Richard Earnshaw @ 2004-11-19 19:24 UTC (permalink / raw)
  To: paul, binutils; +Cc: Daniel Jacobowitz

> 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.
> 

OK.

R.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Don't use STT_ARM_TFUNC for final links
  2004-11-18 20:03 Richard Earnshaw
@ 2004-11-19 15:49 ` Paul Brook
  0 siblings, 0 replies; 3+ messages in thread
From: Paul Brook @ 2004-11-19 15:49 UTC (permalink / raw)
  To: binutils; +Cc: Richard Earnshaw, Daniel Jacobowitz

[-- Attachment #1: Type: text/plain, Size: 1957 bytes --]

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.

[-- Attachment #2: patch.thumb_eabi --]
[-- Type: text/x-diff, Size: 3994 bytes --]

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__

^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: Don't use STT_ARM_TFUNC for final links
@ 2004-11-18 20:03 Richard Earnshaw
  2004-11-19 15:49 ` Paul Brook
  0 siblings, 1 reply; 3+ messages in thread
From: Richard Earnshaw @ 2004-11-18 20:03 UTC (permalink / raw)
  To: Daniel Jacobowitz, binutils

> 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.

R.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2004-11-19 19:24 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-11-19 19:24 Don't use STT_ARM_TFUNC for final links Richard Earnshaw
  -- strict thread matches above, loose matches on Subject: below --
2004-11-18 20:03 Richard Earnshaw
2004-11-19 15:49 ` Paul Brook

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).