[ARM] Add FDPIC OSABI flag support.
authorChristophe Lyon <christophe.lyon@st.com>
Tue, 20 Mar 2018 09:54:50 +0000 (10:54 +0100)
committerChristophe Lyon <christophe.lyon@linaro.org>
Wed, 25 Apr 2018 20:49:57 +0000 (20:49 +0000)
ELF files targetting ARM FDPIC use the ELFOSABI_ARM_FDPIC flag.
Set it appropriately in file generators (eg. gas), and handle it in
readers (eg. readelf).

2018-04-25  Christophe Lyon  <christophe.lyon@st.com>
Mickaël Guêné  <mickael.guene@st.com>

bfd/
* 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.
(ELF_OSABI): Define to ELFOSABI_ARM_FDPIC.

binutils/
* readelf.c (decode_ARM_machine_flags): Support EF_ARM_PIC.
(get_osabi_name): Support ELFOSABI_ARM_FDPIC.

gas/
* config/tc-arm.c (arm_fdpic): New.
(elf32_arm_target_format): Support FDPIC.
(OPTION_FDPIC): New.
(md_longopts): Support FDPIC.
(md_parse_option): Likewise.
(md_show_usage): Likewise.

include/
* elf/arm.h (EF_ARM_FDPIC): New.

bfd/ChangeLog
bfd/elf32-arm.c
binutils/ChangeLog
binutils/readelf.c
gas/ChangeLog
gas/config/tc-arm.c
include/ChangeLog
include/elf/common.h

index ed96fcdda5d24424f85277a2316cbc9a26eca10e..dd28d04fccf263607c525e19aa35f733dc5acf79 100644 (file)
@@ -1,3 +1,11 @@
+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.
+       (ELF_OSABI): Define to ELFOSABI_ARM_FDPIC.
+
 2018-04-25  Christophe Lyon  <christophe.lyon@st.com>
        Mickaël Guêné  <mickael.guene@st.com>
 
index 565bb404f2ceca749bb30cf19ce2a69d9db64852..a0b0be3f16078db8da092708d464ea6d578fe4e2 100644 (file)
@@ -14280,7 +14280,13 @@ elf32_arm_print_private_bfd_data (bfd *abfd, void * ptr)
   if (flags & EF_ARM_RELEXEC)
     fprintf (file, _(" [relocatable executable]"));
 
-  flags &= ~EF_ARM_RELEXEC;
+  if (flags & EF_ARM_PIC)
+    fprintf (file, _(" [position independent]"));
+
+  if (elf_elfheader (abfd)->e_ident[EI_OSABI] == ELFOSABI_ARM_FDPIC)
+    fprintf (file, _(" [FDPIC ABI supplement]"));
+
+  flags &= ~ (EF_ARM_RELEXEC | EF_ARM_PIC);
 
   if (flags)
     fprintf (file, _("<Unrecognised flag bits set>"));
