ld: Add "-z separate-code" option to ELF linker
[deliverable/binutils-gdb.git] / bfd / oasys.c
index 2647f82f00c3a30efb489a41029c14384181d264..d8e38a8f60379c82a530b9bfdcec90a1f7e46691 100644 (file)
@@ -1,13 +1,12 @@
 /* BFD back-end for oasys objects.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2001,
-   2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1990-2018 Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support, <sac@cygnus.com>.
 
    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
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
 
    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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 #define UNDERSCORE_HACK 1
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "safe-ctype.h"
 #include "libbfd.h"
 #include "oasys.h"
 #include "liboasys.h"
+#include "libiberty.h"
 
 /* Read in all the section data and relocation stuff too.  */
 
@@ -271,37 +272,35 @@ oasys_archive_p (bfd *abfd)
     filepos = header.mod_tbl_offset;
     for (i = 0; i < header.mod_count; i++)
       {
+       oasys_extmodule_table_type_b_type record_ext;
+
        if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
          return NULL;
 
        /* There are two ways of specifying the archive header.  */
-         {
-           oasys_extmodule_table_type_b_type record_ext;
-
-           amt = sizeof (record_ext);
-           if (bfd_bread ((void *) &record_ext, amt, abfd) != amt)
-             return NULL;
-
-           record.mod_size = H_GET_32 (abfd, record_ext.mod_size);
-           record.file_offset = H_GET_32 (abfd, record_ext.file_offset);
-
-           record.dep_count = H_GET_32 (abfd, record_ext.dep_count);
-           record.depee_count = H_GET_32 (abfd, record_ext.depee_count);
-           record.sect_count = H_GET_32 (abfd, record_ext.sect_count);
-           record.module_name_size = H_GET_32 (abfd,
-                                               record_ext.mod_name_length);
-
-           amt = record.module_name_size;
-           module[i].name = bfd_alloc (abfd, amt + 1);
-           if (!module[i].name)
-             return NULL;
-           if (bfd_bread ((void *) module[i].name, amt, abfd) != amt)
-             return NULL;
-           module[i].name[record.module_name_size] = 0;
-           filepos += (sizeof (record_ext)
-                       + record.dep_count * 4
-                       + record.module_name_size + 1);
-         }
+       amt = sizeof (record_ext);
+       if (bfd_bread ((void *) &record_ext, amt, abfd) != amt)
+         return NULL;
+
+       record.mod_size = H_GET_32 (abfd, record_ext.mod_size);
+       record.file_offset = H_GET_32 (abfd, record_ext.file_offset);
+
+       record.dep_count = H_GET_32 (abfd, record_ext.dep_count);
+       record.depee_count = H_GET_32 (abfd, record_ext.depee_count);
+       record.sect_count = H_GET_32 (abfd, record_ext.sect_count);
+       record.module_name_size = H_GET_32 (abfd,
+                                           record_ext.mod_name_length);
+
+       amt = record.module_name_size;
+       module[i].name = bfd_alloc (abfd, amt + 1);
+       if (!module[i].name)
+         return NULL;
+       if (bfd_bread ((void *) module[i].name, amt, abfd) != amt)
+         return NULL;
+       module[i].name[record.module_name_size] = 0;
+       filepos += (sizeof (record_ext)
+                   + record.dep_count * 4
+                   + record.module_name_size + 1);
 
        module[i].size = record.mod_size;
        module[i].pos = record.file_offset;
@@ -384,11 +383,13 @@ oasys_slurp_section_data (bfd *const abfd)
 
            if (! per->initialized)
              {
+               arelent **relpp;
+
                per->data = bfd_zalloc (abfd, section->size);
                if (!per->data)
                  return FALSE;
-               per->reloc_tail_ptr
-                 = (oasys_reloc_type **) &section->relocation;
+               relpp = &section->relocation;
+               per->reloc_tail_ptr = (oasys_reloc_type **) relpp;
                per->had_vma = FALSE;
                per->initialized = TRUE;
                section->reloc_count = 0;
@@ -611,6 +612,7 @@ oasys_object_p (bfd *abfd)
          break;
        case oasys_record_is_data_enum:
          oasys->first_data_record = bfd_tell (abfd) - record.header.length;
+         /* Fall through.  */
        case oasys_record_is_debug_enum:
        case oasys_record_is_module_enum:
        case oasys_record_is_named_section_enum:
@@ -683,9 +685,13 @@ oasys_print_symbol (bfd *abfd, void * afile, asymbol *symbol, bfd_print_symbol_t
 static bfd_boolean
 oasys_new_section_hook (bfd *abfd, asection *newsect)
 {
-  newsect->used_by_bfd = bfd_alloc (abfd, (bfd_size_type) sizeof (oasys_per_section_type));
   if (!newsect->used_by_bfd)
-    return FALSE;
+    {
+      newsect->used_by_bfd
+       = bfd_alloc (abfd, (bfd_size_type) sizeof (oasys_per_section_type));
+      if (!newsect->used_by_bfd)
+       return FALSE;
+    }
   oasys_per_section (newsect)->data = NULL;
   oasys_per_section (newsect)->section = newsect;
   oasys_per_section (newsect)->offset = 0;
@@ -695,7 +701,7 @@ oasys_new_section_hook (bfd *abfd, asection *newsect)
   /* Turn the section string into an index.  */
   sscanf (newsect->name, "%u", &newsect->target_index);
 
-  return TRUE;
+  return _bfd_generic_new_section_hook (abfd, newsect);
 }
 
 
@@ -779,7 +785,7 @@ oasys_write_syms (bfd *abfd)
 {
   unsigned int count;
   asymbol **generic = bfd_get_outsymbols (abfd);
-  unsigned int index = 0;
+  unsigned int sym_index = 0;
 
   for (count = 0; count < bfd_get_symcount (abfd); count++)
     {
@@ -792,8 +798,8 @@ oasys_write_syms (bfd *abfd)
       if (bfd_is_com_section (g->section))
        {
          symbol.relb = RELOCATION_TYPE_COM;
-         H_PUT_16 (abfd, index, symbol.refno);
-         index++;
+         H_PUT_16 (abfd, sym_index, symbol.refno);
+         sym_index++;
        }
       else if (bfd_is_abs_section (g->section))
        {
@@ -803,9 +809,9 @@ oasys_write_syms (bfd *abfd)
       else if (bfd_is_und_section (g->section))
        {
          symbol.relb = RELOCATION_TYPE_UND;
-         H_PUT_16 (abfd, index, symbol.refno);
-         /* Overload the value field with the output index number */
-         index++;
+         H_PUT_16 (abfd, sym_index, symbol.refno);
+         /* Overload the value field with the output sym_index number */
+         sym_index++;
        }
       else if (g->flags & BSF_DEBUGGING)
        /* Throw it away.  */
@@ -852,7 +858,7 @@ oasys_write_syms (bfd *abfd)
                                              name[0]) + l))
            return FALSE;
        }
-      g->value = index - 1;
+      g->value = sym_index - 1;
     }
 
   return TRUE;
@@ -870,9 +876,9 @@ oasys_write_sections (bfd *abfd)
     {
       if (!ISDIGIT (s->name[0]))
        {
-         (*_bfd_error_handler)
-           (_("%s: can not represent section `%s' in oasys"),
-            bfd_get_filename (abfd), s->name);
+         _bfd_error_handler
+           /* xgettext:c-format */
+           (_("%B: can not represent section `%A' in oasys"), abfd, s);
          bfd_set_error (bfd_error_nonrepresentable_section);
          return FALSE;
        }
@@ -898,9 +904,11 @@ oasys_write_header (bfd *abfd)
 
   if (length > (size_t) sizeof (r.module_name))
     length = sizeof (r.module_name);
+  else if (length < (size_t) sizeof (r.module_name))
+    (void) memset (r.module_name + length, ' ',
+                  sizeof (r.module_name) - length);
 
   (void) memcpy (r.module_name, abfd->filename, length);
-  (void) memset (r.module_name + length, ' ', sizeof (r.module_name) - length);
 
   r.version_number = OASYS_VERSION_NUMBER;
   r.rev_number = OASYS_REV_NUMBER;
@@ -1077,12 +1085,12 @@ static asymbol *
 oasys_make_empty_symbol (bfd *abfd)
 {
   bfd_size_type amt = sizeof (oasys_symbol_type);
-  oasys_symbol_type *new = bfd_zalloc (abfd, amt);
+  oasys_symbol_type *new_symbol_type = bfd_zalloc (abfd, amt);
 
-  if (!new)
+  if (!new_symbol_type)
     return NULL;
-  new->symbol.the_bfd = abfd;
-  return &new->symbol;
+  new_symbol_type->symbol.the_bfd = abfd;
+  return &new_symbol_type->symbol;
 }
 
 /* User should have checked the file flags; perhaps we should return
@@ -1108,7 +1116,7 @@ oasys_openr_next_archived_file (bfd *arch, bfd *prev)
        {
          p->abfd = _bfd_create_empty_archive_element_shell (arch);
          p->abfd->origin = p->pos;
-         p->abfd->filename = p->name;
+         p->abfd->filename = xstrdup (p->name);
 
          /* Fixup a pointer to this element for the member.  */
          p->abfd->arelt_data = (void *) p;
@@ -1120,26 +1128,9 @@ oasys_openr_next_archived_file (bfd *arch, bfd *prev)
   return NULL;
 }
 
-static bfd_boolean
-oasys_find_nearest_line (bfd *abfd ATTRIBUTE_UNUSED,
-                        asection *section ATTRIBUTE_UNUSED,
-                        asymbol **symbols ATTRIBUTE_UNUSED,
-                        bfd_vma offset ATTRIBUTE_UNUSED,
-                        const char **filename_ptr ATTRIBUTE_UNUSED,
-                        const char **functionname_ptr ATTRIBUTE_UNUSED,
-                        unsigned int *line_ptr ATTRIBUTE_UNUSED)
-{
-  return FALSE;
-}
-
-static bfd_boolean
-oasys_find_inliner_info (bfd *abfd ATTRIBUTE_UNUSED,
-                        const char **filename_ptr ATTRIBUTE_UNUSED,
-                        const char **functionname_ptr ATTRIBUTE_UNUSED,
-                        unsigned int *line_ptr ATTRIBUTE_UNUSED)
-{
-  return FALSE;
-}
+#define oasys_find_nearest_line _bfd_nosymbols_find_nearest_line
+#define oasys_find_line                _bfd_nosymbols_find_line
+#define oasys_find_inliner_info _bfd_nosymbols_find_inliner_info
 
 static int
 oasys_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
@@ -1158,43 +1149,53 @@ oasys_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
 }
 
 static int
