Add tests of return values from bfd function calls
authorNick Clifton <nickc@redhat.com>
Mon, 16 Oct 2000 19:08:45 +0000 (19:08 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 16 Oct 2000 19:08:45 +0000 (19:08 +0000)
ld/ChangeLog
ld/emultempl/pe.em

index b048ec455be3fdf5a44389579f540c68cf3fa705..02ffadc6dddd9912c9d978f69fc430b3554963c4 100644 (file)
@@ -1,3 +1,8 @@
+2000-10-16  Nick Clifton  <nickc@redhat.com>
+
+       * emultempl/pe.em (_after_open): Add tests of return values from
+       bfd functions.  Emit appropriate error messages if necessary.
+
 2000-10-13  Nick Clifton  <nickc@redhat.com>
 
        * emultempl/pe.em (_after_open): Delete 'is2' and 'nsyms'
index bbf0c942e2677c00c287b9e403ee5cdbede41f60..62d695942947d93e086dec55968a9f90dc393d5b 100644 (file)
@@ -839,7 +839,8 @@ gld_${EMULATION_NAME}_after_open ()
          {
            int idata2 = 0, reloc_count=0, is_imp = 0;
            asection *sec;
-           /* See if this is an import library thunk */
+           
+           /* See if this is an import library thunk.  */
            for (sec = is->the_bfd->sections; sec; sec = sec->next)
              {
                if (strcmp (sec->name, ".idata\$2") == 0)
@@ -848,53 +849,83 @@ gld_${EMULATION_NAME}_after_open ()
                  is_imp = 1;
                reloc_count += sec->reloc_count;
              }
+           
            if (is_imp && !idata2 && reloc_count)
              {
-               /* it is, look for the reference to head and see if it's
-                  from our own library */
+               /* It is, look for the reference to head and see if it's
+                  from our own library */
                for (sec = is->the_bfd->sections; sec; sec = sec->next)
                  {
                    int i;
-                   int symsize;
+                   long symsize;
+                   long relsize;
                    asymbol **symbols;
-                   int relsize;
                    arelent **relocs;
                    int nrelocs;
                    
                    symsize = bfd_get_symtab_upper_bound (is->the_bfd);
-                   symbols = (asymbol **) xmalloc (symsize);
-                   bfd_canonicalize_symtab (is->the_bfd, symbols);
+                   if (symsize < 1)
+                     break;
                    relsize = bfd_get_reloc_upper_bound (is->the_bfd, sec);
+                   if (relsize < 1)
+                     break;
+                   
+                   symbols = (asymbol **) xmalloc (symsize);
+                   symsize = bfd_canonicalize_symtab (is->the_bfd, symbols);
+                   if (symsize < 0)
+                     {
+                       einfo ("%X%P: unable to process symbols: %E");
+                       return;
+                     }
+                   
                    relocs = (arelent **) xmalloc ((size_t) relsize);
                    nrelocs = bfd_canonicalize_reloc (is->the_bfd, sec,
                                                          relocs, symbols);
-                   for (i=0; i<nrelocs; i++)
+                   if (nrelocs < 0)
+                     {
+                       free (relocs);
+                       einfo ("%X%P: unable to process relocs: %E");
+                       return;
+                     }
+                   
+                   for (i = 0; i < nrelocs; i++)
                      {
                        struct symbol_cache_entry *s;
+                       struct bfd_link_hash_entry * blhe;
+                       bfd *other_bfd;
+                       char *n;
+                       
                        s = (relocs[i]->sym_ptr_ptr)[0];
-                       if (!s->flags & BSF_LOCAL)
-                         {
-                           /* thunk section with reloc to another bfd... */
-                           struct bfd_link_hash_entry *blhe;
-                           blhe = bfd_link_hash_lookup (link_info.hash,
-                                                        s->name,
-                                                        false, false, true);
-                           if (blhe && blhe->type == bfd_link_hash_defined)
-                             {
-                               bfd *other_bfd = blhe->u.def.section->owner;
-                               if (strcmp (is->the_bfd->my_archive->filename,
-                                           other_bfd->my_archive->filename))
-                                 {
-                                   /* Rename this implib to match the other */
-                                   char *n = (char *) xmalloc (strlen (other_bfd->my_archive->filename) + 1);
-                                   strcpy (n, other_bfd->my_archive->filename);
-                                   is->the_bfd->my_archive->filename = n;
-                                 }
-                             }
-                         }
+                       
+                       if (s->flags & BSF_LOCAL)
+                         continue;
+                       
+                       /* Thunk section with reloc to another bfd.  */
+                       blhe = bfd_link_hash_lookup (link_info.hash,
+                                                    s->name,
+                                                    false, false, true);
+                           
+                       if (blhe == NULL
+                           || blhe->type != bfd_link_hash_defined)
+                         continue;
+                       
+                       other_bfd = blhe->u.def.section->owner;
+                           
+                       if (strcmp (is->the_bfd->my_archive->filename,
+                                   other_bfd->my_archive->filename) == 0)
+                         continue;
+                       
+                       /* Rename this implib to match the other.  */
+                       n = (char *) xmalloc (strlen (other_bfd->my_archive->filename) + 1);
+                           
+                       strcpy (n, other_bfd->my_archive->filename);
+                           
+                       is->the_bfd->my_archive->filename = n;
                      }
 
                    free (relocs);
+                   /* Note - we do not free the symbols,
+                      they are now cached in the BFD.  */
                  }
              }
          }