This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch/committed] vms: add print_private_bfd_data


Hi,

this patch adds two new features to the vms backend:

* a few header fields are now dumped with 'objdump -p'.

* bfd is now able to read unaligned raw streams.  Such files can be the result of an ftp transfer.  This
  works only with Alpha objects and images.

Also, a few trailing spaces are removed and some comments have been modified.

Tristan.

bfd/
2010-01-27  Tristan Gingold  <gingold@adacore.com>

	* vms.h: Remove trailing spaces.
	(struct hdr_struct): Remove unused hdr_c_cpr field.
	(enum file_format_enum): Add comments.
	* vms.c (vms_bfd_print_private_bfd_data): New function that
	replaces the macro.
	Remove trailing spaces.
	* vms-misc.c: Improve comments.
	(_bfd_vms_get_object_record): Also handle files without pads.
	* vms-hdr.c (_bfd_vms_write_dbg): Fix format string.
	* vms-gsd.c (struct flagdescstruct): Make name field const.
	(gsyflagdesc): Fix typo.

--- a/bfd/vms-gsd.c
+++ b/bfd/vms-gsd.c
@@ -204,7 +204,7 @@ vms_esecflag_by_name (struct sec_flags_struct *section_flags,
 
 #if VMS_DEBUG
 
-struct flagdescstruct { char *name; flagword value; };
+struct flagdescstruct { const char *name; flagword value; };
 
 static const struct flagdescstruct gpsflagdesc[] =
 {
@@ -231,7 +231,7 @@ static const struct flagdescstruct gsyflagdesc[] =
   { "REL",  GSY_S_M_REL },
   { "COMM", EGSY_S_V_COMM },
   { "VECEP", EGSY_S_V_VECEP },
-  { "NORM", EGCY_S_V_NORM },
+  { "NORM", EGSY_S_V_NORM },
   { NULL, 0 }
 };
 
diff --git a/bfd/vms-hdr.c b/bfd/vms-hdr.c
index 49e6809..4ac5b97 100644
--- a/bfd/vms-hdr.c
+++ b/bfd/vms-hdr.c
@@ -1397,7 +1397,7 @@ int
 _bfd_vms_write_dbg (bfd *abfd ATTRIBUTE_UNUSED, int objtype ATTRIBUTE_UNUSED)
 {
 #if VMS_DEBUG
-  _bfd_vms_debug (2, "vms_write_dbg (%p, objtype)\n", abfd, objtype);
+  _bfd_vms_debug (2, "vms_write_dbg (%p, %d)\n", abfd, objtype);
 #endif
 
   return 0;
diff --git a/bfd/vms-misc.c b/bfd/vms-misc.c
index 2181658..47e5985 100644
--- a/bfd/vms-misc.c
+++ b/bfd/vms-misc.c
@@ -211,7 +211,7 @@ _bfd_vms_get_header_values (bfd * abfd ATTRIBUTE_UNUSED,
    can view and change the attributes of a file.  Changing from
    'variable length' to 'fixed length, 512 bytes' reveals the
    record size at the first 2 bytes of every record.  The same
-   happens during the transfer of object files from VMS to Unix,
+   may happen during the transfer of object files from VMS to Unix,
    at least with UCX, the DEC implementation of TCP/IP.
 
    The VMS format repeats the size at bytes 2 & 3 of every record.
@@ -355,6 +355,8 @@ _bfd_vms_get_object_record (bfd *abfd)
     test_len = 0;
   else
     {
+      int off = 0;
+
       /* See _bfd_vms_get_first_record.  */
       test_len = 6;
 
@@ -366,10 +368,16 @@ _bfd_vms_get_object_record (bfd *abfd)
 	      bfd_set_error (bfd_error_file_truncated);
 	      return -1;
 	    }
+          /* Alignment byte may be present or not.  This is not easy to
+             detect but all object record types are not 0 (on Alpha VMS).
+             We also hope that pad byte is 0.  */
+          if (PRIV (vms_buf)[0])
+            off = 1;
 	}
 
       /* Read the record header  */
-      if (bfd_bread (PRIV (vms_buf), test_len, abfd) != test_len)
+      if (bfd_bread (PRIV (vms_buf) + off, test_len - off, abfd)
+          != test_len - off)
 	{
 	  bfd_set_error (bfd_error_file_truncated);
 	  return -1;
diff --git a/bfd/vms.c b/bfd/vms.c
index a2886dd..176705e 100644
--- a/bfd/vms.c
+++ b/bfd/vms.c
@@ -90,7 +90,6 @@ static bfd_boolean vms_set_section_contents
 #define vms_get_synthetic_symtab          _bfd_nodynamic_get_synthetic_symtab
 
 #define vms_bfd_copy_private_bfd_data	  _bfd_generic_bfd_copy_private_bfd_data
-#define vms_bfd_print_private_bfd_data	  _bfd_generic_bfd_print_private_bfd_data
 #define vms_bfd_free_cached_info	  _bfd_generic_bfd_free_cached_info
 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
 #define vms_bfd_copy_private_symbol_data  _bfd_generic_bfd_copy_private_symbol_data
@@ -195,7 +194,7 @@ fill_section_ptr (struct bfd_hash_entry *entry, void *sections)
     }
   else if (sec == (unsigned long)-1)
     sym->section = &bfd_und_section;
-    
+
   return TRUE;
 }
 
@@ -516,11 +515,11 @@ vms_convert_to_var (char *vms_filename)
   fab.fab$b_fac = FAB$M_PUT;
   fab.fab$l_fop = FAB$M_ESC;
   fab.fab$l_ctx = RME$C_SETRFM;
-  
+
   sys$open (&fab);
-  
+
   fab.fab$b_rfm = FAB$C_VAR;
-  
+
   sys$modify (&fab);
   sys$close (&fab);
 }
