[VMS/committed] Make VMS library files extendable

h.becker becker.ismaning@freenet.de
Thu Mar 8 16:25:00 GMT 2012


Hi,

The maximum length of symbols for ELF libraries is 1024, as it is 
defined in the LIBDEF header of the share:SYS$STARLET_C.TLB. On recent 
(8.n) VMS systems (Alpha and I64) you should see this:

$ pipe libr/extr=lbrdef/out=sys$output sys$share:SYS$STARLET_C.TLB 
|search  sys$pipe max,elf/matc=and
#define LBR$C_ELFMAXKEYLEN 1024         /* Maximum length of an ASCII 
keyword for ELF libraries */
$

Hartmut


On 03/08/12 15:25, Tristan Gingold wrote:
> Hi,
>
> I recently noticed that VMS native ar tool (librarian) was not able to add members to an archive created by GNU ar.
> This is because some fields of the headers were left to 0.
> (This is not an issue to GNU ar, because contrary to VMS library, it always rewrite the whole archive).
>
> Also, the maximum length of symbols and filename were not correctly set for ia64-hp-openvms.
>
> Fixed by this patch.
> Committed on trunk.
>
> Tristan.
>
> bfd/
> 2012-03-08  Tristan Gingold<gingold@adacore.com>
>
> 	* vms-lib.c (_bfd_vms_lib_write_archive_contents): Set maximum
> 	keylen according to archive kind.  Set nextvbn and nextrfa lhd
> 	fields.  Add comments.
>
>
> Index: vms-lib.c
> ===================================================================
> RCS file: /cvs/src/src/bfd/vms-lib.c,v
> retrieving revision 1.19
> diff -c -r1.19 vms-lib.c
> *** vms-lib.c	23 Dec 2011 09:23:31 -0000	1.19
> --- vms-lib.c	8 Mar 2012 14:15:05 -0000
> ***************
> *** 2006,2011 ****
> --- 2006,2012 ----
>      unsigned int mod_idx_vbn;
>      unsigned int sym_idx_vbn;
>      bfd_boolean is_elfidx = tdata->kind == vms_lib_ia64;
> +   unsigned int max_keylen = is_elfidx ? 1025 : MAX_KEYLEN;
>
>      /* Count the number of modules (and do a first sanity check).  */
>      nbr_modules = 0;
> ***************
> *** 2037,2043 ****
>           current != NULL;
>           current = current->archive_next, i++)
>        {
> !       int nl;
>
>          modules[i].abfd = current;
>          modules[i].name = vms_get_module_name (current->filename, FALSE);
> --- 2038,2044 ----
>           current != NULL;
>           current = current->archive_next, i++)
>        {
> !       unsigned int nl;
>
>          modules[i].abfd = current;
>          modules[i].name = vms_get_module_name (current->filename, FALSE);
> ***************
> *** 2045,2051 ****
>
>          /* FIXME: silently truncate long names ?  */
>          nl = strlen (modules[i].name);
> !       modules[i].namlen = (nl>  MAX_KEYLEN ? MAX_KEYLEN : nl);
>        }
>
>      /* Create the module index.  */
> --- 2046,2052 ----
>
>          /* FIXME: silently truncate long names ?  */
>          nl = strlen (modules[i].name);
> !       modules[i].namlen = (nl>  max_keylen ? max_keylen : nl);
>        }
>
>      /* Create the module index.  */
> ***************
> *** 2236,2255 ****
>        bfd_putl32 (nbr_modules, lhd->modcnt);
>        bfd_putl32 (nbr_modules, lhd->modhdrs);
>
>        bfd_putl32 (vbn - 1, lhd->hipreal);
>        bfd_putl32 (vbn - 1, lhd->hiprusd);
>
>        /* First index (modules name).  */
>        idd_flags = IDD__FLAGS_ASCII | IDD__FLAGS_VARLENIDX
>          | IDD__FLAGS_NOCASECMP | IDD__FLAGS_NOCASENTR;
>        bfd_putl16 (idd_flags, idd->flags);
> !     bfd_putl16 (MAX_KEYLEN, idd->keylen);
>        bfd_putl16 (mod_idx_vbn, idd->vbn);
>        idd++;
>
>        /* Second index (symbols name).  */
>        bfd_putl16 (idd_flags, idd->flags);
> !     bfd_putl16 (MAX_KEYLEN, idd->keylen);
>        bfd_putl16 (sym_idx_vbn, idd->vbn);
>        idd++;
>
> --- 2237,2263 ----
>        bfd_putl32 (nbr_modules, lhd->modcnt);
>        bfd_putl32 (nbr_modules, lhd->modhdrs);
>
> +     /* Number of blocks for index.  */
> +     bfd_putl32 (nbr_mod_iblk + nbr_sym_iblk, lhd->idxblks);
>        bfd_putl32 (vbn - 1, lhd->hipreal);
>        bfd_putl32 (vbn - 1, lhd->hiprusd);
>
> +     /* VBN of the next free block.  */
> +     bfd_putl32 ((off / VMS_BLOCK_SIZE) + 1, lhd->nextvbn);
> +     bfd_putl32 ((off / VMS_BLOCK_SIZE) + 1, lhd->nextrfa + 0);
> +     bfd_putl16 (0, lhd->nextrfa + 4);
> +
>        /* First index (modules name).  */
>        idd_flags = IDD__FLAGS_ASCII | IDD__FLAGS_VARLENIDX
>          | IDD__FLAGS_NOCASECMP | IDD__FLAGS_NOCASENTR;
>        bfd_putl16 (idd_flags, idd->flags);
> !     bfd_putl16 (max_keylen, idd->keylen);
>        bfd_putl16 (mod_idx_vbn, idd->vbn);
>        idd++;
>
>        /* Second index (symbols name).  */
>        bfd_putl16 (idd_flags, idd->flags);
> !     bfd_putl16 (max_keylen, idd->keylen);
>        bfd_putl16 (sym_idx_vbn, idd->vbn);
>        idd++;
>
>



More information about the Binutils mailing list