-oasys_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean exec ATTRIBUTE_UNUSED)
+oasys_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
+                     struct bfd_link_info *info ATTRIBUTE_UNUSED)
 {
   return 0;
 }
 
-#define        oasys_close_and_cleanup                    _bfd_generic_close_and_cleanup
-#define oasys_bfd_free_cached_info                 _bfd_generic_bfd_free_cached_info
-#define oasys_slurp_armap                          bfd_true
-#define oasys_slurp_extended_name_table            bfd_true
-#define oasys_construct_extended_name_table        ((bfd_boolean (*) (bfd *, char **, bfd_size_type *, const char **)) bfd_true)
-#define oasys_truncate_arname                      bfd_dont_truncate_arname
-#define oasys_write_armap                          ((bfd_boolean (*) (bfd *, unsigned int, struct orl *, unsigned int, int)) bfd_true)
-#define oasys_read_ar_hdr                          bfd_nullvoidptr
-#define oasys_get_elt_at_index                     _bfd_generic_get_elt_at_index
-#define oasys_update_armap_timestamp               bfd_true
-#define oasys_bfd_is_local_label_name              bfd_generic_is_local_label_name
-#define oasys_bfd_is_target_special_symbol         ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
-#define oasys_get_lineno                           _bfd_nosymbols_get_lineno
-#define oasys_bfd_make_debug_symbol                _bfd_nosymbols_bfd_make_debug_symbol
-#define oasys_read_minisymbols                     _bfd_generic_read_minisymbols
-#define oasys_minisymbol_to_symbol                 _bfd_generic_minisymbol_to_symbol
-#define oasys_bfd_reloc_type_lookup                _bfd_norelocs_bfd_reloc_type_lookup
-#define oasys_set_arch_mach                        bfd_default_set_arch_mach
-#define oasys_get_section_contents_in_window       _bfd_generic_get_section_contents_in_window
+#define        oasys_close_and_cleanup                    _bfd_generic_close_and_cleanup
+#define oasys_bfd_free_cached_info                _bfd_generic_bfd_free_cached_info
+#define oasys_slurp_armap                         bfd_true
+#define oasys_slurp_extended_name_table                   bfd_true
+#define oasys_construct_extended_name_table       ((bfd_boolean (*) (bfd *, char **, bfd_size_type *, const char **)) bfd_true)
+#define oasys_truncate_arname                     bfd_dont_truncate_arname
+#define oasys_write_armap                         ((bfd_boolean (*) (bfd *, unsigned int, struct orl *, unsigned int, int)) bfd_true)
+#define oasys_read_ar_hdr                         bfd_nullvoidptr
+#define oasys_write_ar_hdr ((bfd_boolean (*) (bfd *, bfd *)) bfd_false)
+#define oasys_get_elt_at_index                    _bfd_generic_get_elt_at_index
+#define oasys_update_armap_timestamp              bfd_true
+#define oasys_bfd_is_local_label_name             bfd_generic_is_local_label_name
+#define oasys_bfd_is_target_special_symbol        ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
+#define oasys_get_lineno                          _bfd_nosymbols_get_lineno
+#define oasys_get_symbol_version_string                   _bfd_nosymbols_get_symbol_version_string
+#define oasys_bfd_make_debug_symbol               _bfd_nosymbols_bfd_make_debug_symbol
+#define oasys_read_minisymbols                    _bfd_generic_read_minisymbols
+#define oasys_minisymbol_to_symbol                _bfd_generic_minisymbol_to_symbol
+#define oasys_bfd_reloc_type_lookup               _bfd_norelocs_bfd_reloc_type_lookup
+#define oasys_bfd_reloc_name_lookup         _bfd_norelocs_bfd_reloc_name_lookup
+#define oasys_set_arch_mach                       bfd_default_set_arch_mach
+#define oasys_get_section_contents_in_window      _bfd_generic_get_section_contents_in_window
 #define oasys_bfd_get_relocated_section_contents   bfd_generic_get_relocated_section_contents
