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

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

index d917168..b42b8ff 100644 (file)
@@ -2036,7 +2036,7 @@ elf32_hppa_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 7b173e4..a94bd37 100644 (file)
@@ -1720,7 +1720,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 39832be..edf9b3d 100644 (file)
@@ -1117,7 +1117,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 6723e68..bd38838 100644 (file)
@@ -1128,7 +1128,7 @@ elf_m88k_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 201f419..2d9844a 100644 (file)
@@ -3256,7 +3256,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 542a7cb..d46ceb6 100644 (file)
@@ -4449,7 +4449,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 0f94f5f..9d060e9 100644 (file)
@@ -1841,7 +1841,7 @@ elf32_sparc_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 c509ccc..22efb96 100644 (file)
@@ -1150,7 +1150,7 @@ elf_vax_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 6958da5..054e179 100644 (file)
@@ -4056,7 +4056,7 @@ elf64_alpha_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 76dcc18..4cd939a 100644 (file)
@@ -1644,7 +1644,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 90de3b9..1dd92ed 100644 (file)
@@ -1788,7 +1788,7 @@ sparc64_elf_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 a1d6250..c7bd64e 100644 (file)
@@ -1513,7 +1513,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 e471446..4707de1 100644 (file)
@@ -141,7 +141,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 (abfd, ".interp");
       if (s == NULL
@@ -4694,7 +4694,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 b19aac2..881d834 100644 (file)
@@ -2894,7 +2894,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 8a1f0ea..5be2607 100644 (file)
@@ -5905,7 +5905,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 36f2fff..547d1aa 100644 (file)
@@ -380,6 +380,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.  */