This is the mail archive of the binutils-cvs@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]

[binutils-gdb] [ARM] Add FDPIC relocations definitions


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=188fd7aea619d9f66a822bad881d8f56892b60aa

commit 188fd7aea619d9f66a822bad881d8f56892b60aa
Author: Christophe Lyon <christophe.lyon@st.com>
Date:   Tue Mar 20 10:54:59 2018 +0100

    [ARM] Add FDPIC relocations definitions
    
    Add FDPIC relocation definitions in BFD and gas.
    Gas rejects them if the --fdpic option was not specified.
    
    2018-04-25  Christophe Lyon  <christophe.lyon@st.com>
    	Mickaël Guêné  <mickael.guene@st.com>
    
    	bfd/
    	* bfd-in2.c (BFD_RELOC_ARM_GOTFUNCDESC)
    	(BFD_RELOC_ARM_GOTOFFFUNCDESC, BFD_RELOC_ARM_FUNCDESC)
    	(BFD_RELOC_ARM_FUNCDESC_VALUE): New.
    	* elf32-arm.c (elf32_arm_howto_table_2): Add R_ARM_GOTFUNCDESC,
    	R_ARM_GOTOFFFUNCDESC, R_ARM_FUNCDESC, R_ARM_FUNCDESC_VALUE.
    	(elf32_arm_howto_from_type): Take new members of
    	elf32_arm_howto_table_2 into account.
    	(elf32_arm_reloc_map): Add BFD_RELOC_ARM_GOTFUNCDESC,
    	BFD_RELOC_ARM_GOTOFFFUNCDESC, BFD_RELOC_ARM_FUNCDESC,
    	BFD_RELOC_ARM_FUNCDESC_VALUE.
    	* reloc.c: Add BFD_RELOC_ARM_GOTFUNCDESC,
    	BFD_RELOC_ARM_GOTOFFFUNCDESC, BFD_RELOC_ARM_FUNCDESC,
    	BFD_RELOC_ARM_FUNCDESC_VALUE.
    
    	gas/
    	* config/tc-arm.c (reloc_names): Add gotfuncdesc, gotofffuncdesc,
    	funcdesc.
    	(md_apply_fix): Support the new relocations.
    	(tc_gen_reloc): Likewise.
    	* testsuite/gas/arm/reloc-fdpic.d: New.
    	* testsuite/gas/arm/reloc-fdpic.s: New.
    
    	include/
    	* elf/arm.h (R_ARM_GOTFUNCDESC, R_ARM_GOTOFFFUNCDESC)
    	(R_ARM_FUNCDESC)
    	(R_ARM_FUNCDESC_VALUE): Define new relocations.

Diff:
---
 bfd/ChangeLog                       | 17 ++++++++++
 bfd/bfd-in2.h                       |  6 ++++
 bfd/elf32-arm.c                     | 63 +++++++++++++++++++++++++++++++++++--
 bfd/reloc.c                         | 11 +++++++
 gas/ChangeLog                       | 10 ++++++
 gas/config/tc-arm.c                 | 27 +++++++++++++++-
 gas/testsuite/gas/arm/reloc-fdpic.d | 20 ++++++++++++
 gas/testsuite/gas/arm/reloc-fdpic.s |  9 ++++++
 include/ChangeLog                   |  7 +++++
 include/elf/arm.h                   |  4 +++
 10 files changed, 170 insertions(+), 4 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index dd28d04..9b50933 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,6 +1,23 @@
 2018-04-25  Christophe Lyon  <christophe.lyon@st.com>
 	Mickaël Guêné  <mickael.guene@st.com>
 
+	* bfd-in2.c (BFD_RELOC_ARM_GOTFUNCDESC)
+	(BFD_RELOC_ARM_GOTOFFFUNCDESC, BFD_RELOC_ARM_FUNCDESC)
+	(BFD_RELOC_ARM_FUNCDESC_VALUE): New.
+	* elf32-arm.c (elf32_arm_howto_table_2): Add R_ARM_GOTFUNCDESC,
+	R_ARM_GOTOFFFUNCDESC, R_ARM_FUNCDESC, R_ARM_FUNCDESC_VALUE.
+	(elf32_arm_howto_from_type): Take new members of
+	elf32_arm_howto_table_2 into account.
+	(elf32_arm_reloc_map): Add BFD_RELOC_ARM_GOTFUNCDESC,
+	BFD_RELOC_ARM_GOTOFFFUNCDESC, BFD_RELOC_ARM_FUNCDESC,
+	BFD_RELOC_ARM_FUNCDESC_VALUE.
+	* reloc.c: Add BFD_RELOC_ARM_GOTFUNCDESC,
+	BFD_RELOC_ARM_GOTOFFFUNCDESC, BFD_RELOC_ARM_FUNCDESC,
+	BFD_RELOC_ARM_FUNCDESC_VALUE.
+
+2018-04-25  Christophe Lyon  <christophe.lyon@st.com>
+	Mickaël Guêné  <mickael.guene@st.com>
+
 	* elf32-arm.c (elf32_arm_print_private_bfd_data): Support
 	EF_ARM_PIC and ELFOSABI_ARM_FDPIC.
 	(elf32_arm_post_process_headers): Support ELFOSABI_ARM_FDPIC.
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 97c37a0..f58c2f7 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -3526,6 +3526,12 @@ pc-relative or some form of GOT-indirect relocation.  */
   BFD_RELOC_ARM_THUMB_MOVW_PCREL,
   BFD_RELOC_ARM_THUMB_MOVT_PCREL,
 