@@ -16642,6 +16648,9 @@ elf32_arm_post_process_headers (bfd * abfd, struct bfd_link_info * link_info ATT
       globals = elf32_arm_hash_table (link_info);
       if (globals != NULL && globals->byteswap_code)
        i_ehdrp->e_flags |= EF_ARM_BE8;
+
+      if (globals->fdpic_p)
+       i_ehdrp->e_ident[EI_OSABI] |= ELFOSABI_ARM_FDPIC;
     }
 
   if (EF_ARM_EABI_VERSION (i_ehdrp->e_flags) == EF_ARM_EABI_VER5
@@ -19427,6 +19436,8 @@ elf32_arm_nacl_plt_sym_val (bfd_vma i, const asection *plt,
 #define TARGET_BIG_NAME                        "elf32-bigarm-fdpic"
 #undef elf_match_priority
 #define elf_match_priority             128
+#undef ELF_OSABI
+#define ELF_OSABI              ELFOSABI_ARM_FDPIC
 
 /* Like elf32_arm_link_hash_table_create -- but overrides
    appropriately for FDPIC.  */
@@ -19454,6 +19465,7 @@ elf32_arm_fdpic_link_hash_table_create (bfd *abfd)
 
 #include "elf32-target.h"
 #undef elf_match_priority
+#undef ELF_OSABI
 
 /* VxWorks Targets.  */
 
index 2b2c709d19862bf94c230860146a7ebe3bd563e2..68e5175e938ffc940c35570a9f68f30872c1ba67 100644 (file)
@@ -1,3 +1,9 @@
+2018-04-25  Christophe Lyon  <christophe.lyon@st.com>
+       Mickaël Guêné  <mickael.guene@st.com>
+
+       * readelf.c (decode_ARM_machine_flags): Support EF_ARM_PIC.
+       (get_osabi_name): Support ELFOSABI_ARM_FDPIC.
+
 2018-04-25  Alan Modra  <amodra@gmail.com>
 
        * testsuite/binutils-all/arm/objdump.exp: Remove arm-aout and
index 528954cc6e1af2e375445e31f4160964c54ea5fe..e8e1b9681eb894ab6597000208542f3d9ab01327 100644 (file)
@@ -2578,6 +2578,12 @@ decode_ARM_machine_flags (unsigned e_flags, char buf[])
       e_flags &= ~ EF_ARM_RELEXEC;
     }
 
+  if (e_flags & EF_ARM_PIC)
+    {
+      strcat (buf, ", position independent");
+      e_flags &= ~ EF_ARM_PIC;
+    }
+
   /* Now handle EABI specific flags.  */
   switch (eabi)
     {
@@ -3718,6 +3724,7 @@ get_osabi_name (Filedata * filedata, unsigned int osabi)
            switch (osabi)
              {
              case ELFOSABI_ARM:        return "ARM";
+             case ELFOSABI_ARM_FDPIC:  return "ARM FDPIC";
              default:
                break;
              }
index e8c0f7dbb2ebd54c87b3186a5dc2ccff9de611c5..5db76c97706317c2320e960c5b3323ee9ad9adee 100644 (file)
@@ -1,3 +1,13 @@
+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.
+       (md_longopts): Support FDPIC.
+       (md_parse_option): Likewise.
+       (md_show_usage): Likewise.
+
 2018-04-25  Tamar Christina  <tamar.christina@arm.com>
 
        * testsuite/gas/aarch64/rdma.s: Test for larger register numbers.
index f7bddd7a6e18c385224d73cc2db598d64abd49d4..d735609eca5c1960b2ba95420620584536ebada5 100644 (file)
@@ -75,6 +75,9 @@ static struct
   unsigned       sp_restored:1;
 } unwind;
 
+/* Whether --fdpic was given.  */
+static int arm_fdpic;
+
 #endif /* OBJ_ELF */
 
 /* Results from operand parsing worker functions.  */
@@ -25079,10 +25082,20 @@ elf32_arm_target_format (void)
          ? "elf32-bigarm-nacl"
          : "elf32-littlearm-nacl");
 #else
-  if (target_big_endian)
-    return "elf32-bigarm";
+  if (arm_fdpic)
+    {
+      if (target_big_endian)
+       return "elf32-bigarm-fdpic";
+      else
+       return "elf32-littlearm-fdpic";
+    }
   else
-    return "elf32-littlearm";
+    {
+      if (target_big_endian)
+       return "elf32-bigarm";
+      else
+       return "elf32-littlearm";
+    }
 #endif
 }
 
@@ -25602,6 +25615,7 @@ const char * md_shortopts = "m:k";
 #endif
 #endif
 #define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
+#define OPTION_FDPIC (OPTION_MD_BASE + 3)
 
 struct option md_longopts[] =
 {
@@ -25612,6 +25626,9 @@ struct option md_longopts[] =
   {"EL", no_argument, NULL, OPTION_EL},
 #endif
   {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
+#ifdef OBJ_ELF
+  {"fdpic", no_argument, NULL, OPTION_FDPIC},
+#endif
   {NULL, no_argument, NULL, 0}
 };
 
@@ -26783,6 +26800,12 @@ md_parse_option (int c, const char * arg)
       fix_v4bx = TRUE;
       break;
 
+#ifdef OBJ_ELF
+    case OPTION_FDPIC:
+      arm_fdpic = TRUE;
+      break;
+#endif /* OBJ_ELF */
+
     case 'a':
       /* Listing option.  Just ignore these, we don't support additional
         ones.  */
@@ -26877,6 +26900,11 @@ md_show_usage (FILE * fp)
 
   fprintf (fp, _("\
   --fix-v4bx              Allow BX in ARMv4 code\n"));
+
+#ifdef OBJ_ELF
+  fprintf (fp, _("\
+  --fdpic                 generate an FDPIC object file\n"));
+#endif /* OBJ_ELF */
 }
 
 #ifdef OBJ_ELF
index 940136eaf1b486f64d958737a130ec9dd2b23f3e..d159a25c0566ca0c64b1340f5b32e9a3e5fee543 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        * coff/mipspe.h: Delete.
index f4354721bf5d2a7794dd6bb6c53a66d851288e10..469fe5a98740bb816643d3de820ca72c8c33b76f 100644 (file)
@@ -78,6 +78,7 @@
 
 #define ELFOSABI_C6000_ELFABI 64 /* Bare-metal TMS320C6000 */
 #define ELFOSABI_C6000_LINUX 65 /* Linux TMS320C6000 */
+#define ELFOSABI_ARM_FDPIC   65 /* ARM FDPIC */
 #define ELFOSABI_ARM        97 /* ARM */
 #define ELFOSABI_STANDALONE 255        /* Standalone (embedded) application */