Undo part of 3/26 change and always create got section
authorMichael Meissner <gnu@the-meissners.org>
Wed, 2 Apr 1997 21:22:19 +0000 (21:22 +0000)
committerMichael Meissner <gnu@the-meissners.org>
Wed, 2 Apr 1997 21:22:19 +0000 (21:22 +0000)
bfd/ChangeLog
bfd/elf32-ppc.c

index 40541f96599a8ef32ba66ab17d8058db82c5a39d..c5665109e69b216f81e2aca33cf53b5e3b79feac 100644 (file)
@@ -1,3 +1,9 @@
+Wed Apr  2 16:19:41 1997  Mike Meissner  <meissner@cygnus.com>
+
+       * elf32-ppc.c (ppc_elf_check_relocs): Undo March 26 change and
+       always create got section so that the _GLOBAL_OFFSET_TABLE_ label
+       is always created.
+
 Wed Apr  2 10:49:07 1997  Ian Lance Taylor  <ian@cygnus.com>
 
        * elf-m10200.c: Rename from elf32-mn10200.c.
index ed585377bd1ef0b38435be0d7608d6bf89f325cf..ede0608668f4144f073e367455f60d3da4fd2590 100644 (file)
@@ -1527,14 +1527,11 @@ ppc_elf_adjust_dynamic_symbol (info, h)
   s = bfd_get_section_by_name (dynobj, ".dynbss");
   BFD_ASSERT (s != NULL);
 
-  /* If the symbol is currently defined in the .bss section of the
-     dynamic object, then it is OK to simply initialize it to zero.
-     If the symbol is in some other section, we must generate a
-     R_PPC_COPY reloc to tell the dynamic linker to copy the initial
-     value out of the dynamic object and into the runtime process
-     image.  We need to remember the offset into the .rela.bss section
-     we are going to use.  */
-  if ((h->root.u.def.section->flags & SEC_LOAD) != 0)
+  /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
+     copy the initial value out of the dynamic object and into the
+     runtime process image.  We need to remember the offset into the
+     .rela.bss section we are going to use.  */
+  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
     {
       asection *srel;
 
@@ -1844,14 +1841,9 @@ ppc_elf_check_relocs (abfd, info, sec, relocs)
           bfd_get_filename (abfd));
 #endif
 
-  /* Create the linker generated sections all the time so that the special
-     symbols are created.  */
-  if ((got = elf_linker_section (abfd, LINKER_SECTION_GOT)) == NULL)
-    {
-      got = ppc_elf_create_linker_section (abfd, info, LINKER_SECTION_GOT);
-      if (!got)
-       ret = false;
-    }
+  /* Create the linker generated sections all the time so that the
+     special symbols are created.  The .got section is an exception,
+     so that we don't waste space allocating it when it is not needed.  */
 
 #if 0
   if ((plt = elf_linker_section (abfd, LINKER_SECTION_PLT)) == NULL)
@@ -1877,6 +1869,13 @@ ppc_elf_check_relocs (abfd, info, sec, relocs)
        ret = false;
     }
 
+  if ((got = elf_linker_section (abfd, LINKER_SECTION_GOT)) == NULL)
+    {
+      got = ppc_elf_create_linker_section (abfd, info, LINKER_SECTION_GOT);
+      if (!got)
+       ret = false;
+    }
+
   dynobj = elf_hash_table (info)->dynobj;
   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   sym_hashes = elf_sym_hashes (abfd);
@@ -1927,6 +1926,18 @@ ppc_elf_check_relocs (abfd, info, sec, relocs)
              break;
            }
 
+         if (got == NULL
+             && (got = elf_linker_section (abfd, LINKER_SECTION_GOT)) == NULL)
+           {
+             got = ppc_elf_create_linker_section (abfd, info,
+                                                  LINKER_SECTION_GOT);
+             if (!got)
+               {
+                 ret = false;
+                 break;
+               }
+           }
+
          if (got->rel_section == NULL
              && (h != NULL || info->shared)
              && !_bfd_elf_make_linker_section_rela (dynobj, got, 2))
@@ -1951,6 +1962,18 @@ ppc_elf_check_relocs (abfd, info, sec, relocs)
              break;
            }
 
+         if (got == NULL
+             && (got = elf_linker_section (abfd, LINKER_SECTION_GOT)) == NULL)
+           {
+             got = ppc_elf_create_linker_section (abfd, info,
+                                                  LINKER_SECTION_GOT);
+             if (!got)
+               {
+                 ret = false;
+                 break;
+               }
+           }
+
          if (got->rel_section == NULL
              && (h != NULL || info->shared)
              && !_bfd_elf_make_linker_section_rela (dynobj, got, 2))