+/* ARM FDPIC specific relocations. */
+  BFD_RELOC_ARM_GOTFUNCDESC,
+  BFD_RELOC_ARM_GOTOFFFUNCDESC,
+  BFD_RELOC_ARM_FUNCDESC,
+  BFD_RELOC_ARM_FUNCDESC_VALUE,
+
 /* Relocations for setting up GOTs and PLTs for shared libraries.  */
   BFD_RELOC_ARM_JUMP_SLOT,
   BFD_RELOC_ARM_GLOB_DAT,
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index a0b0be3..3805f71 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -1746,7 +1746,7 @@ static reloc_howto_type elf32_arm_howto_table_1[] =
 };
 
 /* 160 onwards: */
-static reloc_howto_type elf32_arm_howto_table_2[1] =
+static reloc_howto_type elf32_arm_howto_table_2[5] =
 {
   HOWTO (R_ARM_IRELATIVE,	/* type */
 	 0,			/* rightshift */
@@ -1760,7 +1760,59 @@ static reloc_howto_type elf32_arm_howto_table_2[1] =
 	 TRUE,			/* partial_inplace */
 	 0xffffffff,		/* src_mask */
 	 0xffffffff,		/* dst_mask */
-	 FALSE)			/* pcrel_offset */
+	 FALSE),		/* pcrel_offset */
+  HOWTO (R_ARM_GOTFUNCDESC,	/* type */
+	 0,			/* rightshift */
+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+	 32,			/* bitsize */
+	 FALSE,			/* pc_relative */
+	 0,			/* bitpos */
+	 complain_overflow_bitfield,/* complain_on_overflow */
+	 bfd_elf_generic_reloc,	/* special_function */
+	 "R_ARM_GOTFUNCDESC",	/* name */
+	 FALSE,			/* partial_inplace */
+	 0,			/* src_mask */
+	 0xffffffff,		/* dst_mask */
+	 FALSE),		/* pcrel_offset */
+  HOWTO (R_ARM_GOTOFFFUNCDESC, /* type */
+	 0,			/* rightshift */
+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+	 32,			/* bitsize */
+	 FALSE,			/* pc_relative */
+	 0,			/* bitpos */
+	 complain_overflow_bitfield,/* complain_on_overflow */
+	 bfd_elf_generic_reloc,	/* special_function */
+	 "R_ARM_GOTOFFFUNCDESC",/* name */
+	 FALSE,			/* partial_inplace */
+	 0,			/* src_mask */
+	 0xffffffff,		/* dst_mask */
+	 FALSE),		/* pcrel_offset */
+  HOWTO (R_ARM_FUNCDESC,	/* type */
+	 0,			/* rightshift */
+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+	 32,			/* bitsize */
+	 FALSE,			/* pc_relative */
+	 0,			/* bitpos */
+	 complain_overflow_bitfield,/* complain_on_overflow */
+	 bfd_elf_generic_reloc,	/* special_function */
+	 "R_ARM_FUNCDESC",	/* name */
+	 FALSE,			/* partial_inplace */
+	 0,			/* src_mask */
+	 0xffffffff,		/* dst_mask */
+	 FALSE),		/* pcrel_offset */
+  HOWTO (R_ARM_FUNCDESC_VALUE,	/* type */
+	 0,			/* rightshift */
+	 2,			/* size (0 = byte, 1 = short, 2 = long) */
+	 64,			/* bitsize */
+	 FALSE,			/* pc_relative */
+	 0,			/* bitpos */
+	 complain_overflow_bitfield,/* complain_on_overflow */
+	 bfd_elf_generic_reloc,	/* special_function */
+	 "R_ARM_FUNCDESC_VALUE",/* name */
+	 FALSE,			/* partial_inplace */
+	 0,			/* src_mask */
+	 0xffffffff,		/* dst_mask */
+	 FALSE),		/* pcrel_offset */
 };
 
 /* 249-255 extended, currently unused, relocations:  */
