(cr16c_elf_final_link_relocate): Remove duplicated return statements and
[deliverable/binutils-gdb.git] / bfd / peicode.h
index 2dff0ac3f68607779b273cb61055213d12769758..1282bb9b1c86d71e36d644ff01b6534fc6ccb58e 100644 (file)
@@ -1,31 +1,29 @@
 /* Support for the generic parts of PE/PEI, for BFD.
-   Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
-   Free Software Foundation, Inc.
+   Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+   2005 Free Software Foundation, Inc.
    Written by Cygnus Solutions.
 
-This file is part of BFD, the Binary File Descriptor library.
+   This file is part of BFD, the Binary File Descriptor library.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
-/*
-Most of this hacked by  Steve Chamberlain,
+/* Most of this hacked by  Steve Chamberlain,
                        sac@cygnus.com
 
-PE/PEI rearrangement (and code added): Donn Terry
-                                       Softway Systems, Inc.
-*/
+   PE/PEI rearrangement (and code added): Donn Terry
+                                       Softway Systems, Inc.  */
 
 /* Hey look, some documentation [and in a place you expect to find it]!
 
@@ -53,8 +51,7 @@ PE/PEI rearrangement (and code added): Donn Terry
 
    FIXME: Please add more docs here so the next poor fool that has to hack
    on this code has a chance of getting something accomplished without
-   wasting too much time.
-*/
+   wasting too much time.  */
 
 #include "libpei.h"
 
@@ -133,15 +130,6 @@ typedef struct
   struct internal_reloc * int_reltab;
 }
 pe_ILF_vars;
-
-static asection_ptr       pe_ILF_make_a_section   PARAMS ((pe_ILF_vars *, const char *, unsigned int, flagword));
-static void               pe_ILF_make_a_reloc     PARAMS ((pe_ILF_vars *, bfd_vma, bfd_reloc_code_real_type, asection_ptr));
-static void               pe_ILF_make_a_symbol    PARAMS ((pe_ILF_vars *, const char *, const char *, asection_ptr, flagword));
-static void               pe_ILF_save_relocs      PARAMS ((pe_ILF_vars *, asection_ptr));
-static void              pe_ILF_make_a_symbol_reloc  PARAMS ((pe_ILF_vars *, bfd_vma, bfd_reloc_code_real_type, struct symbol_cache_entry **, unsigned int));
-static bfd_boolean        pe_ILF_build_a_bfd      PARAMS ((bfd *, unsigned int, bfd_byte *, bfd_byte *, unsigned int, unsigned int));
-static const bfd_target * pe_ILF_object_p         PARAMS ((bfd *));
-static const bfd_target * pe_bfd_object_p        PARAMS ((bfd *));
 #endif /* COFF_IMAGE_WITH_PE */
 
 /**********************************************************************/
@@ -259,12 +247,17 @@ coff_swap_scnhdr_in (abfd, ext, in)
     }
 
 #ifndef COFF_NO_HACK_SCNHDR_SIZE