@@ -972,7 +971,7 @@ vms_slurp_reloc_table (bfd *abfd, asection *section, asymbol **symbols)
 static long
 vms_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *section)
 {
-  return (section->reloc_count + 1) * sizeof (arelent *);  
+  return (section->reloc_count + 1) * sizeof (arelent *);
 }
 
 /* Convert relocations from VMS (external) form into BFD internal
@@ -1411,6 +1410,22 @@ vms_set_section_contents (bfd * abfd,
   memcpy (section->contents + offset, location, (size_t) count);
   return TRUE;
 }
+
+static bfd_boolean
+vms_bfd_print_private_bfd_data (bfd *abfd, void *ptr)
+{
+  FILE *file = (FILE *)ptr;
+
+  fprintf (file, _("structure level: %d\n"), PRIV(hdr_data.hdr_b_strlvl));
+  fprintf (file, _("module name    : %s\n"), PRIV(hdr_data.hdr_t_name));
+  fprintf (file, _("module version : %s\n"), PRIV(hdr_data.hdr_t_version));
+  fprintf (file, _("module date    : %s\n"), PRIV(hdr_data.hdr_t_date));
+  fprintf (file, _("language name  : %s\n"), PRIV(hdr_data.hdr_c_lnm));
+  fprintf (file, _("source files   : %s\n"), PRIV(hdr_data.hdr_c_src));
+  fprintf (file, _("title          : %s\n"), PRIV(hdr_data.hdr_c_ttl));
+
+  return TRUE;
+}
 

 const bfd_target vms_alpha_vec =
 {
diff --git a/bfd/vms.h b/bfd/vms.h
index 4bde72b..8733e4f 100644
--- a/bfd/vms.h
+++ b/bfd/vms.h
@@ -544,10 +544,10 @@ extern int _bfd_vms_decode_relocs
 #define EOBJ_S_C_ETBT 13	/* EVAX Taceback information record.	*/
 #define EOBJ_S_C_MAXRECTYP 13	/* EVAX Lst assigned record type.	*/
 
