gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / bfd / i386msdos.c
index fdba24d5262c5f3cbe40378e794d2debbad20be4..38bb4410347e17a2f25494dee87668d8e0e6e0f9 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for MS-DOS executables.
 /* BFD back-end for MS-DOS executables.
-   Copyright (C) 1990-2014 Free Software Foundation, Inc.
+   Copyright (C) 1990-2020 Free Software Foundation, Inc.
    Written by Bryan Ford of the University of Utah.
 
    Contributed by the Center for Software Science at the
    Written by Bryan Ford of the University of Utah.
 
    Contributed by the Center for Software Science at the
 #include "bfd.h"
 #include "libbfd.h"
 #include "libaout.h"
 #include "bfd.h"
 #include "libbfd.h"
 #include "libaout.h"
+#include "coff/msdos.h"
 
 
-#define EXE_MAGIC      0x5a4d
 #define EXE_LOAD_HIGH  0x0000
 #define EXE_LOAD_LOW   0xffff
 #define EXE_PAGE_SIZE  512
 
 #define EXE_LOAD_HIGH  0x0000
 #define EXE_LOAD_LOW   0xffff
 #define EXE_PAGE_SIZE  512
 
+static bfd_boolean
+msdos_mkobject (bfd *abfd)
+{
+  bfd_default_set_arch_mach (abfd, bfd_arch_i386, bfd_mach_i386_i8086);
+
+  return aout_32_mkobject (abfd);
+}
+
+static bfd_cleanup
+msdos_object_p (bfd *abfd)
+{
+  struct external_DOS_hdr hdr;
+  bfd_byte buffer[2];
+  asection *section;
+  bfd_size_type size;
+
+  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
+      || (size = bfd_bread (&hdr, sizeof (hdr), abfd)) + 1 < DOS_HDR_SIZE + 1)
+    {
+      if (bfd_get_error () != bfd_error_system_call)
+       bfd_set_error (bfd_error_wrong_format);
+      return NULL;
+    }
+
+  if (H_GET_16 (abfd, hdr.e_magic) != IMAGE_DOS_SIGNATURE)
+    {
+      bfd_set_error (bfd_error_wrong_format);
+      return NULL;
+    }
+
+  /* Check that this isn't actually a PE, NE, or LE file. If it is, the
+     e_lfanew field will be valid and point to a header beginning with one of
+     the relevant signatures.  If not, e_lfanew might point to anything, so
+     don't bail if we can't read there.  */
+  if (size < offsetof (struct external_DOS_hdr, e_lfanew) + 4
+      || H_GET_16 (abfd, hdr.e_cparhdr) < 4)
+    ;
+  else if (bfd_seek (abfd, H_GET_32 (abfd, hdr.e_lfanew), SEEK_SET) != 0
+          || bfd_bread (buffer, (bfd_size_type) 2, abfd) != 2)
+    {
+      if (bfd_get_error () == bfd_error_system_call)
+       return NULL;
+    }
+  else
+    {
+      if (H_GET_16 (abfd, buffer) == IMAGE_NT_SIGNATURE
+         || H_GET_16 (abfd, buffer) == IMAGE_OS2_SIGNATURE
+         || H_GET_16 (abfd, buffer) == IMAGE_OS2_SIGNATURE_LE
+         || H_GET_16 (abfd, buffer) == IMAGE_OS2_SIGNATURE_LX)
+       {
+         bfd_set_error (bfd_error_wrong_format);
+         return NULL;
+       }
+    }
+
+  if (!msdos_mkobject (abfd))
+    return NULL;
+
+  abfd->flags = EXEC_P;
+  abfd->start_address = H_GET_16 (abfd, hdr.e_ip);
+
+  section = bfd_make_section (abfd, ".text");
+  if (section == NULL)
+    return NULL;
+
+  section->flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS);
+  section->filepos = H_GET_16 (abfd, hdr.e_cparhdr) * 16;
+  size = (H_GET_16 (abfd, hdr.e_cp) - 1) * EXE_PAGE_SIZE - section->filepos;
+  size += H_GET_16 (abfd, hdr.e_cblp);
+
+  /* Check that the size is valid.  */
+  if (bfd_seek (abfd, section->filepos + size, SEEK_SET) != 0)
+    {
+      if (bfd_get_error () != bfd_error_system_call)
+       bfd_set_error (bfd_error_wrong_format);
+      return NULL;
+    }
+
+  bfd_set_section_size (section, size);
+  section->alignment_power = 4;
+
+  return _bfd_no_cleanup;
+}
+
 static int
 msdos_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
                      struct bfd_link_info *info ATTRIBUTE_UNUSED)
 static int
 msdos_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
                      struct bfd_link_info *info ATTRIBUTE_UNUSED)
