* elf-m10300.c (_bfd_mn10300_elf_adjust_dynamic_symbol): Don't error
[platform/upstream/binutils.git] / bfd / elf64-x86-64.c
index 645e5a2..88c47f9 100644 (file)
@@ -1,6 +1,6 @@
 /* X86-64 specific support for ELF
    Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
-   2010, 2011
+   2010, 2011, 2012
    Free Software Foundation, Inc.
    Contributed by Jan Hubicka <jh@suse.cz>.
 
@@ -420,8 +420,6 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
                            int note_type, ...)
 {
   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
-  const void *p;
-  int size;
   va_list ap;
   const char *fname, *psargs;
   long pid;
@@ -445,8 +443,8 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
          memset (&data, 0, sizeof (data));
          strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
          strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
-         p = (const void *) &data;
-         size = sizeof (data);
+         return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+                                    &data, sizeof (data));
        }
       else
        {
@@ -454,10 +452,10 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
          memset (&data, 0, sizeof (data));
          strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
          strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
-         p = (const void *) &data;
-         size = sizeof (data);
+         return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+                                    &data, sizeof (data));
        }
-      break;
+      /* NOTREACHED */
 
     case NT_PRSTATUS:
       va_start (ap, note_type);
@@ -475,8 +473,8 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
              prstat.pr_pid = pid;
              prstat.pr_cursig = cursig;
              memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
-             p = (const void *) &prstat;
-             size = sizeof (prstat);
+             return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+                                        &prstat, sizeof (prstat));
            }
          else
            {
@@ -485,8 +483,8 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
              prstat.pr_pid = pid;
              prstat.pr_cursig = cursig;
              memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
-             p = (const void *) &prstat;
-             size = sizeof (prstat);
+             return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+                                        &prstat, sizeof (prstat));
            }
        }
       else
@@ -496,14 +494,11 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
          prstat.pr_pid = pid;
          prstat.pr_cursig = cursig;
          memcpy (&prstat.pr_reg, gregs, sizeof (prstat.pr_reg));
-         p = (const void *) &prstat;
-         size = sizeof (prstat);
+         return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type,
+                                    &prstat, sizeof (prstat));
        }
-      break;
     }
-
-  return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type, p,
-                            size);
+  /* NOTREACHED */
 }
 #endif
 \f
@@ -513,7 +508,7 @@ elf_x86_64_write_core_note (bfd *abfd, char *buf, int *bufsiz,
    section.  */
 
 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld64.so.1"
-#define ELF32_DYNAMIC_INTERPRETER "/lib/ld32.so.1"
+#define ELF32_DYNAMIC_INTERPRETER "/lib/ldx32.so.1"
 
 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
    copying dynamic variables from a shared lib into an app's dynbss
@@ -2171,13 +2166,6 @@ elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
        }
     }
 
-  if (h->size == 0)
-    {
-      (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
-                            h->root.root.string);
-      return TRUE;
-    }
-
   /* We must allocate the symbol in our .dynbss section, which will
      become part of the .bss section of the executable.         There will be
      an entry for this symbol in the .dynsym section.  The dynamic
@@ -2195,7 +2183,7 @@ elf_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
   /* We must generate a R_X86_64_COPY reloc to tell the dynamic linker
      to copy the initial value out of the dynamic object and into the
      runtime process image.  */
-  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
+  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
     {
       const struct elf_backend_data *bed;
       bed = get_elf_backend_data (info->output_bfd);
@@ -3475,7 +3463,6 @@ elf_x86_64_relocate_section (bfd *output_bfd,
        case R_X86_64_PC16:
        case R_X86_64_PC32:
          if (info->shared
-             && ABI_64_P (output_bfd)
              && (input_section->flags & SEC_ALLOC) != 0
              && (input_section->flags & SEC_READONLY) != 0
              && h != NULL)