-#define OBJ_S_K_SUBTYP 1		 
-#define OBJ_S_C_SUBTYP 1		 
-#define EOBJ_S_K_SUBTYP 4		 
-#define EOBJ_S_C_SUBTYP 4		 
+#define OBJ_S_K_SUBTYP 1
+#define OBJ_S_C_SUBTYP 1
+#define EOBJ_S_K_SUBTYP 4
+#define EOBJ_S_C_SUBTYP 4
 #define OBJ_S_C_MAXRECSIZ 2048	/* Maximu legal record size.           */
 #define EOBJ_S_C_MAXRECSIZ 8192 /* Maximu legal record size.           */
 #define OBJ_S_C_STRLVL 0	/* Structre level.                     */
@@ -562,18 +562,18 @@ extern int _bfd_vms_decode_relocs
 
 #define EVAX_OFFSET	256	/* Type ofset for EVAX codes in switch.  */
 
-/* Miscellaneous definitions.  */	 
+/* Miscellaneous definitions.  */
 
-#if __GNUC__				 
-typedef unsigned long long uquad;	 
-#else					 
-typedef unsigned long uquad;		 
-#endif					 
+#if __GNUC__
+typedef unsigned long long uquad;
+#else
+typedef unsigned long uquad;
+#endif
 
 #define MAX_OUTREC_SIZE 4096
 #define MIN_OUTREC_LUFT 64
 
-/* VMS module header.  */		 
+/* VMS module header.  */
 
 struct hdr_struct
 {
@@ -587,7 +587,6 @@ struct hdr_struct
   char *hdr_c_lnm;
   char *hdr_c_src;
   char *hdr_c_ttl;
-  char *hdr_c_cpr;
 };
 
 #define EMH_S_W_HDRTYP   4
@@ -676,8 +675,22 @@ struct eom_struct
 #define DBG_S_L_DMT_PSECT_LENGTH 4
 #define DBG_S_C_DMT_PSECT_SIZE   8
 
+/* File format.  */
+enum file_format_enum
+  {
+    /* Not yet known.  */
+    FF_UNKNOWN,
+
+    /* Unix format.  Each record is preceeded by the record length,
+       on 2 bytes.  */
+    FF_FOREIGN,
+
+    /* Native (=VMS) format.  The file only contains the content of the
+       records.  This may also appear on Unix, depending on which tool
+       was used to transfer files.  */
+    FF_NATIVE
+  };
 
-enum file_format_enum { FF_UNKNOWN, FF_FOREIGN, FF_NATIVE };
 enum file_type_enum { FT_UNKNOWN, FT_MODULE, FT_IMAGE };
 
 typedef struct vms_symbol_struct
@@ -840,7 +853,7 @@ struct vms_section_data_struct
 
 #define vms_section_data(sec) \
   ((struct vms_section_data_struct *)sec->used_by_bfd)
- 
+
 struct evax_private_udata_struct
 {
   asymbol *bsym;
@@ -850,8 +863,8 @@ struct evax_private_udata_struct
 };
 
 #define SECTION_NAME_TEMPLATE "__SEC__%d"
-					 
-#if VMS_DEBUG				 
+
+#if VMS_DEBUG
 extern void _bfd_vms_debug (int, char *, ...) ATTRIBUTE_PRINTF_2;
 extern void _bfd_hexdump   (int, unsigned char *, int, int);
 
@@ -859,8 +872,8 @@ extern void _bfd_hexdump   (int, unsigned char *, int, int);
 #define vms_debug2(X) _bfd_vms_debug X
 #else
 #define vms_debug2(X)
-#endif					 
-					 
+#endif
+
 extern struct bfd_hash_entry * _bfd_vms_hash_newfunc (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
 extern void        _bfd_vms_get_header_values (bfd *, unsigned char *, int *, int *);
 extern int         _bfd_vms_get_record  (bfd *abf);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]