-  /* If this section holds uninitialized data, use the virtual size
-     (stored in s_paddr) instead of the physical size.  */
-  if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
-      && (scnhdr_int->s_paddr > 0))
+  /* If this section holds uninitialized data and is from an object file
+     or from an executable image that has not initialized the field,
+     or if the image is an executable file and the physical size is padded,
+     use the virtual size (stored in s_paddr) instead.  */
+  if (scnhdr_int->s_paddr > 0
+      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
+          && (! bfd_pe_executable_p (abfd) || scnhdr_int->s_size == 0))
+          || (bfd_pe_executable_p (abfd) && scnhdr_int->s_size > scnhdr_int->s_paddr)))
     {
       scnhdr_int->s_size = scnhdr_int->s_paddr;
+
       /* This code used to set scnhdr_int->s_paddr to 0.  However,
          coff_set_alignment_hook stores s_paddr in virt_size, which
          only works if it correctly holds the virtual size of the
@@ -382,6 +375,14 @@ static bfd_boolean
 pe_bfd_copy_private_bfd_data (ibfd, obfd)
      bfd *ibfd, *obfd;
 {
+  /* PR binutils/716: Copy the large address aware flag.
+     XXX: Should we be copying other flags or other fields in the pe_data()
+     structure ?  */
+  if (pe_data (obfd) != NULL
+      && pe_data (ibfd) != NULL
+      && pe_data (ibfd)->real_flags & IMAGE_FILE_LARGE_ADDRESS_AWARE)
+    pe_data (obfd)->real_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
+      
   if (!_bfd_XX_bfd_copy_private_bfd_data_common (ibfd, obfd))
     return FALSE;
 
@@ -468,7 +469,7 @@ static void
 pe_ILF_make_a_symbol_reloc (pe_ILF_vars *                 vars,
                            bfd_vma                       address,
                            bfd_reloc_code_real_type      reloc,
-                           struct symbol_cache_entry **  sym,
+                           struct bfd_symbol **  sym,
                            unsigned int                  sym_index)
 {
   arelent * entry;
@@ -485,11 +486,6 @@ pe_ILF_make_a_symbol_reloc (pe_ILF_vars *                 vars,
   internal->r_vaddr  = address;
   internal->r_symndx = sym_index;
   internal->r_type   = entry->howto->type;
-#if 0  /* These fields do not need to be initialised.  */
-  internal->r_size   = 0;
-  internal->r_extern = 0;
-  internal->r_offset = 0;
-#endif
 
   vars->relcount ++;
 
@@ -581,39 +577,18 @@ pe_ILF_make_a_symbol (pe_ILF_vars *  vars,
 
   /* The following initialisations are unnecessary - the memory is
      zero initialised.  They are just kept here as reminders.  */
-#if 0
-  esym->e.e.e_zeroes = 0;
-  esym->e_value = 0;
-  esym->e_type = T_NULL;
-  esym->e_numaux = 0;
-#endif
 
   /* Initialise the internal symbol structure.  */
   ent->u.syment.n_sclass          = sclass;
   ent->u.syment.n_scnum           = section->target_index;
   ent->u.syment._n._n_n._n_offset = (long) sym;
 
-#if 0 /* See comment above.  */
-  ent->u.syment.n_value  = 0;
-  ent->u.syment.n_flags  = 0;
-  ent->u.syment.n_type   = T_NULL;
-  ent->u.syment.n_numaux = 0;
-  ent->fix_value         = 0;
-#endif
-
   sym->symbol.the_bfd = vars->abfd;
   sym->symbol.name    = vars->string_ptr;
   sym->symbol.flags   = BSF_EXPORT | BSF_GLOBAL | extra_flags;
   sym->symbol.section = section;
   sym->native         = ent;
 
-#if 0 /* See comment above.  */
-  sym->symbol.value   = 0;
-  sym->symbol.udata.i = 0;
-  sym->done_lineno    = FALSE;
-  sym->lineno         = NULL;
-#endif
-
   * vars->table_ptr = vars->sym_index;
   * vars->sym_ptr_ptr = sym;
 
@@ -756,8 +731,8 @@ static jump_table jtab[] =
 static bfd_boolean
 pe_ILF_build_a_bfd (bfd *           abfd,
                    unsigned int    magic,
-                   bfd_byte *      symbol_name,
-                   bfd_byte *      source_dll,
+                   char *          symbol_name,
+                   char *          source_dll,
                    unsigned int    ordinal,
                    unsigned int    types)
 {
@@ -782,13 +757,13 @@ pe_ILF_build_a_bfd (bfd *           abfd,
 
     case IMPORT_CONST:
       /* XXX code yet to be written.  */
-      _bfd_error_handler (_("%s: Unhandled import type; %x"),
-                         bfd_archive_filename (abfd), import_type);
+      _bfd_error_handler (_("%B: Unhandled import type; %x"),
+                         abfd, import_type);
       return FALSE;
 
     default:
-      _bfd_error_handler (_("%s: Unrecognised import type; %x"),
-                         bfd_archive_filename (abfd), import_type);
+      _bfd_error_handler (_("%B: Unrecognised import type; %x"),
+                         abfd, import_type);
       return FALSE;
     }
 
@@ -801,8 +776,8 @@ pe_ILF_build_a_bfd (bfd *           abfd,
       break;
 
     default:
-      _bfd_error_handler (_("%s: Unrecognised import name type; %x"),
-                         bfd_archive_filename (abfd), import_name_type);
+      _bfd_error_handler (_("%B: Unrecognised import name type; %x"),
+                         abfd, import_name_type);
       return FALSE;
     }
 
@@ -853,10 +828,10 @@ pe_ILF_build_a_bfd (bfd *           abfd,
   vars.int_reltab  = (struct internal_reloc *) ptr;
   ptr += SIZEOF_ILF_INT_RELOCS;
 
-  vars.string_table = ptr;
-  vars.string_ptr   = ptr + STRING_SIZE_SIZE;
+  vars.string_table = (char *) ptr;
+  vars.string_ptr   = (char *) ptr + STRING_SIZE_SIZE;
   ptr += SIZEOF_ILF_STRINGS;
-  vars.end_string_ptr = ptr;
+  vars.end_string_ptr = (char *) ptr;
 
   /* The remaining space in bim->buffer is used
      by the pe_ILF_make_a_section() function.  */
@@ -900,10 +875,40 @@ pe_ILF_build_a_bfd (bfd *           abfd,
       symbol = symbol_name;
 
       if (import_name_type != IMPORT_NAME)
-       /* Skip any prefix in symbol_name.  */
-       while (*symbol == '@' || * symbol == '?' || * symbol == '_')
-         ++ symbol;
-
+       {
+         bfd_boolean skipped_leading_underscore = FALSE;
+         bfd_boolean skipped_leading_at = FALSE;
+         bfd_boolean skipped_leading_question_mark = FALSE;
+         bfd_boolean check_again;
+         
+         /* Skip any prefix in symbol_name.  */
+         -- symbol;
+         do
+           {
+             check_again = FALSE;
+             ++ symbol;
+
+             switch (*symbol)
+               {
+               case '@':
+                 if (! skipped_leading_at)
+                   check_again = skipped_leading_at = TRUE;
+                 break;
+               case '?':
+                 if (! skipped_leading_question_mark)
+                   check_again = skipped_leading_question_mark = TRUE;
+                 break;
+               case '_':
+                 if (! skipped_leading_underscore)
+                   check_again = skipped_leading_underscore = TRUE;
+                 break;
+               default:
+                 break;
+               }
+           }
+         while (check_again);
+       }
+      
       if (import_name_type == IMPORT_NAME_UNDECORATE)
        {
          /* Truncate at the first '@'  */
@@ -916,7 +921,7 @@ pe_ILF_build_a_bfd (bfd *           abfd,
       id6->contents[0] = ordinal & 0xff;
       id6->contents[1] = ordinal >> 8;
 
-      strcpy (id6->contents + 2, symbol);
+      strcpy ((char *) id6->contents + 2, symbol);
     }
 
   if (import_name_type != IMPORT_ORDINAL)
@@ -965,11 +970,11 @@ pe_ILF_build_a_bfd (bfd *           abfd,
       if (magic == MIPS_ARCH_MAGIC_WINCE)
        {
          pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) 0, BFD_RELOC_HI16_S,
-                                     (struct symbol_cache_entry **) imp_sym,
+                                     (struct bfd_symbol **) imp_sym,
                                      imp_index);
          pe_ILF_make_a_reloc (&vars, (bfd_vma) 0, BFD_RELOC_LO16, text);
          pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) 4, BFD_RELOC_LO16,
-                                     (struct symbol_cache_entry **) imp_sym,
+                                     (struct bfd_symbol **) imp_sym,
                                      imp_index);
        }
       else
@@ -1028,7 +1033,7 @@ pe_ILF_build_a_bfd (bfd *           abfd,
 
       /* Create an import symbol for the DLL, without the
        .dll suffix.  */
-      ptr = strrchr (source_dll, '.');
+      ptr = (bfd_byte *) strrchr (source_dll, '.');
       if (ptr)
        * ptr = 0;
       pe_ILF_make_a_symbol (& vars, "__IMPORT_DESCRIPTOR_", source_dll, NULL, 0);
@@ -1073,8 +1078,8 @@ pe_ILF_object_p (bfd * abfd)
 {
   bfd_byte        buffer[16];
   bfd_byte *      ptr;
-  bfd_byte *      symbol_name;
-  bfd_byte *      source_dll;
+  char *          symbol_name;
+  char *          source_dll;
   unsigned int    machine;
   bfd_size_type   size;
   unsigned int    ordinal;
@@ -1158,9 +1163,9 @@ pe_ILF_object_p (bfd * abfd)
       /* We no longer support PowerPC.  */
     default:
       _bfd_error_handler
-       (
-_("%s: Unrecognised machine type (0x%x) in Import Library Format archive"),
-         bfd_archive_filename (abfd), machine);
+       (_("%B: Unrecognised machine type (0x%x)"
+          " in Import Library Format archive"),
+        abfd, machine);
       bfd_set_error (bfd_error_malformed_archive);
 
       return NULL;
@@ -1170,9 +1175,9 @@ _("%s: Unrecognised machine type (0x%x) in Import Library Format archive"),
   if (magic == 0)
     {
       _bfd_error_handler
-       (
-_("%s: Recognised but unhandled machine type (0x%x) in Import Library Format archive"),
-        bfd_archive_filename (abfd), machine);
+       (_("%B: Recognised but unhandled machine type (0x%x)"
+          " in Import Library Format archive"),
+        abfd, machine);
       bfd_set_error (bfd_error_wrong_format);
 
       return NULL;
@@ -1188,8 +1193,7 @@ _("%s: Recognised but unhandled machine type (0x%x) in Import Library Format arc
   if (size == 0)
     {
       _bfd_error_handler
-       (_("%s: size field is zero in Import Library Format header"),
-        bfd_archive_filename (abfd));
+       (_("%B: size field is zero in Import Library Format header"), abfd);
       bfd_set_error (bfd_error_malformed_archive);
 
       return NULL;
@@ -1212,15 +1216,15 @@ _("%s: Recognised but unhandled machine type (0x%x) in Import Library Format arc
       return NULL;
     }
 
-  symbol_name = ptr;
-  source_dll  = ptr + strlen (ptr) + 1;
+  symbol_name = (char *) ptr;
+  source_dll  = symbol_name + strlen (symbol_name) + 1;
 
   /* Verify that the strings are null terminated.  */
-  if (ptr[size - 1] != 0 || ((unsigned long) (source_dll - ptr) >= size))
+  if (ptr[size - 1] != 0
+      || (bfd_size_type) ((bfd_byte *) source_dll - ptr) >= size)
     {
       _bfd_error_handler
-       (_("%s: string not null terminated in ILF object file."),
-        bfd_archive_filename (abfd));
+       (_("%B: string not null terminated in ILF object file."), abfd);
       bfd_set_error (bfd_error_malformed_archive);
       bfd_release (abfd, ptr);
       return NULL;
This page took 0.029807 seconds and 4 git commands to generate.