Subversion Repositories Kolibri OS

Rev

Rev 5191 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* Alpha VMS external format of Libraries.
  2.  
  3.    Copyright (C) 2010-2015 Free Software Foundation, Inc.
  4.    Written by Tristan Gingold <gingold@adacore.com>, AdaCore.
  5.  
  6.    This file is part of BFD, the Binary File Descriptor library.
  7.  
  8.    This program is free software; you can redistribute it and/or modify
  9.    it under the terms of the GNU General Public License as published by
  10.    the Free Software Foundation; either version 3 of the License, or
  11.    (at your option) any later version.
  12.  
  13.    This program is distributed in the hope that it will be useful,
  14.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.    GNU General Public License for more details.
  17.  
  18.    You should have received a copy of the GNU General Public License
  19.    along with this program; if not, write to the Free Software
  20.    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  21.    MA 02110-1301, USA.  */
  22.  
  23. #ifndef _VMS_LBR_H
  24. #define _VMS_LBR_H
  25.  
  26. /* Libray HeaDer.  */
  27.  
  28. /* Magic numbers.  Should match the major version.  */
  29.  
  30. #define LHD_SANEID_DCX 319232342
  31. #define LHD_SANEID3 233579905
  32. #define LHD_SANEID6 233579911
  33.  
  34. /* Library type.  */
  35. #define LBR__C_TYP_UNK    0     /* Unknown / unspecified.  */
  36. #define LBR__C_TYP_OBJ    1     /* Vax object.  */
  37. #define LBR__C_TYP_MLB    2     /* Macro.  */
  38. #define LBR__C_TYP_HLP    3     /* Help.  */
  39. #define LBR__C_TYP_TXT    4     /* Text.  */
  40. #define LBR__C_TYP_SHSTB  5     /* Vax shareable image.  */
  41. #define LBR__C_TYP_NCS    6     /* NCS.  */
  42. #define LBR__C_TYP_EOBJ   7     /* Alpha object.  */
  43. #define LBR__C_TYP_ESHSTB 8     /* Alpha shareable image.  */
  44. #define LBR__C_TYP_IOBJ   9     /* IA-64 object.  */
  45. #define LBR__C_TYP_ISHSTB 10    /* IA-64 shareable image.  */
  46.  
  47. struct vms_lhd
  48. {
  49.   /* Type of the library.  See above.  */
  50.   unsigned char type;
  51.  
  52.   /* Number of indexes.  Generally 1, 2 for object libraries.  */
  53.   unsigned char nindex;
  54.  
  55.   unsigned char fill_1[2];
  56.  
  57.   /* Sanity Id.  */
  58.   unsigned char sanity[4];
  59.  
  60.   /* Version.  */
  61.   unsigned char majorid[2];
  62.   unsigned char minorid[2];
  63.  
  64.   /* Tool name.  */
  65.   unsigned char lbrver[32];
  66.  
  67.   /* Create time.  */
  68.   unsigned char credat[8];
  69.  
  70.   /* Update time.  */
  71.   unsigned char updtim[8];
  72.  
  73.   /* Size of the MHD.  */
  74.   unsigned char mhdusz;
  75.  
  76.   unsigned char idxblkf[2];     /* Unused.  */
  77.   unsigned char fill_2;
  78.   unsigned char closerror[2];
  79.  
  80.   unsigned char spareword[2];
  81.  
  82.   /* First free block, and number of free blocks.  */
  83.   unsigned char freevbn[4];
  84.   unsigned char freeblk[4];
  85.  
  86.   unsigned char nextrfa[6];
  87.   unsigned char nextvbn[4];
  88.  
  89.   /* Free pre-allocated index block.  */
  90.   /* Number of free blocks.  */
  91.   unsigned char freidxblk[4];
  92.   /* VBN of a simply linked list of free blocks.  The list is terminated by a
  93.      nul VBN.  */
  94.   unsigned char freeidx[4];
  95.  
  96.   /* Highest pre-allocated index block and in use.  */
  97.   unsigned char hipreal[4];
  98.   unsigned char hiprusd[4];
  99.  
  100.   /* Number of index blocks in use.  */
  101.   unsigned char idxblks[4];
  102.  
  103.   /* Number of index entries.  */
  104.   unsigned char idxcnt[4];
  105.  
  106.   /* Number of modules entries.  */
  107.   unsigned char modcnt[4];
  108.  
  109.   unsigned char fill_3[2];
  110.  
  111.   /* Number of module headers.  */
  112.   unsigned char modhdrs[4];
  113.  
  114.   /* Overhead index pointers.  */
  115.   unsigned char idxovh[4];
  116.  
  117.   /* Update history records.  */
  118.   unsigned char maxluhrec[2];
  119.   unsigned char numluhrec[2];
  120.   unsigned char begluhrfa[6];
  121.   unsigned char endluhrfa[6];
  122.  
  123.   /* DCX map.  */
  124.   unsigned char dcxmapvbn[4];
  125.  
  126.   unsigned char fill_4[4 * 13];
  127. };
  128.  
  129. /* Known major ids.  */
  130. #define LBR_MAJORID 3           /* Alpha libraries.  */
  131. #define LBR_ELFMAJORID 6        /* Elf libraries (new index, new data).  */
  132.  
  133. /* Offset of the first IDD.  */
  134. #define LHD_IDXDESC 196
  135.  
  136. /* InDex Description.  */
  137. struct vms_idd
  138. {
  139.   unsigned char flags[2];
  140.  
  141.   /* Max length of the key.  */
  142.   unsigned char keylen[2];
  143.  
  144.   /* First index block.  */
  145.   unsigned char vbn[4];
  146. };
  147.  
  148. /* IDD flags.  */
  149. #define IDD__FLAGS_ASCII 1
  150. #define IDD__FLAGS_LOCKED 2
  151. #define IDD__FLAGS_VARLENIDX 4
  152. #define IDD__FLAGS_NOCASECMP 8
  153. #define IDD__FLAGS_NOCASENTR 16
  154. #define IDD__FLAGS_UPCASNTRY 32
  155.  
  156. #define IDD_LENGTH 8
  157.  
  158. /* Index block.  */
  159. #define INDEXDEF__LENGTH 512
  160. #define INDEXDEF__BLKSIZ 500
  161.  
  162. struct vms_indexdef
  163. {
  164.   /* Number of bytes used.  */
  165.   unsigned char used[2];
  166.  
  167.   /* VBN of the parent.  */
  168.   unsigned char parent[4];
  169.  
  170.   unsigned char fill_1[6];
  171.  
  172.   /* The key field contains vms_idx/vms_elfidx structures, which are
  173.      simply a key (= a string) and a rfa.  */
  174.   unsigned char keys[INDEXDEF__BLKSIZ];
  175. };
  176.  
  177. /* An offset in a file.  */
  178.  
  179. struct vms_rfa
  180. {
  181.   /* Logical block number, 1 based.
  182.      0 means that the field is absent.  Block size is 512.  */
  183.   unsigned char vbn[4];
  184.  
  185.   /* Offset within the block.  */
  186.   unsigned char offset[2];
  187. };
  188.  
  189. /* Index keys.  For version 3.  */
  190.  
  191. struct vms_idx
  192. {
  193.   /* Offset from the start of the vbn, so minimum should be
  194.      DATA__DATA (ie 6).  */
  195.   struct vms_rfa rfa;
  196.  
  197.   unsigned char keylen;
  198.   /* The length of this field is in fact keylen.  */
  199.   unsigned char keyname[256];
  200. };
  201.  
  202. /* Index keys, for version 4 and later.  */
  203.  
  204. struct vms_elfidx
  205. {
  206.   struct vms_rfa rfa;
  207.  
  208.   unsigned char keylen[2];
  209.   unsigned char flags;
  210.   unsigned char keyname[256];
  211. };
  212.  
  213. /* Flags of elfidx.  */
  214.  
  215. #define ELFIDX__WEAK 0x01       /* Weak symbol.  */
  216. #define ELFIDX__GROUP 0x02      /* Group symbol.  */
  217. #define ELFIDX__LISTRFA 0x04    /* RFA field points to an LHS.  */
  218. #define ELFIDX__SYMESC 0x08     /* Long symbol.  */
  219.  
  220. #define RFADEF__C_INDEX 0xffff
  221.  
  222. /* List head structure.  That's what is pointed by rfa when LISTRFA flag
  223.    is set in elfidx.  */
  224.  
  225. struct vms_lhs
  226. {
  227.   struct vms_rfa ng_g_rfa;      /* Non-group global.  */
  228.   struct vms_rfa ng_wk_rfa;     /* Non-group weak.  */
  229.   struct vms_rfa g_g_rfa;       /* Group global.  */
  230.   struct vms_rfa g_wk_rfa;      /* Group weak.  */
  231.   unsigned char flags;
  232. };
  233.  
  234. /* List node structure.  Fields of LHS point to this structure.  */
  235.  
  236. struct vms_lns
  237. {
  238.   /* Next node in the list.  */
  239.   struct vms_rfa nxtrfa;
  240.  
  241.   /* Module associated with the key.  */
  242.   struct vms_rfa modrfa;
  243. };
  244.  
  245. struct vms_datadef
  246. {
  247.   /* Number of records in this block.  */
  248.   unsigned char recs;
  249.   unsigned char fill_1;
  250.  
  251.   /* Next vbn.  */
  252.   unsigned char link[4];
  253.  
  254.   /* Data.  The first word is the record length, followed by record
  255.      data and a possible pad byte so that record length is always aligned.  */
  256.   unsigned char data[506];
  257. };
  258. #define DATA__LENGTH 512
  259. #define DATA__DATA 6
  260.  
  261. /* Key name block.  This is used for keys longer than 128 bytes.  */
  262.  
  263. struct vms_kbn
  264. {
  265.   /* Length of the key chunk.  */
  266.   unsigned char keylen[2];
  267.  
  268.   /* RFA of the next chunk.  */
  269.   struct vms_rfa rfa;
  270.  
  271.   /* Followed by the key chunk.  */
  272. };
  273.  
  274. /* Module header.  */
  275. struct vms_mhd
  276. {
  277.   /* Fixed part.  */
  278.   unsigned char lbrflag;
  279.   unsigned char id;
  280.   unsigned char fill_1[2];
  281.   unsigned char refcnt[4];
  282.   unsigned char datim[8];
  283.  
  284.   unsigned char objstat;
  285.   /* Ident or GSMATCH.  */
  286.   unsigned char objidlng;
  287.   unsigned char objid[31];
  288.  
  289.   unsigned char pad1[3];
  290.   unsigned char otherefcnt[4];
  291.   unsigned char modsize[4];
  292.   unsigned char pad2[4];
  293. };
  294.  
  295. #define MHD__C_MHDID 0xad       /* Value for id.  */
  296. #define MHD__C_MHDLEN 16        /* Fixed part length.  */
  297. #define MHD__C_USRDAT 16
  298.  
  299. /* Flags for objstat.  */
  300. #define MHD__M_SELSRC 0x1       /* Selective search.  */
  301. #define MHD__M_OBJTIR 0x2
  302. #define MHD__M_WKSYM  0x4
  303.  
  304. struct vms_luh
  305. {
  306.   unsigned char nxtluhblk[4];
  307.   unsigned char spare[2];
  308.   unsigned char data[506];
  309. };
  310.  
  311. struct vms_luhdef
  312. {
  313.   unsigned char rechdr[2];
  314.   unsigned char reclen[2];
  315. };
  316. #define LUH__RECHDRLEN 4
  317. #define LUH__RECHDRMRK 0xabba
  318. #define LUH__DATAFLDLEN 506
  319.  
  320. /* Entry in the history.  */
  321.  
  322. struct vms_leh
  323. {
  324.   unsigned char date[8];
  325.   unsigned char nbr_units[2];
  326.   unsigned char action[2]; /* 1: delete, 2: insert, 3: replaced.  */
  327.   unsigned char idlen;
  328.   /* username
  329.      modules... */
  330. };
  331.  
  332. #endif /* _VMS_LBR_H */
  333.