00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "bfd.h"
00033 #include "bfdver.h"
00034 #include "sysdep.h"
00035 #include "bfdlink.h"
00036 #include "safe-ctype.h"
00037 #include "libbfd.h"
00038
00039 #include "vms.h"
00040
00041 #ifdef HAVE_ALLOCA_H
00042 #include <alloca.h>
00043 #endif
00044
00045 static unsigned char *get_vms_time_string PARAMS ((void));
00046
00047
00048
00049
00050
00051
00052
00053 int
00054 _bfd_vms_slurp_hdr (abfd, objtype)
00055 bfd *abfd;
00056 int objtype;
00057 {
00058 unsigned char *ptr;
00059 unsigned char *vms_rec;
00060 int subtype;
00061
00062 vms_rec = PRIV(vms_rec);
00063
00064 #if VMS_DEBUG
00065 vms_debug(2, "HDR/EMH\n");
00066 #endif
00067
00068 switch (objtype)
00069 {
00070 case OBJ_S_C_HDR:
00071 subtype = vms_rec[1];
00072 break;
00073 case EOBJ_S_C_EMH:
00074 subtype = bfd_getl16 (vms_rec + 4) + EVAX_OFFSET;
00075 break;
00076 default:
00077 subtype = -1;
00078 }
00079
00080 #if VMS_DEBUG
00081 vms_debug(3, "subtype %d\n", subtype);
00082 #endif
00083
00084 switch (subtype)
00085 {
00086
00087 case MHD_S_C_MHD:
00088
00089
00090
00091 PRIV(hdr_data).hdr_b_strlvl = vms_rec[2];
00092 PRIV(hdr_data).hdr_l_recsiz = bfd_getl16 (vms_rec + 3);
00093 PRIV(hdr_data).hdr_t_name = _bfd_vms_save_counted_string (vms_rec + 5);
00094 ptr = vms_rec + 5 + vms_rec[5] + 1;
00095 PRIV(hdr_data).hdr_t_version = _bfd_vms_save_counted_string (ptr);
00096 ptr += *ptr + 1;
00097 PRIV(hdr_data).hdr_t_date = _bfd_vms_save_sized_string (ptr, 17);
00098
00099 break;
00100
00101 case MHD_S_C_LNM:
00102
00103
00104
00105 PRIV(hdr_data).hdr_c_lnm = _bfd_vms_save_sized_string (vms_rec, PRIV(rec_length-2));
00106 break;
00107
00108 case MHD_S_C_SRC:
00109
00110
00111
00112 PRIV(hdr_data).hdr_c_src = _bfd_vms_save_sized_string (vms_rec, PRIV(rec_length-2));
00113 break;
00114
00115 case MHD_S_C_TTL:
00116
00117
00118
00119 PRIV(hdr_data).hdr_c_ttl = _bfd_vms_save_sized_string (vms_rec, PRIV(rec_length-2));
00120 break;
00121
00122 case MHD_S_C_CPR:
00123
00124
00125
00126 break;
00127
00128 case MHD_S_C_MTC:
00129
00130
00131
00132 break;
00133
00134 case MHD_S_C_GTX:
00135
00136
00137
00138 break;
00139
00140 case EMH_S_C_MHD + EVAX_OFFSET:
00141
00142
00143
00144 PRIV(hdr_data).hdr_b_strlvl = vms_rec[6];
00145 PRIV(hdr_data).hdr_l_arch1 = bfd_getl32 (vms_rec + 8);
00146 PRIV(hdr_data).hdr_l_arch2 = bfd_getl32 (vms_rec + 12);
00147 PRIV(hdr_data).hdr_l_recsiz = bfd_getl32 (vms_rec + 16);
00148 PRIV(hdr_data).hdr_t_name =
00149 _bfd_vms_save_counted_string (vms_rec + 20);
00150 ptr = vms_rec + 20 + vms_rec[20] + 1;
00151 PRIV(hdr_data).hdr_t_version =
00152 _bfd_vms_save_counted_string (ptr);
00153 ptr += *ptr + 1;
00154 PRIV(hdr_data).hdr_t_date =
00155 _bfd_vms_save_sized_string (ptr, 17);
00156
00157 break;
00158
00159 case EMH_S_C_LNM + EVAX_OFFSET:
00160
00161
00162
00163 PRIV(hdr_data).hdr_c_lnm =
00164 _bfd_vms_save_sized_string (vms_rec, PRIV(rec_length-6));
00165 break;
00166
00167 case EMH_S_C_SRC + EVAX_OFFSET:
00168
00169
00170
00171 PRIV(hdr_data).hdr_c_src =
00172 _bfd_vms_save_sized_string (vms_rec, PRIV(rec_length-6));
00173 break;
00174
00175 case EMH_S_C_TTL + EVAX_OFFSET:
00176
00177
00178
00179 PRIV(hdr_data).hdr_c_ttl =
00180 _bfd_vms_save_sized_string (vms_rec, PRIV(rec_length-6));
00181 break;
00182
00183 case EMH_S_C_CPR + EVAX_OFFSET:
00184
00185
00186
00187 break;
00188
00189 case EMH_S_C_MTC + EVAX_OFFSET:
00190
00191
00192
00193 break;
00194
00195 case EMH_S_C_GTX + EVAX_OFFSET:
00196
00197
00198
00199 break;
00200
00201 default:
00202 bfd_set_error (bfd_error_wrong_format);
00203 return -1;
00204
00205 }
00206
00207 return 0;
00208 }
00209
00210
00211
00212
00213
00214
00215
00216 static unsigned char *
00217 get_vms_time_string ()
00218 {
00219 static unsigned char tbuf[18];
00220 #ifndef VMS
00221 #include <time.h>
00222
00223 char *pnt;
00224 time_t timeb;
00225 time (&timeb);
00226 pnt = ctime (&timeb);
00227 pnt[3] = 0;
00228 pnt[7] = 0;
00229 pnt[10] = 0;
00230 pnt[16] = 0;
00231 pnt[24] = 0;
00232 sprintf ((char *) tbuf, "%2s-%3s-%s %s",
00233 pnt + 8, pnt + 4, pnt + 20, pnt + 11);
00234 #else
00235 #include <starlet.h>
00236 struct
00237 {
00238 int Size;
00239 unsigned char *Ptr;
00240 } Descriptor;
00241 Descriptor.Size = 17;
00242 Descriptor.Ptr = tbuf;
00243 SYS$ASCTIM (0, &Descriptor, 0, 0);
00244 #endif
00245
00246 #if VMS_DEBUG
00247 vms_debug (6, "vmstimestring:'%s'\n", tbuf);
00248 #endif
00249
00250 return tbuf;
00251 }
00252
00253
00254
00255 int
00256 _bfd_vms_write_hdr (abfd, objtype)
00257 bfd *abfd;
00258 int objtype;
00259 {
00260 asymbol *symbol;
00261 unsigned int symnum;
00262 int had_case = 0;
00263 int had_file = 0;
00264
00265 #if VMS_DEBUG
00266 vms_debug (2, "vms_write_hdr (%p)\n", abfd);
00267 #endif
00268
00269 _bfd_vms_output_alignment (abfd, 2);
00270
00271
00272
00273 if (objtype == OBJ_S_C_HDR)
00274 {
00275 }
00276 else
00277 {
00278 _bfd_vms_output_begin (abfd, EOBJ_S_C_EMH, EMH_S_C_MHD);
00279 _bfd_vms_output_short (abfd, EOBJ_S_C_STRLVL);
00280 _bfd_vms_output_long (abfd, 0);
00281 _bfd_vms_output_long (abfd, 0);
00282 _bfd_vms_output_long (abfd, MAX_OUTREC_SIZE);
00283 }
00284
00285 if (bfd_get_filename (abfd) != 0)
00286 {
00287
00288
00289 char *fname, *fout, *fptr;
00290
00291 fptr = bfd_get_filename (abfd);
00292 fname = (char *) alloca (strlen (fptr) + 1);
00293 strcpy (fname, fptr);
00294 fout = strrchr (fname, ']');
00295 if (fout == 0)
00296 fout = strchr (fname, ':');
00297 if (fout != 0)
00298 fout++;
00299 else
00300 fout = fname;
00301
00302
00303
00304 fptr = strrchr (fname, '.');
00305 if ((fptr != 0)
00306 && (strcasecmp (fptr, ".OBJ") == 0))
00307 *fptr = 0;
00308
00309 fptr = fout;
00310 while (*fptr != 0)
00311 {
00312 *fptr = TOUPPER (*fptr);
00313 fptr++;
00314 if ((*fptr == ';')
00315 || ((fptr - fout) > 31))
00316 *fptr = 0;
00317 }
00318 _bfd_vms_output_counted (abfd, fout);
00319 }
00320 else
00321 _bfd_vms_output_counted (abfd, "NONAME");
00322
00323 _bfd_vms_output_counted (abfd, BFD_VERSION_STRING);
00324 _bfd_vms_output_dump (abfd, get_vms_time_string (), 17);
00325 _bfd_vms_output_fill (abfd, 0, 17);
00326 _bfd_vms_output_flush (abfd);
00327
00328
00329
00330 _bfd_vms_output_begin (abfd, EOBJ_S_C_EMH, EMH_S_C_LNM);
00331 _bfd_vms_output_dump (abfd, (unsigned char *)"GAS proGIS", 10);
00332 _bfd_vms_output_flush (abfd);
00333
00334
00335
00336 _bfd_vms_output_begin (abfd, EOBJ_S_C_EMH, EMH_S_C_SRC);
00337
00338 for (symnum = 0; symnum < abfd->symcount; symnum++)
00339 {
00340 symbol = abfd->outsymbols[symnum];
00341
00342 if (symbol->flags & BSF_FILE)
00343 {
00344 if (strncmp ((char *)symbol->name, "<CASE:", 6) == 0)
00345 {
00346 PRIV(flag_hash_long_names) = symbol->name[6] - '0';
00347 PRIV(flag_show_after_trunc) = symbol->name[7] - '0';
00348
00349 if (had_file)
00350 break;
00351 had_case = 1;
00352 continue;
00353 }
00354
00355 _bfd_vms_output_dump (abfd, (unsigned char *) symbol->name,
00356 (int) strlen (symbol->name));
00357 if (had_case)
00358 break;
00359 had_file = 1;
00360 }
00361 }
00362
00363 if (symnum == abfd->symcount)
00364 _bfd_vms_output_dump (abfd, (unsigned char *)"noname", 6);
00365
00366 _bfd_vms_output_flush (abfd);
00367
00368
00369
00370 _bfd_vms_output_begin (abfd, EOBJ_S_C_EMH, EMH_S_C_TTL);
00371 _bfd_vms_output_dump (abfd, (unsigned char *)"TTL", 3);
00372 _bfd_vms_output_flush (abfd);
00373
00374
00375
00376 _bfd_vms_output_begin (abfd, EOBJ_S_C_EMH, EMH_S_C_CPR);
00377 _bfd_vms_output_dump (abfd,
00378 (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
00379 39);
00380 _bfd_vms_output_flush (abfd);
00381
00382 return 0;
00383 }
00384
00385
00386
00387
00388
00389
00390 int
00391 _bfd_vms_slurp_eom (abfd, objtype)
00392 bfd *abfd;
00393 int objtype;
00394 {
00395 unsigned char *vms_rec;
00396
00397 #if VMS_DEBUG
00398 vms_debug(2, "EOM/EEOM\n");
00399 #endif
00400
00401 vms_rec = PRIV(vms_rec);
00402
00403 if ((objtype == OBJ_S_C_EOM)
00404 || (objtype == OBJ_S_C_EOMW))
00405 {
00406 }
00407 else
00408 {
00409 PRIV(eom_data).eom_l_total_lps = bfd_getl32 (vms_rec + 4);
00410 PRIV(eom_data).eom_b_comcod = *(vms_rec + 8);
00411 if (PRIV(eom_data).eom_b_comcod > 1)
00412 {
00413 (*_bfd_error_handler) (_("Object module NOT error-free !\n"));
00414 bfd_set_error (bfd_error_bad_value);
00415 return -1;
00416 }
00417 PRIV(eom_data).eom_has_transfer = FALSE;
00418 if (PRIV(rec_size) > 10)
00419 {
00420 PRIV(eom_data).eom_has_transfer = TRUE;
00421 PRIV(eom_data).eom_b_tfrflg = *(vms_rec + 9);
00422 PRIV(eom_data).eom_l_psindx = bfd_getl32 (vms_rec + 12);
00423 PRIV(eom_data).eom_l_tfradr = bfd_getl32 (vms_rec + 16);
00424
00425 abfd->start_address = PRIV(eom_data).eom_l_tfradr;
00426 }
00427 }
00428 return 0;
00429 }
00430
00431
00432
00433 int
00434 _bfd_vms_write_eom (abfd, objtype)
00435 bfd *abfd;
00436 int objtype;
00437 {
00438 #if VMS_DEBUG
00439 vms_debug (2, "vms_write_eom (%p, %d)\n", abfd, objtype);
00440 #endif
00441
00442 _bfd_vms_output_begin (abfd, objtype, -1);
00443 _bfd_vms_output_long (abfd, (unsigned long) (PRIV(vms_linkage_index) >> 1));
00444 _bfd_vms_output_byte (abfd, 0);
00445 _bfd_vms_output_byte (abfd, 0);
00446
00447 if (bfd_get_start_address (abfd) != (bfd_vma)-1)
00448 {
00449 asection *section;
00450
00451 section = bfd_get_section_by_name (abfd, ".link");
00452 if (section == 0)
00453 {
00454 bfd_set_error (bfd_error_nonrepresentable_section);
00455 return -1;
00456 }
00457 _bfd_vms_output_short (abfd, 0);
00458 _bfd_vms_output_long (abfd, (unsigned long) (section->index));
00459 _bfd_vms_output_long (abfd,
00460 (unsigned long) bfd_get_start_address (abfd));
00461 _bfd_vms_output_long (abfd, 0);
00462 }
00463
00464 _bfd_vms_output_end (abfd);
00465 return 0;
00466 }