removed unused elf_64_p field
[deliverable/binutils-gdb.git] / bfd / i386linux.c
index 2e0181cab5bd627fefcb11a0329b1ff9bb6086a5..e5162c481d3c5d9de51340c4363a7223ad9dce45 100644 (file)
@@ -94,6 +94,12 @@ i386linux_write_object_contents (abfd)
 #define IS_PLT_SYM(name) \
   (strncmp (name, PLT_REF_PREFIX, sizeof PLT_REF_PREFIX - 1) == 0)
 
+/* This string is used to generate specialized error messages.  */
+
+#ifndef NEEDS_SHRLIB
+#define NEEDS_SHRLIB "__NEEDS_SHRLIB_"
+#endif
+
 /* This special symbol is a set vector that contains a list of
    pointers to fixup tables.  It will be present in any dynamicly
    linked file.  The linker generated fixup table should also be added
@@ -295,9 +301,9 @@ linux_link_create_dynamic_sections (abfd, info)
   /* Note that we set the SEC_IN_MEMORY flag.  */
   flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
 
-  /* We choose to use the name ".dynamic" for the fixup table.  Why
-     not? */
-  s = bfd_make_section (abfd, ".dynamic");
+  /* We choose to use the name ".linux-dynamic" for the fixup table.
+     Why not? */
+  s = bfd_make_section (abfd, ".linux-dynamic");
   if (s == NULL
       || ! bfd_set_section_flags (abfd, s, flags)
       || ! bfd_set_section_alignment (abfd, s, 2))