@@ -52,17 +136,17 @@ msdos_write_object_contents (bfd *abfd)
   for (sec = abfd->sections; sec != (asection *) NULL; sec = sec->next)
     {
       if (sec->size == 0)
   for (sec = abfd->sections; sec != (asection *) NULL; sec = sec->next)
     {
       if (sec->size == 0)
-        continue;
-      if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
-        {
-         bfd_vma sec_vma = bfd_get_section_vma (abfd, sec) + sec->size;
+       continue;
+      if (bfd_section_flags (sec) & SEC_ALLOC)
+       {
+         bfd_vma sec_vma = bfd_section_vma (sec) + sec->size;
          if (sec_vma > high_vma)
            high_vma = sec_vma;
        }
          if (sec_vma > high_vma)
            high_vma = sec_vma;
        }
-      if (bfd_get_section_flags (abfd, sec) & SEC_LOAD)
-        {
+      if (bfd_section_flags (sec) & SEC_LOAD)
+       {
          file_ptr sec_end = (sizeof (hdr)
          file_ptr sec_end = (sizeof (hdr)
-                             + bfd_get_section_vma (abfd, sec)
+                             + bfd_section_vma (sec)
                              + sec->size);
          if (sec_end > outfile_size)
            outfile_size = sec_end;
                              + sec->size);
          if (sec_end > outfile_size)
            outfile_size = sec_end;
@@ -77,7 +161,7 @@ msdos_write_object_contents (bfd *abfd)
     }
 
   /* Constants.  */
     }
 
   /* Constants.  */
-  H_PUT_16 (abfd, EXE_MAGIC, &hdr[0]);
+  H_PUT_16 (abfd, IMAGE_DOS_SIGNATURE, &hdr[0]);
   H_PUT_16 (abfd, EXE_PAGE_SIZE / 16, &hdr[8]);
   H_PUT_16 (abfd, EXE_LOAD_LOW, &hdr[12]);
   H_PUT_16 (abfd, 0x3e, &hdr[24]);
   H_PUT_16 (abfd, EXE_PAGE_SIZE / 16, &hdr[8]);
   H_PUT_16 (abfd, EXE_LOAD_LOW, &hdr[12]);
   H_PUT_16 (abfd, 0x3e, &hdr[24]);
@@ -113,13 +197,13 @@ msdos_set_section_contents (bfd *abfd,
   if (count == 0)
     return TRUE;
 
   if (count == 0)
     return TRUE;
 
-  section->filepos = EXE_PAGE_SIZE + bfd_get_section_vma (abfd, section);
+  section->filepos = EXE_PAGE_SIZE + bfd_section_vma (section);
 
 
-  if (bfd_get_section_flags (abfd, section) & SEC_LOAD)
+  if (bfd_section_flags (section) & SEC_LOAD)
     {
       if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
     {
       if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
-          || bfd_bwrite (location, count, abfd) != count)
-        return FALSE;
+         || bfd_bwrite (location, count, abfd) != count)
+       return FALSE;
     }
 
   return TRUE;
     }
 
   return TRUE;
@@ -127,7 +211,6 @@ msdos_set_section_contents (bfd *abfd,
 
 
 
 
 
 
-#define msdos_mkobject aout_32_mkobject
 #define msdos_make_empty_symbol aout_32_make_empty_symbol
 #define msdos_bfd_reloc_type_lookup aout_32_reloc_type_lookup
 #define msdos_bfd_reloc_name_lookup aout_32_reloc_name_lookup
 #define msdos_make_empty_symbol aout_32_make_empty_symbol
 #define msdos_bfd_reloc_type_lookup aout_32_reloc_type_lookup
 #define msdos_bfd_reloc_name_lookup aout_32_reloc_name_lookup
@@ -145,12 +228,14 @@ msdos_set_section_contents (bfd *abfd,
 #define msdos_bfd_lookup_section_flags bfd_generic_lookup_section_flags
 #define msdos_bfd_merge_sections bfd_generic_merge_sections
 #define msdos_bfd_is_group_section bfd_generic_is_group_section
 #define msdos_bfd_lookup_section_flags bfd_generic_lookup_section_flags
 #define msdos_bfd_merge_sections bfd_generic_merge_sections
 #define msdos_bfd_is_group_section bfd_generic_is_group_section
+#define msdos_bfd_group_name bfd_generic_group_name
 #define msdos_bfd_discard_group bfd_generic_discard_group
 #define msdos_section_already_linked \
   _bfd_generic_section_already_linked
 #define msdos_bfd_define_common_symbol bfd_generic_define_common_symbol
 #define msdos_bfd_discard_group bfd_generic_discard_group
 #define msdos_section_already_linked \
   _bfd_generic_section_already_linked
 #define msdos_bfd_define_common_symbol bfd_generic_define_common_symbol
+#define msdos_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
+#define msdos_bfd_define_start_stop bfd_generic_define_start_stop
 #define msdos_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
 #define msdos_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
-#define msdos_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
 #define msdos_bfd_link_add_symbols _bfd_generic_link_add_symbols
 #define msdos_bfd_link_just_syms _bfd_generic_link_just_syms
 #define msdos_bfd_copy_link_hash_symbol_type \
 #define msdos_bfd_link_add_symbols _bfd_generic_link_add_symbols
 #define msdos_bfd_link_just_syms _bfd_generic_link_just_syms
 #define msdos_bfd_copy_link_hash_symbol_type \
@@ -158,25 +243,30 @@ msdos_set_section_contents (bfd *abfd,
 #define msdos_bfd_final_link _bfd_generic_final_link
 #define msdos_bfd_link_split_section _bfd_generic_link_split_section
 #define msdos_set_arch_mach _bfd_generic_set_arch_mach
 #define msdos_bfd_final_link _bfd_generic_final_link
 #define msdos_bfd_link_split_section _bfd_generic_link_split_section
 #define msdos_set_arch_mach _bfd_generic_set_arch_mach
+#define msdos_bfd_link_check_relocs _bfd_generic_link_check_relocs
 
 #define msdos_get_symtab_upper_bound _bfd_nosymbols_get_symtab_upper_bound
 #define msdos_canonicalize_symtab _bfd_nosymbols_canonicalize_symtab
 #define msdos_print_symbol _bfd_nosymbols_print_symbol
 #define msdos_get_symbol_info _bfd_nosymbols_get_symbol_info
 
 #define msdos_get_symtab_upper_bound _bfd_nosymbols_get_symtab_upper_bound
 #define msdos_canonicalize_symtab _bfd_nosymbols_canonicalize_symtab
 #define msdos_print_symbol _bfd_nosymbols_print_symbol
 #define msdos_get_symbol_info _bfd_nosymbols_get_symbol_info
+#define msdos_get_symbol_version_string \
+  _bfd_nosymbols_get_symbol_version_string
 #define msdos_find_nearest_line _bfd_nosymbols_find_nearest_line
 #define msdos_find_nearest_line _bfd_nosymbols_find_nearest_line
+#define msdos_find_line _bfd_nosymbols_find_line
 #define msdos_find_inliner_info _bfd_nosymbols_find_inliner_info
 #define msdos_get_lineno _bfd_nosymbols_get_lineno
 #define msdos_find_inliner_info _bfd_nosymbols_find_inliner_info
 #define msdos_get_lineno _bfd_nosymbols_get_lineno
-#define msdos_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
+#define msdos_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
 #define msdos_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
 #define msdos_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
 #define msdos_read_minisymbols _bfd_nosymbols_read_minisymbols
 #define msdos_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol
 
 #define msdos_canonicalize_reloc _bfd_norelocs_canonicalize_reloc
 #define msdos_bfd_is_local_label_name _bfd_nosymbols_bfd_is_local_label_name
 #define msdos_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
 #define msdos_read_minisymbols _bfd_nosymbols_read_minisymbols
 #define msdos_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol
 
 #define msdos_canonicalize_reloc _bfd_norelocs_canonicalize_reloc
+#define msdos_set_reloc _bfd_norelocs_set_reloc
 #define msdos_get_reloc_upper_bound _bfd_norelocs_get_reloc_upper_bound
 #define msdos_32_bfd_link_split_section  _bfd_generic_link_split_section
 
 #define msdos_get_reloc_upper_bound _bfd_norelocs_get_reloc_upper_bound
 #define msdos_32_bfd_link_split_section  _bfd_generic_link_split_section
 
-const bfd_target i386msdos_vec =
+const bfd_target i386_msdos_vec =
   {
     "msdos",                   /* name */
     bfd_target_msdos_flavour,
   {
     "msdos",                   /* name */
     bfd_target_msdos_flavour,
@@ -198,21 +288,21 @@ const bfd_target i386msdos_vec =
 
     {
       _bfd_dummy_target,
 
     {
       _bfd_dummy_target,
-      _bfd_dummy_target,               /* bfd_check_format */
+      msdos_object_p,          /* bfd_check_format */
       _bfd_dummy_target,
       _bfd_dummy_target,
     },
     {
       _bfd_dummy_target,
       _bfd_dummy_target,
     },
     {
-      bfd_false,
+      _bfd_bool_bfd_false_error,
       msdos_mkobject,
       _bfd_generic_mkarchive,
       msdos_mkobject,
       _bfd_generic_mkarchive,
-      bfd_false,
+      _bfd_bool_bfd_false_error,
     },
     {                          /* bfd_write_contents */
     },
     {                          /* bfd_write_contents */
-      bfd_false,
+      _bfd_bool_bfd_false_error,
       msdos_write_object_contents,
       _bfd_write_archive_contents,
       msdos_write_object_contents,
       _bfd_write_archive_contents,
-      bfd_false,
+      _bfd_bool_bfd_false_error,
     },
 
     BFD_JUMP_TABLE_GENERIC (msdos),
     },
 
     BFD_JUMP_TABLE_GENERIC (msdos),
This page took 0.026732 seconds and 4 git commands to generate.