From df952b8981e8cd3afba53520a6ccb20784c6af1d Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Mon, 17 May 2010 08:07:43 +0000 Subject: [PATCH] bfd/ 2010-05-17 Tristan Gingold * vms-alpha.c: Include esgps.h and eidc.h. (_bfd_vms_slurp_egsd): Ignore SPSC and IDC sub-records. (evax_bfd_print_egsd_flags): New function, extracted from ... (evax_bfd_print_egsd): ..., calls evax_bfd_print_egsd_flags. Handles EGSD__C_SPSC and EGSD__C_IDC. include/vms: 2010-05-17 Tristan Gingold * eidc.h: New file. * esgps.h: New file. --- bfd/ChangeLog | 8 ++++ bfd/vms-alpha.c | 113 ++++++++++++++++++++++++++++++++++++++------------ include/vms/ChangeLog | 5 +++ include/vms/eidc.h | 49 ++++++++++++++++++++++ include/vms/esgps.h | 72 ++++++++++++++++++++++++++++++++ 5 files changed, 220 insertions(+), 27 deletions(-) create mode 100644 include/vms/eidc.h create mode 100644 include/vms/esgps.h diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 02f9c0518..adec88e39 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2010-05-17 Tristan Gingold + + * vms-alpha.c: Include esgps.h and eidc.h. + (_bfd_vms_slurp_egsd): Ignore SPSC and IDC sub-records. + (evax_bfd_print_egsd_flags): New function, extracted from evax_bfd_print_egsd. + (evax_bfd_print_egsd): Calls evax_bfd_print_egsd_flags. Handles + EGSD__C_SPSC and EGSD__C_IDC. + 2010-05-14 Tristan Gingold * vms-alpha.c (alpha_vms_object_p): Accept header size of 0. diff --git a/bfd/vms-alpha.c b/bfd/vms-alpha.c index c4e4c9cc7..cf4cc061c 100644 --- a/bfd/vms-alpha.c +++ b/bfd/vms-alpha.c @@ -51,6 +51,7 @@ #include "vms/eobjrec.h" #include "vms/egsd.h" #include "vms/egps.h" +#include "vms/esgps.h" #include "vms/eeom.h" #include "vms/emh.h" #include "vms/eiaf.h" @@ -63,6 +64,7 @@ #include "vms/esdfv.h" #include "vms/esrf.h" #include "vms/egst.h" +#include "vms/eidc.h" #include "vms/dsc.h" #include "vms/prt.h" #include "vms/internal.h" @@ -1240,7 +1242,10 @@ _bfd_vms_slurp_egsd (bfd * abfd) } break; - case EGSD__C_IDC: + case EGSD__C_SPSC: + case EGSD__C_IDC: + /* Currently ignored. */ + break; case EGSD__C_SYMM: case EGSD__C_SYMV: default: @@ -5629,6 +5634,37 @@ exav_bfd_print_egsy_flags (unsigned int flags, FILE *file) } static void +evax_bfd_print_egsd_flags (FILE *file, unsigned int flags) +{ + if (flags & EGPS__V_PIC) + fputs (_(" PIC"), file); + if (flags & EGPS__V_LIB) + fputs (_(" LIB"), file); + if (flags & EGPS__V_OVR) + fputs (_(" OVR"), file); + if (flags & EGPS__V_REL) + fputs (_(" REL"), file); + if (flags & EGPS__V_GBL) + fputs (_(" GBL"), file); + if (flags & EGPS__V_SHR) + fputs (_(" SHR"), file); + if (flags & EGPS__V_EXE) + fputs (_(" EXE"), file); + if (flags & EGPS__V_RD) + fputs (_(" RD"), file); + if (flags & EGPS__V_WRT) + fputs (_(" WRT"), file); + if (flags & EGPS__V_VEC) + fputs (_(" VEC"), file); + if (flags & EGPS__V_NOMOD) + fputs (_(" NOMOD"), file); + if (flags & EGPS__V_COM) + fputs (_(" COM"), file); + if (flags & EGPS__V_ALLOC_64BIT) + fputs (_(" 64B"), file); +} + +static void evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len) { unsigned int off = sizeof (struct vms_egsd); @@ -5661,32 +5697,7 @@ evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len) fprintf (file, _("PSC - Program section definition\n")); fprintf (file, _(" alignment : 2**%u\n"), egps->align); fprintf (file, _(" flags : 0x%04x"), flags); - if (flags & EGPS__V_PIC) - fputs (_(" PIC"), file); - if (flags & EGPS__V_LIB) - fputs (_(" LIB"), file); - if (flags & EGPS__V_OVR) - fputs (_(" OVR"), file); - if (flags & EGPS__V_REL) - fputs (_(" REL"), file); - if (flags & EGPS__V_GBL) - fputs (_(" GBL"), file); - if (flags & EGPS__V_SHR) - fputs (_(" SHR"), file); - if (flags & EGPS__V_EXE) - fputs (_(" EXE"), file); - if (flags & EGPS__V_RD) - fputs (_(" RD"), file); - if (flags & EGPS__V_WRT) - fputs (_(" WRT"), file); - if (flags & EGPS__V_VEC) - fputs (_(" VEC"), file); - if (flags & EGPS__V_NOMOD) - fputs (_(" NOMOD"), file); - if (flags & EGPS__V_COM) - fputs (_(" COM"), file); - if (flags & EGPS__V_ALLOC_64BIT) - fputs (_(" 64B"), file); + evax_bfd_print_egsd_flags (file, flags); fputc ('\n', file); l = bfd_getl32 (egps->alloc); fprintf (file, _(" alloc (len): %u (0x%08x)\n"), l, l); @@ -5694,6 +5705,27 @@ evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len) egps->namlng, egps->name); } break; + case EGSD__C_SPSC: + { + struct vms_esgps *esgps = (struct vms_esgps *)e; + unsigned int flags = bfd_getl16 (esgps->flags); + unsigned int l; + + fprintf (file, _("SPSC - Shared Image Program section def\n")); + fprintf (file, _(" alignment : 2**%u\n"), esgps->align); + fprintf (file, _(" flags : 0x%04x"), flags); + evax_bfd_print_egsd_flags (file, flags); + fputc ('\n', file); + l = bfd_getl32 (esgps->alloc); + fprintf (file, _(" alloc (len) : %u (0x%08x)\n"), l, l); + fprintf (file, _(" image offset : 0x%08x\n"), + (unsigned int)bfd_getl32 (esgps->base)); + fprintf (file, _(" symvec offset : 0x%08x\n"), + (unsigned int)bfd_getl32 (esgps->value)); + fprintf (file, _(" name : %.*s\n"), + esgps->namlng, esgps->name); + } + break; case EGSD__C_SYM: { struct vms_egsy *egsy = (struct vms_egsy *)e; @@ -5731,6 +5763,33 @@ evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len) } } break; + case EGSD__C_IDC: + { + struct vms_eidc *eidc = (struct vms_eidc *)e; + unsigned int flags = bfd_getl32 (eidc->flags); + unsigned char *p; + + fprintf (file, _("IDC - Ident Consistency check\n")); + fprintf (file, _(" flags : 0x%08x"), flags); + if (flags & EIDC__V_BINIDENT) + fputs (" BINDENT", file); + fputc ('\n', file); + fprintf (file, _(" id match : %x\n"), + (flags >> EIDC__V_IDMATCH_SH) & EIDC__V_IDMATCH_MASK); + fprintf (file, _(" error severity: %x\n"), + (flags >> EIDC__V_ERRSEV_SH) & EIDC__V_ERRSEV_MASK); + p = eidc->name; + fprintf (file, _(" entity name : %.*s\n"), p[0], p + 1); + p += 1 + p[0]; + fprintf (file, _(" object name : %.*s\n"), p[0], p + 1); + p += 1 + p[0]; + if (flags & EIDC__V_BINIDENT) + fprintf (file, _(" binary ident : 0x%08x\n"), + (unsigned)bfd_getl32 (p + 1)); + else + fprintf (file, _(" ascii ident : %.*s\n"), p[0], p + 1); + } + break; case EGSD__C_SYMG: { struct vms_egst *egst = (struct vms_egst *)e; diff --git a/include/vms/ChangeLog b/include/vms/ChangeLog index edd78fe0a..e8042bfe0 100644 --- a/include/vms/ChangeLog +++ b/include/vms/ChangeLog @@ -1,3 +1,8 @@ +2010-05-17 Tristan Gingold + + * eidc.h: New file. + * esgps.h: New file. + 2010-05-03 Tristan Gingold * dmt.h: Improve comments. diff --git a/include/vms/eidc.h b/include/vms/eidc.h new file mode 100644 index 000000000..987e8c24e --- /dev/null +++ b/include/vms/eidc.h @@ -0,0 +1,49 @@ +/* Alpha VMS external format of Ident Consistency check. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + 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 3 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. + + 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. */ + +#ifndef _VMS_EIDC_H +#define _VMS_EIDC_H + +struct vms_eidc +{ + /* Record type. */ + unsigned char rectyp[2]; + + /* Record size. */ + unsigned char recsiz[2]; + + unsigned char flags[4]; + + /* Entity name (ASCIC). */ + /* Object name (ASCIC). */ + /* Ident string (ASCIC or binary BINIDENT set). */ + unsigned char name[1]; +}; + +/* Fields of flags. */ +#define EIDC__V_BINIDENT (1 << 0) /* Ident is a longword. */ +#define EIDC__V_IDMATCH_SH 1 /* Ident match control. */ +#define EIDC__V_IDMATCH_MASK 3 +#define EIDC__V_ERRSEV_SH 3 /* Error severity. */ +#define EIDC__V_ERRSEV_MASK 7 + +#endif /* _VMS_EIDC_H */ diff --git a/include/vms/esgps.h b/include/vms/esgps.h new file mode 100644 index 000000000..e668a8748 --- /dev/null +++ b/include/vms/esgps.h @@ -0,0 +1,72 @@ +/* Alpha VMS external format of Extended Shared Program Section Definition. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + 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 3 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. + + 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. */ + +#ifndef _VMS_ESGPS_H +#define _VMS_ESGPS_H + +struct vms_esgps +{ + /* Entry type. */ + unsigned char gsdtyp[2]; + + /* Length of the entry. */ + unsigned char gsdsiz[2]; + + /* Psect alignment. */ + unsigned char align; + + /* Pad for alignment. */ + unsigned char temp; + + unsigned char flags[2]; + + /* Length of this contribution. */ + unsigned char alloc[4]; + + /* Image offset of the psect. */ + unsigned char base[4]; + + /* Symbol vector offset. */ + unsigned char value[8]; + + /* Name. */ + unsigned char namlng; + unsigned char name[31]; +}; + +/* These are the same as EGPS flags. */ + +#define ESGPS__V_PIC (1 << 0) /* Not meaningful. */ +#define ESGPS__V_LIB (1 << 1) /* Defined in a shareable image. */ +#define ESGPS__V_OVR (1 << 2) /* Overlaid contribution. */ +#define ESGPS__V_REL (1 << 3) /* Relocatable. */ +#define ESGPS__V_GBL (1 << 4) /* Global. */ +#define ESGPS__V_SHR (1 << 5) /* Shareable. */ +#define ESGPS__V_EXE (1 << 6) /* Executable. */ +#define ESGPS__V_RD (1 << 7) /* Readable. */ +#define ESGPS__V_WRT (1 << 8) /* Writable. */ +#define ESGPS__V_VEC (1 << 9) /* Change mode dispatch or message vectors. */ +#define ESGPS__V_NOMOD (1 << 10) /* Demand-zero. */ +#define ESGPS__V_COM (1 << 11) /* Conditional storage. */ +#define ESGPS__V_ALLOC_64BIT (1 << 12) /* Allocated in 64-bit space. */ + +#endif /* _VMS_ESGPS_H */ -- 2.11.4.GIT