* elf64-hppa.c (allocate_global_data_opd): We don't need an opd entry
authorJeff Law <law@redhat.com>
Wed, 12 Jun 2002 18:12:25 +0000 (18:12 +0000)
committerJeff Law <law@redhat.com>
Wed, 12 Jun 2002 18:12:25 +0000 (18:12 +0000)
for a symbol that has no output section.
(allocate_dynrel_entries): Correct comment.
(elf64_hppa_finalize_dynreloc): Likewise.  Don't create an opd entry
unless we want one.
(elf64_hppa_finalize_opd): Prevent segfault if dyn_h is NULL.
(elf64_hppa_finalize_dlt): Likewise.  Prevent segfault for symbols
with no section.  Remove unnecessary parentheses.

bfd/ChangeLog
bfd/elf64-hppa.c

index 38f19f1230cae1592bc434f43511a11717f52ab1..907ba4995d8a6e8d6b7081f09efce05a1c179f02 100644 (file)
@@ -1,3 +1,14 @@
+2002-06-12  John David Anglin  <dave@hiauly1.hia.nrc.ca>
+
+       * elf64-hppa.c (allocate_global_data_opd): We don't need an opd entry
+       for a symbol that has no output section.
+       (allocate_dynrel_entries): Correct comment.
+       (elf64_hppa_finalize_dynreloc): Likewise.  Don't create an opd entry
+       unless we want one.
+       (elf64_hppa_finalize_opd): Prevent segfault if dyn_h is NULL.
+       (elf64_hppa_finalize_dlt): Likewise.  Prevent segfault for symbols
+       with no section.  Remove unnecessary parentheses.
+
 2002-06-11  Tom Rix  <trix@redhat.com>
 
        * coffcode.h (coff_compute_section_file_positions): Add data
index d110d76d9ce214b7bfe2c1ba5d4fa44e3139a060..cc4694348f2dab368eab7094f634b20622acf5d6 100644 (file)
@@ -1159,7 +1159,8 @@ allocate_global_data_opd (dyn_h, data)
 
       /* We never need an opd entry for a symbol which is not
         defined by this output file.  */
-      if (h && h->root.type == bfd_link_hash_undefined)
+      if (h && (h->root.type == bfd_link_hash_undefined
+               || h->root.u.def.section->output_section == NULL))
        dyn_h->want_opd = 0;
 
       /* If we are creating a shared library, took the address of a local
@@ -1168,9 +1169,8 @@ allocate_global_data_opd (dyn_h, data)
       else if (x->info->shared
               || h == NULL
               || h->dynindx == -1
-              || ((h->root.type == bfd_link_hash_defined
-                   || h->root.type == bfd_link_hash_defweak)
-                  && h->root.u.def.section->output_section != NULL))
+              || (h->root.type == bfd_link_hash_defined
+                  || h->root.type == bfd_link_hash_defweak))
        {
          /* If we are creating a shared library, then we will have to
             create a runtime relocation for the symbol to properly
@@ -1535,9 +1535,8 @@ allocate_dynrel_entries (dyn_h, data)
       switch (rent->type)
        {
        case R_PARISC_FPTR64:
-         /* Allocate one iff we are not building a shared library and
-            !want_opd, which by this point will be true only if we're
-            actually allocating one statically in the main executable.  */
+         /* Allocate one iff we are building a shared library and don't
+            want an opd entry.  */
          if (!x->info->shared && dyn_h->want_opd)
            continue;
          break;
@@ -2115,7 +2114,7 @@ elf64_hppa_finalize_opd (dyn_h, data)
 {
   struct bfd_link_info *info = (struct bfd_link_info *)data;
   struct elf64_hppa_link_hash_table *hppa_info;
-  struct elf_link_hash_entry *h = dyn_h->h;
+  struct elf_link_hash_entry *h = dyn_h ? dyn_h->h : NULL;
   asection *sopd;
   asection *sopdrel;
 
@@ -2123,7 +2122,7 @@ elf64_hppa_finalize_opd (dyn_h, data)
   sopd = hppa_info->opd_sec;
   sopdrel = hppa_info->opd_rel_sec;
 
-  if (h && dyn_h && dyn_h->want_opd)
+  if (h && dyn_h->want_opd)
     {
       bfd_vma value;
 
@@ -2236,7 +2235,7 @@ elf64_hppa_finalize_dlt (dyn_h, data)
   struct bfd_link_info *info = (struct bfd_link_info *)data;
   struct elf64_hppa_link_hash_table *hppa_info;
   asection *sdlt, *sdltrel;
-  struct elf_link_hash_entry *h = dyn_h->h;
+  struct elf_link_hash_entry *h = dyn_h ? dyn_h->h : NULL;
 
   hppa_info = elf64_hppa_hash_table (info);
 
@@ -2247,7 +2246,7 @@ elf64_hppa_finalize_dlt (dyn_h, data)
      address, so there is no need to create a relocation.  Just install
      the proper value into the DLT, note this shortcut can not be
      skipped when building a shared library.  */
-  if (! info->shared && h && dyn_h && dyn_h->want_dlt)
+  if (! info->shared && h && dyn_h->want_dlt)
     {
       bfd_vma value;
 
@@ -2263,16 +2262,17 @@ elf64_hppa_finalize_dlt (dyn_h, data)
                   + hppa_info->opd_sec->output_offset
                   + hppa_info->opd_sec->output_section->vma);
        }
-      else
+      else if (h->root.u.def.section)
        {
-         value = (h->root.u.def.value
-                  + h->root.u.def.section->output_offset);
-
+         value = h->root.u.def.value + h->root.u.def.section->output_offset;
          if (h->root.u.def.section->output_section)
            value += h->root.u.def.section->output_section->vma;
          else
            value += h->root.u.def.section->vma;
        }
+      else
+       /* We have an undefined function reference.  */
+       value = 0;
 
       /* We do not need to include the output offset of the DLT section
         here because we are modifying the in-memory contents.  */
@@ -2360,9 +2360,8 @@ elf64_hppa_finalize_dynreloc (dyn_h, data)
          switch (rent->type)
            {
              case R_PARISC_FPTR64:
-             /* Allocate one iff we are not building a shared library and
-                !want_opd, which by this point will be true only if we're
-                actually allocating one statically in the main executable.  */
+             /* Allocate one iff we are building a shared library and don't
+                want an opd entry.  */
              if (!info->shared && dyn_h->want_opd)
                continue;
              break;
@@ -2395,7 +2394,7 @@ elf64_hppa_finalize_dynreloc (dyn_h, data)
             We use a section symbol recorded by check_relocs as the
             base symbol for the relocation.  The addend is the difference
             between the section symbol and the address of the .opd entry.  */
-         if (info->shared && rent->type == R_PARISC_FPTR64)
+         if (info->shared && rent->type == R_PARISC_FPTR64 && dyn_h->want_opd)
            {
              bfd_vma value, value2;