@@ -342,7 +348,8 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string,
   if (! info->relocateable
       && linux_hash_table (info)->dynobj == NULL
       && strcmp (name, SHARABLE_CONFLICTS) == 0
-      && (flags & BSF_CONSTRUCTOR) != 0)
+      && (flags & BSF_CONSTRUCTOR) != 0
+      && abfd->xvec == info->hash->creator)
     {
       if (! linux_link_create_dynamic_sections (abfd, info))
        return false;
@@ -351,12 +358,13 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string,
     }
 
   if (bfd_is_abs_section (section)
-      && (IS_GOT_SYM (name) || IS_PLT_SYM (name)))
+      && abfd->xvec == info->hash->creator)
     {
       h = linux_link_hash_lookup (linux_hash_table (info), name, false,
                                  false, false);
       if (h != NULL
-         && h->root.root.type == bfd_link_hash_defined)
+         && (h->root.root.type == bfd_link_hash_defined
+             || h->root.root.type == bfd_link_hash_defweak))
        {
          struct fixup *f;
 
@@ -387,7 +395,7 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string,
       /* Here we do our special thing to add the pointer to the
         dynamic section in the SHARABLE_CONFLICTS set vector.  */
       s = bfd_get_section_by_name (linux_hash_table (info)->dynobj,
-                                  ".dynamic");
+                                  ".linux-dynamic");
       BFD_ASSERT (s != NULL);
 
       if (! (_bfd_generic_link_add_one_symbol
@@ -420,6 +428,36 @@ linux_tally_symbols (h, data)
   struct linux_link_hash_entry *h1, *h2;
   boolean exists;
 
+  if (h->root.root.type == bfd_link_hash_undefined
+      && strncmp (h->root.root.root.string, NEEDS_SHRLIB,
+                 sizeof NEEDS_SHRLIB - 1) == 0)
+    {
+      const char *name;
+      char *p;
+      char *alloc = NULL;
+
+      name = h->root.root.root.string + sizeof NEEDS_SHRLIB - 1;
+      p = strrchr (name, '_');
+      if (p != NULL)
+       alloc = (char *) malloc (strlen (name) + 1);
+
+      /* FIXME!  BFD should not call printf!  */
+      if (p == NULL || alloc == NULL)
+       fprintf (stderr, "Output file requires shared library `%s'\n", name);
+      else
+       {
+         strcpy (alloc, name);
+         p = strrchr (alloc, '_');
+         *p++ = '\0';
+         fprintf (stderr,
+                  "Output file requires shared library `%s.so.%s'\n",
+                  alloc, p);
+         free (alloc);
+       }
+
+      abort ();
+    }
+
   /* If this symbol is not a PLT/GOT, we do not even need to look at it */
   is_plt = IS_PLT_SYM (h->root.root.root.string);
 
@@ -445,7 +483,8 @@ linux_tally_symbols (h, data)
         fixup anyway, since there are cases where these symbols come
         from different shared libraries */
       if (h1 != NULL
-         && ((h1->root.root.type == bfd_link_hash_defined
+         && (((h1->root.root.type == bfd_link_hash_defined
+               || h1->root.root.type == bfd_link_hash_defweak)
               && ! bfd_is_abs_section (h1->root.root.u.def.section))
              || h2->root.root.type == bfd_link_hash_indirect))
        {
@@ -458,9 +497,11 @@ linux_tally_symbols (h, data)
               f1 != NULL;
               f1 = f1->next)
            {
-             if (f1->h != h
+             if ((f1->h != h && f1->h != h1)
                  || (! f1->builtin && ! f1->jump))
                continue;
+             if (f1->h == h1)
+               exists = true;
              if (! exists
                  && bfd_is_abs_section (h->root.root.u.def.section))
                {
@@ -494,11 +535,11 @@ linux_tally_symbols (h, data)
   return true;
 }
 
-/* This is called to set the size of the .dynamic section is.  It is
-   called by the Linux linker emulation before_allocation routine.  We
-   have finished reading all of the input files, and now we just scan
-   the hash tables to find out how many additional fixups are
-   required.  */
+/* This is called to set the size of the .linux-dynamic section is.
+   It is called by the Linux linker emulation before_allocation
+   routine.  We have finished reading all of the input files, and now
+   we just scan the hash tables to find out how many additional fixups
+   are required.  */
 
 boolean
 bfd_linux_size_dynamic_sections (output_bfd, info)
@@ -534,7 +575,8 @@ bfd_linux_size_dynamic_sections (output_bfd, info)
     }
 
   /* Allocate memory for our fixup table.  We will fill it in later.  */
-  s = bfd_get_section_by_name (linux_hash_table (info)->dynobj, ".dynamic");
+  s = bfd_get_section_by_name (linux_hash_table (info)->dynobj,
+                              ".linux-dynamic");
   if (s != NULL)
     {
       s->_raw_size = 8 + linux_hash_table (info)->fixup_count * 8;
@@ -570,7 +612,8 @@ linux_finish_dynamic_link (output_bfd, info)
   if (linux_hash_table (info)->dynobj == NULL)
     return true;
 
-  s = bfd_get_section_by_name (linux_hash_table (info)->dynobj, ".dynamic");
+  s = bfd_get_section_by_name (linux_hash_table (info)->dynobj,
+                              ".linux-dynamic");
   BFD_ASSERT (s != NULL);
   os = s->output_section;
   fixups_written = 0;
@@ -591,7 +634,8 @@ linux_finish_dynamic_link (output_bfd, info)
       if (f->builtin)
        continue;
 
-      if (f->h->root.root.type != bfd_link_hash_defined)
+      if (f->h->root.root.type != bfd_link_hash_defined
+         && f->h->root.root.type != bfd_link_hash_defweak)
        {
          /* FIXME!  */
          fprintf (stderr,
@@ -641,7 +685,8 @@ linux_finish_dynamic_link (output_bfd, info)
          if (! f->builtin)
            continue;
 
-         if (f->h->root.root.type != bfd_link_hash_defined)
+         if (f->h->root.root.type != bfd_link_hash_defined
+             && f->h->root.root.type != bfd_link_hash_defweak)
            {
              /* FIXME!  */
              fprintf (stderr,
@@ -685,7 +730,9 @@ linux_finish_dynamic_link (output_bfd, info)
                              "__BUILTIN_FIXUPS__",
                              false, false, false);
 
-  if (h != NULL && h->root.root.type == bfd_link_hash_defined)
+  if (h != NULL
+      && (h->root.root.type == bfd_link_hash_defined
+         || h->root.root.type == bfd_link_hash_defweak))
     {
       is = h->root.root.u.def.section;
       section_offset = is->output_section->vma + is->output_offset;
This page took 0.02473 seconds and 4 git commands to generate.