-#define oasys_bfd_relax_section                    bfd_generic_relax_section
-#define oasys_bfd_gc_sections                      bfd_generic_gc_sections
-#define oasys_bfd_merge_sections                   bfd_generic_merge_sections
-#define oasys_bfd_is_group_section                 bfd_generic_is_group_section
-#define oasys_bfd_discard_group                    bfd_generic_discard_group
-#define oasys_section_already_linked               _bfd_generic_section_already_linked
-#define oasys_bfd_link_hash_table_create           _bfd_generic_link_hash_table_create
-#define oasys_bfd_link_hash_table_free             _bfd_generic_link_hash_table_free
-#define oasys_bfd_link_add_symbols                 _bfd_generic_link_add_symbols
-#define oasys_bfd_link_just_syms                   _bfd_generic_link_just_syms
-#define oasys_bfd_final_link                       _bfd_generic_final_link
-#define oasys_bfd_link_split_section               _bfd_generic_link_split_section
+#define oasys_bfd_relax_section                           bfd_generic_relax_section
+#define oasys_bfd_gc_sections                     bfd_generic_gc_sections
+#define oasys_bfd_lookup_section_flags            bfd_generic_lookup_section_flags
+#define oasys_bfd_merge_sections                  bfd_generic_merge_sections
+#define oasys_bfd_is_group_section                bfd_generic_is_group_section
+#define oasys_bfd_discard_group                           bfd_generic_discard_group
+#define oasys_section_already_linked              _bfd_generic_section_already_linked
+#define oasys_bfd_define_common_symbol            bfd_generic_define_common_symbol
+#define oasys_bfd_define_start_stop               bfd_generic_define_start_stop
+#define oasys_bfd_link_hash_table_create          _bfd_generic_link_hash_table_create
+#define oasys_bfd_link_add_symbols                _bfd_generic_link_add_symbols
+#define oasys_bfd_link_just_syms                  _bfd_generic_link_just_syms
+#define oasys_bfd_copy_link_hash_symbol_type \
+  _bfd_generic_copy_link_hash_symbol_type
+#define oasys_bfd_final_link                      _bfd_generic_final_link
+#define oasys_bfd_link_split_section              _bfd_generic_link_split_section
+#define oasys_bfd_link_check_relocs               _bfd_generic_link_check_relocs
+#define oasys_set_reloc                                   _bfd_generic_set_reloc
 
 const bfd_target oasys_vec =
 {
@@ -1210,6 +1211,7 @@ const bfd_target oasys_vec =
   0,                           /* Leading underscore.  */
   ' ',                         /* AR_pad_char.  */
   16,                          /* AR_max_namelen.  */
+  0,                           /* match priority.  */
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,  /* Data.  */
This page took 0.027284 seconds and 4 git commands to generate.