@@ -1829,7 +1881,8 @@ elf32_arm_howto_from_type (unsigned int r_type)
   if (r_type < ARRAY_SIZE (elf32_arm_howto_table_1))
     return &elf32_arm_howto_table_1[r_type];
 
-  if (r_type == R_ARM_IRELATIVE)
+  if (r_type >= R_ARM_IRELATIVE
+      && r_type < R_ARM_IRELATIVE + ARRAY_SIZE (elf32_arm_howto_table_2))
     return &elf32_arm_howto_table_2[r_type - R_ARM_IRELATIVE];
 
   if (r_type >= R_ARM_RREL32
@@ -1913,6 +1966,10 @@ static const struct elf32_arm_reloc_map elf32_arm_reloc_map[] =
     {BFD_RELOC_ARM_TLS_IE32,	     R_ARM_TLS_IE32},
     {BFD_RELOC_ARM_TLS_LE32,	     R_ARM_TLS_LE32},
     {BFD_RELOC_ARM_IRELATIVE,	     R_ARM_IRELATIVE},
+    {BFD_RELOC_ARM_GOTFUNCDESC,      R_ARM_GOTFUNCDESC},
+    {BFD_RELOC_ARM_GOTOFFFUNCDESC,   R_ARM_GOTOFFFUNCDESC},
+    {BFD_RELOC_ARM_FUNCDESC,         R_ARM_FUNCDESC},
+    {BFD_RELOC_ARM_FUNCDESC_VALUE,   R_ARM_FUNCDESC_VALUE},
     {BFD_RELOC_VTABLE_INHERIT,	     R_ARM_GNU_VTINHERIT},
     {BFD_RELOC_VTABLE_ENTRY,	     R_ARM_GNU_VTENTRY},
     {BFD_RELOC_ARM_MOVW,	     R_ARM_MOVW_ABS_NC},
diff --git a/bfd/reloc.c b/bfd/reloc.c
index 80db0c9..e78e582 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -3208,6 +3208,17 @@ ENUMDOC
   Low and High halfword relocations for MOVW and MOVT instructions.
 
 ENUM
+  BFD_RELOC_ARM_GOTFUNCDESC
+ENUMX
+  BFD_RELOC_ARM_GOTOFFFUNCDESC
+ENUMX
+  BFD_RELOC_ARM_FUNCDESC
+ENUMX
+  BFD_RELOC_ARM_FUNCDESC_VALUE
+ENUMDOC
+  ARM FDPIC specific relocations.
+
+ENUM
   BFD_RELOC_ARM_JUMP_SLOT
 ENUMX
   BFD_RELOC_ARM_GLOB_DAT
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 5db76c9..122daaa 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,6 +1,16 @@
 2018-04-25  Christophe Lyon  <christophe.lyon@st.com>
 	Mickaël Guêné  <mickael.guene@st.com>
 
+	* config/tc-arm.c (reloc_names): Add gotfuncdesc, gotofffuncdesc,
+	funcdesc.
+	(md_apply_fix): Support the new relocations.
+	(tc_gen_reloc): Likewise.
+	* testsuite/gas/arm/reloc-fdpic.d: New.
+	* testsuite/gas/arm/reloc-fdpic.s: New.
+
+2018-04-25  Christophe Lyon  <christophe.lyon@st.com>
+	Mickaël Guêné  <mickael.guene@st.com>
+
 	* config/tc-arm.c (arm_fdpic): New.
 	(elf32_arm_target_format): Support FDPIC.
 	(OPTION_FDPIC): New.
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index d735609..33a88bb 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -19303,7 +19303,13 @@ static struct reloc_entry reloc_names[] =
   { "tlscall", BFD_RELOC_ARM_TLS_CALL},
 	{ "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
   { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
-	{ "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ}
+	{ "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ},
+  { "gotfuncdesc", BFD_RELOC_ARM_GOTFUNCDESC },
+	{ "GOTFUNCDESC", BFD_RELOC_ARM_GOTFUNCDESC },
+  { "gotofffuncdesc", BFD_RELOC_ARM_GOTOFFFUNCDESC },
+	{ "GOTOFFFUNCDESC", BFD_RELOC_ARM_GOTOFFFUNCDESC },
+  { "funcdesc", BFD_RELOC_ARM_FUNCDESC },
+	{ "FUNCDESC", BFD_RELOC_ARM_FUNCDESC }
 };
 #endif
 
@@ -23992,6 +23998,22 @@ md_apply_fix (fixS *	fixP,
       if (fixP->fx_done || !seg->use_rela_p)
 	md_number_to_chars (buf, fixP->fx_offset, 4);
       break;
+
+      /* Relocations for FDPIC.  */
+    case BFD_RELOC_ARM_GOTFUNCDESC:
+    case BFD_RELOC_ARM_GOTOFFFUNCDESC:
+    case BFD_RELOC_ARM_FUNCDESC:
+      if (arm_fdpic)
+	{
+	  if (fixP->fx_done || !seg->use_rela_p)
+	    md_number_to_chars (buf, 0, 4);
+	}
+      else
+	{
+	  as_bad_where (fixP->fx_file, fixP->fx_line,
+			_("Relocation supported only in FDPIC mode"));
+      }
+      break;
 #endif
 
     case BFD_RELOC_RVA:
@@ -24753,6 +24775,9 @@ tc_gen_reloc (asection *section, fixS *fixp)
     case BFD_RELOC_ARM_THUMB_ALU_ABS_G1_NC:
     case BFD_RELOC_ARM_THUMB_ALU_ABS_G2_NC:
     case BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC:
+    case BFD_RELOC_ARM_GOTFUNCDESC:
+    case BFD_RELOC_ARM_GOTOFFFUNCDESC:
+    case BFD_RELOC_ARM_FUNCDESC:
       code = fixp->fx_r_type;
       break;
 
diff --git a/gas/testsuite/gas/arm/reloc-fdpic.d b/gas/testsuite/gas/arm/reloc-fdpic.d
new file mode 100644
index 0000000..c25aa80
--- /dev/null
+++ b/gas/testsuite/gas/arm/reloc-fdpic.d
@@ -0,0 +1,20 @@
+#as: --fdpic
+#objdump: -dr --show-raw-insn
+#name: FDPIC relocations
+# This test is only valid on ELF based ports.
+#not-skip: arm*-*-uclinuxfdpiceabi
+
+.*: +file format .*arm.*
+
+
+Disassembly of section .text:
+
+00000000 <myfunc-0xc>:
+.*
+			0: R_ARM_GOTFUNCDESC	myfunc
+			4: R_ARM_GOTOFFFUNCDESC	myfunc
+			8: R_ARM_FUNCDESC	myfunc
+
+0000000c <myfunc>:
+   c:	e12fff1e 	bx	lr
+.*
\ No newline at end of file
diff --git a/gas/testsuite/gas/arm/reloc-fdpic.s b/gas/testsuite/gas/arm/reloc-fdpic.s
new file mode 100644
index 0000000..cbb61c5
--- /dev/null
+++ b/gas/testsuite/gas/arm/reloc-fdpic.s
@@ -0,0 +1,9 @@
+	.syntax unified
+
+	.word myfunc(GOTFUNCDESC)
+	.word myfunc(GOTOFFFUNCDESC)
+	.word myfunc(FUNCDESC)
+
+	.type myfunc, %function
+myfunc:
+	bx	lr
diff --git a/include/ChangeLog b/include/ChangeLog
index d159a25..6b52420 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,6 +1,13 @@
 2018-04-25  Christophe Lyon  <christophe.lyon@st.com>
 	Mickaël Guêné  <mickael.guene@st.com>
 
+	* elf/arm.h (R_ARM_GOTFUNCDESC, R_ARM_GOTOFFFUNCDESC)
+	(R_ARM_FUNCDESC)
+	(R_ARM_FUNCDESC_VALUE): Define new relocations.
+
+2018-04-25  Christophe Lyon  <christophe.lyon@st.com>
+	Mickaël Guêné  <mickael.guene@st.com>
+
 	* elf/arm.h (EF_ARM_FDPIC): New.
 
 2018-04-18  Alan Modra  <amodra@gmail.com>
diff --git a/include/elf/arm.h b/include/elf/arm.h
index fb9c5f6..158f7b1 100644
--- a/include/elf/arm.h
+++ b/include/elf/arm.h
@@ -240,6 +240,10 @@ START_RELOC_NUMBERS (elf_arm_reloc_type)
   RELOC_NUMBER (R_ARM_THM_ALU_ABS_G3_NC,135)
 
   RELOC_NUMBER (R_ARM_IRELATIVE,      	160)
+  RELOC_NUMBER (R_ARM_GOTFUNCDESC,    	161)
+  RELOC_NUMBER (R_ARM_GOTOFFFUNCDESC, 	162)
+  RELOC_NUMBER (R_ARM_FUNCDESC,       	163)
+  RELOC_NUMBER (R_ARM_FUNCDESC_VALUE, 	164)
 
   /* Extensions?  R=read-only?  */
   RELOC_NUMBER (R_ARM_RXPC25,         	249)


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