Make creation of text-relocations a fatal error by default, with -znotext
authorguenther <guenther@openbsd.org>
Tue, 21 Jun 2016 02:55:57 +0000 (02:55 +0000)
committerguenther <guenther@openbsd.org>
Tue, 21 Jun 2016 02:55:57 +0000 (02:55 +0000)
to permit it and -ztext to reenable the default of forbidding it.

ok kettenis@

gnu/usr.bin/binutils-2.17/bfd/elflink.c
gnu/usr.bin/binutils-2.17/include/bfdlink.h
gnu/usr.bin/binutils-2.17/ld/emultempl/elf32.em
gnu/usr.bin/binutils-2.17/ld/ld.texinfo
gnu/usr.bin/binutils-2.17/ld/ldmain.c

index 17d09f8..677fd5b 100644 (file)
@@ -8680,27 +8680,30 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
        goto error_return;
 
       /* Check for DT_TEXTREL (late, in case the backend removes it).  */
-      if (info->warn_shared_textrel && info->shared)
+      if (!info->allow_textrel || (info->warn_shared_textrel && info->shared))
        {
          bfd_byte *dyncon, *dynconend;
 
          /* Fix up .dynamic entries.  */
          o = bfd_get_section_by_name (dynobj, ".dynamic");
-         BFD_ASSERT (o != NULL);
-
-         dyncon = o->contents;
-         dynconend = o->contents + o->size;
-         for (; dyncon < dynconend; dyncon += bed->s->sizeof_dyn)
+         if (o != NULL)
            {
-             Elf_Internal_Dyn dyn;
+             dyncon = o->contents;
+             dynconend = o->contents + o->size;
+             for (; dyncon < dynconend; dyncon += bed->s->sizeof_dyn)
+               {
+                 Elf_Internal_Dyn dyn;
 
-             bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
+                 bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
 
-             if (dyn.d_tag == DT_TEXTREL)
-               {
-                 _bfd_error_handler
-                   (_("warning: creating a DT_TEXTREL in a shared object."));
-                 break;
+                 if (dyn.d_tag == DT_TEXTREL)
+                   {
+                     _bfd_error_handler
+                       (_("warning: creating a DT_TEXTREL in a shared object."));
+                     if (!info->allow_textrel)
+                       goto error_return;
+                     break;
+                   }
                }
            }
        }
index f8e9a2d..2f1d96d 100644 (file)
@@ -270,6 +270,9 @@ struct bfd_link_info
   /* TRUE if ok to have version with no definition.  */
   unsigned int allow_undefined_version: 1;
 
+  /* TRUE if ok to have text relocations.  */
+  unsigned int allow_textrel: 1;
+
   /* TRUE if a default symbol version should be created and used for
      exported symbols.  */
   unsigned int create_default_symver: 1;
index 7c80c50..032441b 100644 (file)
@@ -2193,6 +2193,10 @@ cat >>e${EMULATION_NAME}.c <<EOF
        link_info.relro = FALSE;
       else if (strcmp (optarg, "wxneeded") == 0)
        link_info.wxneeded = TRUE;
+      else if (strcmp (optarg, "notext") == 0)
+       link_info.allow_textrel = TRUE;
+      else if (strcmp (optarg, "text") == 0)
+       link_info.allow_textrel = FALSE;
       /* What about the other Solaris -z options? FIXME.  */
       break;
 EOF
index 9dfbd23..2fc9f35 100644 (file)
@@ -994,6 +994,9 @@ Marks the object as not requiring executable stack.
 @item norelro
 Don't create an ELF @code{PT_GNU_RELRO} segment header in the object.
 
+@item notext
+Permit creation of objects with text relocations.
+
 @item now
 When generating an executable or shared library, mark it to tell the
 dynamic linker to resolve all symbols when the program is started, or
@@ -1001,17 +1004,21 @@ when the shared library is linked to using dlopen, instead of
 deferring function call resolution to the point when the function is
 first called.
 
-@item wxneeded
-Marks the executable with a @code{PT_OPENBSD_WXNEEDED} segment header,
-indicating it is expected to perform W^X violating operations later
-(such as calling mprotect(2) or mmap(2) with both PROT_WRITE and PROT_EXEC).
-
 @item origin
 Marks the object may contain $ORIGIN.
 
 @item relro
 Create an ELF @code{PT_GNU_RELRO} segment header in the object.
 
+@item text
+Make creation of objects with text relocations a fatal error.
+This is the default.
+
+@item wxneeded
+Marks the executable with a @code{PT_OPENBSD_WXNEEDED} segment header,
+indicating it is expected to perform W^X violating operations later
+(such as calling mprotect(2) or mmap(2) with both PROT_WRITE and PROT_EXEC).
+
 @end table
 
 Other keywords are ignored for Solaris compatibility.  
index db8fae7..e927bc9 100644 (file)
@@ -290,6 +290,7 @@ main (int argc, char **argv)
   link_info.unresolved_syms_in_shared_libs = RM_NOT_YET_SET;
   link_info.allow_multiple_definition = FALSE;
   link_info.allow_undefined_version = TRUE;
+  link_info.allow_textrel = FALSE;
   link_info.create_default_symver = FALSE;
   link_info.default_imported_symver = FALSE;
   link_info.keep_memory = TRUE;