Teach ld(1) not to add a PT_INTERP entry for -static -pie.
authorkettenis <kettenis@openbsd.org>
Mon, 22 Dec 2014 14:17:22 +0000 (14:17 +0000)
committerkettenis <kettenis@openbsd.org>
Mon, 22 Dec 2014 14:17:22 +0000 (14:17 +0000)
ok kurt@

14 files changed:
gnu/usr.bin/binutils-2.17/bfd/elf32-hppa.c
gnu/usr.bin/binutils-2.17/bfd/elf32-i386.c
gnu/usr.bin/binutils-2.17/bfd/elf32-m68k.c
gnu/usr.bin/binutils-2.17/bfd/elf32-ppc.c
gnu/usr.bin/binutils-2.17/bfd/elf32-sh.c
gnu/usr.bin/binutils-2.17/bfd/elf32-vax.c
gnu/usr.bin/binutils-2.17/bfd/elf64-alpha.c
gnu/usr.bin/binutils-2.17/bfd/elf64-hppa.c
gnu/usr.bin/binutils-2.17/bfd/elf64-x86-64.c
gnu/usr.bin/binutils-2.17/bfd/elflink.c
gnu/usr.bin/binutils-2.17/bfd/elfxx-ia64.c
gnu/usr.bin/binutils-2.17/bfd/elfxx-mips.c
gnu/usr.bin/binutils-2.17/bfd/elfxx-sparc.c
gnu/usr.bin/binutils-2.17/ld/ldmain.c

index 51c210e..1682c7b 100644 (file)
@@ -2155,7 +2155,7 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   if (htab->etab.dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (info->executable && !info->static_link)
        {
          sec = bfd_get_section_by_name (dynobj, ".interp");
          if (sec == NULL)
index 754aa52..081432a 100644 (file)
@@ -1902,7 +1902,7 @@ elf_i386_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   if (htab->elf.dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (info->executable && !info->static_link)
        {
          s = bfd_get_section_by_name (dynobj, ".interp");
          if (s == NULL)
index df988a8..f74cd96 100644 (file)
@@ -1282,7 +1282,7 @@ elf_m68k_size_dynamic_sections (output_bfd, info)
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (info->executable && !info->static_link)
        {
          s = bfd_get_section_by_name (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
index 53d1046..12199c8 100644 (file)
@@ -4655,7 +4655,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (info->executable && !info->static_link)
        {
          s = bfd_get_section_by_name (htab->elf.dynobj, ".interp");
          BFD_ASSERT (s != NULL);
index d9e0a20..0d38114 100644 (file)
@@ -4269,7 +4269,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   if (htab->root.dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (info->executable && !info->static_link)
        {
          s = bfd_get_section_by_name (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
index bf481e4..4f8633e 100644 (file)
@@ -1130,7 +1130,7 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (info->executable && !info->static_link)
        {
          s = bfd_get_section_by_name (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
index 76d0661..8655643 100644 (file)
@@ -2723,7 +2723,7 @@ elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (info->executable && !info->static_link)
        {
          s = bfd_get_section_by_name (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
index 0f8079c..bad272a 100644 (file)
@@ -1645,7 +1645,7 @@ elf64_hppa_size_dynamic_sections (output_bfd, info)
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (info->executable && !info->static_link)
        {
          s = bfd_get_section_by_name (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
index 9befd69..752d6be 100644 (file)
@@ -1717,7 +1717,7 @@ elf64_x86_64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   if (htab->elf.dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (info->executable && !info->static_link)
        {
          s = bfd_get_section_by_name (dynobj, ".interp");
          if (s == NULL)
index 96790f0..afb05a7 100644 (file)
@@ -177,7 +177,7 @@ _bfd_elf_link_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
 
   /* A dynamically linked executable has a .interp section, but a
      shared library does not.  */
-  if (info->executable)
+  if (info->executable && !info->static_link)
     {
       s = bfd_make_section_with_flags (abfd, ".interp",
                                       flags | SEC_READONLY);
@@ -5058,7 +5058,6 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
       bfd_boolean all_defined;
 
       *sinterpptr = bfd_get_section_by_name (dynobj, ".interp");
-      BFD_ASSERT (*sinterpptr != NULL || !info->executable);
 
       if (soname != NULL)
        {
index 6b3257a..ca7eb6c 100644 (file)
@@ -3535,7 +3535,7 @@ elfNN_ia64_size_dynamic_sections (output_bfd, info)
 
   /* Set the contents of the .interp section to the interpreter.  */
   if (ia64_info->root.dynamic_sections_created
-      && info->executable)
+      && info->executable && !info->static_link)
     {
       sec = bfd_get_section_by_name (dynobj, ".interp");
       BFD_ASSERT (sec != NULL);
index 9df8823..7e0ed88 100644 (file)
@@ -7263,7 +7263,7 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (info->executable && !info->static_link)
        {
          s = bfd_get_section_by_name (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
index a4b8de9..1bf2011 100644 (file)
@@ -2145,7 +2145,7 @@ _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
   if (elf_hash_table (info)->dynamic_sections_created)
     {
       /* Set the contents of the .interp section to the interpreter.  */
-      if (info->executable)
+      if (info->executable && !info->static_link)
        {
          s = bfd_get_section_by_name (dynobj, ".interp");
          BFD_ASSERT (s != NULL);
index 2462240..84c2696 100644 (file)
@@ -371,6 +371,9 @@ main (int argc, char **argv)
   if (! link_info.shared || link_info.pie)
     link_info.executable = TRUE;
 
+  if (! config.dynamic_link && link_info.pie)
+    link_info.static_link = TRUE;
+
   /* Treat ld -r -s as ld -r -S -x (i.e., strip all local symbols).  I
      don't see how else this can be handled, since in this case we
      must preserve all externally visible symbols.  */