1$! MKSHARED.COM -- Create shareable images. 2$! 3$! P1: "64" for 64-bit pointers. 4$! 5$! P2: Zlib object library path (optional). 6$! 7$! Input: [.UTIL]LIBEAY.NUM,[.xxx.EXE.CRYPTO]SSL_LIBCRYPTO[32].OLB 8$! [.UTIL]SSLEAY.NUM,[.xxx.EXE.SSL]SSL_LIBSSL[32].OLB 9$! [.CRYPTO.xxx]OPENSSLCONF.H 10$! Output: [.xxx.EXE.CRYPTO]SSL_LIBCRYPTO_SHR[32].OPT,.MAP,.EXE 11$! [.xxx.EXE.SSL]SSL_LIBSSL_SRH[32].OPT,.MAP,.EXE 12$! 13$! So far, tests have only been made on VMS for Alpha. VAX will come in time. 14$! =========================================================================== 15$! 16$! Announce/identify. 17$! 18$ proc = f$environment( "procedure") 19$ write sys$output "@@@ "+ - 20 f$parse( proc, , , "name")+ f$parse( proc, , , "type") 21$! 22$! Save the original default device:[directory]. 23$! 24$ def_orig = f$environment( "default") 25$ on error then goto tidy 26$ on control_c then goto tidy 27$! 28$! SET DEFAULT to the main kit directory. 29$! 30$ proc = f$environment("procedure") 31$ proc = f$parse( "A.;", proc)- "A.;" 32$ set default 'proc' 33$ set default [-] 34$! 35$! ----- Prepare info for processing: version number and file info 36$ gosub read_version_info 37$ if libver .eqs. "" 38$ then 39$ write sys$error "ERROR: Couldn't find any library version info..." 40$ go to tidy: 41$ endif 42$ 43$ if (f$getsyi("cpu") .lt. 128) 44$ then 45$ arch_vax = 1 46$ arch = "VAX" 47$ else 48$ arch_vax = 0 49$ arch = f$edit( f$getsyi( "ARCH_NAME"), "UPCASE") 50$ if (arch .eqs. "") then arch = "UNK" 51$ endif 52$! 53$ archd = arch 54$ lib32 = "32" 55$ shr = "SHR32" 56$! 57$ if (p1 .nes. "") 58$ then 59$ if (p1 .eqs. "64") 60$ then 61$ archd = arch+ "_64" 62$ lib32 = "" 63$ shr = "SHR" 64$ else 65$ if (p1 .nes. "32") 66$ then 67$ write sys$output "Second argument invalid." 68$ write sys$output "It should be "32", "64", or nothing." 69$ exit 70$ endif 71$ endif 72$ endif 73$! 74$! ----- Prepare info for processing: disabled algorithms info 75$ gosub read_disabled_algorithms_info 76$! 77$ ZLIB = p2 78$ zlib_lib = "" 79$ if (ZLIB .nes. "") 80$ then 81$ file2 = f$parse( ZLIB, "libz.olb", , , "syntax_only") 82$ if (f$search( file2) .eqs. "") 83$ then 84$ write sys$output "" 85$ write sys$output "The Option ", ZLIB, " Is Invalid." 86$ write sys$output " Can't find library: ''file2'" 87$ write sys$output "" 88$ goto tidy 89$ endif 90$ zlib_lib = ", ''file2' /library" 91$ endif 92$! 93$ if (arch_vax) 94$ then 95$ libtit = "CRYPTO_TRANSFER_VECTOR" 96$ libid = "Crypto" 97$ libnum = "[.UTIL]LIBEAY.NUM" 98$ libdir = "[.''ARCHD'.EXE.CRYPTO]" 99$ libmar = "''libdir'SSL_LIBCRYPTO_''shr'.MAR" 100$ libolb = "''libdir'SSL_LIBCRYPTO''lib32'.OLB" 101$ libopt = "''libdir'SSL_LIBCRYPTO_''shr'.OPT" 102$ libobj = "''libdir'SSL_LIBCRYPTO_''shr'.OBJ" 103$ libmap = "''libdir'SSL_LIBCRYPTO_''shr'.MAP" 104$ libgoal= "''libdir'SSL_LIBCRYPTO_''shr'.EXE" 105$ libref = "" 106$ libvec = "LIBCRYPTO" 107$ if f$search( libolb) .nes. "" then gosub create_vax_shr 108$ libtit = "SSL_TRANSFER_VECTOR" 109$ libid = "SSL" 110$ libnum = "[.UTIL]SSLEAY.NUM" 111$ libdir = "[.''ARCHD'.EXE.SSL]" 112$ libmar = "''libdir'SSL_LIBSSL_''shr'.MAR" 113$ libolb = "''libdir'SSL_LIBSSL''lib32'.OLB" 114$ libopt = "''libdir'SSL_LIBSSL_''shr'.OPT" 115$ libobj = "''libdir'SSL_LIBSSL_''shr'.OBJ" 116$ libmap = "''libdir'SSL_LIBSSL_''shr'.MAP" 117$ libgoal= "''libdir'SSL_LIBSSL_''shr'.EXE" 118$ libref = "[.''ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO_''shr'.EXE" 119$ libvec = "LIBSSL" 120$ if f$search( libolb) .nes. "" then gosub create_vax_shr 121$ else 122$ libid = "Crypto" 123$ libnum = "[.UTIL]LIBEAY.NUM" 124$ libdir = "[.''ARCHD'.EXE.CRYPTO]" 125$ libolb = "''libdir'SSL_LIBCRYPTO''lib32'.OLB" 126$ libopt = "''libdir'SSL_LIBCRYPTO_''shr'.OPT" 127$ libmap = "''libdir'SSL_LIBCRYPTO_''shr'.MAP" 128$ libgoal= "''libdir'SSL_LIBCRYPTO_''shr'.EXE" 129$ libref = "" 130$ if f$search( libolb) .nes. "" then gosub create_nonvax_shr 131$ libid = "SSL" 132$ libnum = "[.UTIL]SSLEAY.NUM" 133$ libdir = "[.''ARCHD'.EXE.SSL]" 134$ libolb = "''libdir'SSL_LIBSSL''lib32'.OLB" 135$ libopt = "''libdir'SSL_LIBSSL_''shr'.OPT" 136$ libmap = "''libdir'SSL_LIBSSL_''shr'.MAP" 137$ libgoal= "''libdir'SSL_LIBSSL_''shr'.EXE" 138$ libref = "[.''ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO_''shr'.EXE" 139$ if f$search( libolb) .nes. "" then gosub create_nonvax_shr 140$ endif 141$! 142$ tidy: 143$! 144$! Close any open files. 145$! 146$ if (f$trnlnm( "libnum", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then - 147 close libnum 148$! 149$ if (f$trnlnm( "mar", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then - 150 close mar 151$! 152$ if (f$trnlnm( "opt", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then - 153 close opt 154$! 155$ if (f$trnlnm( "vf", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then - 156 close vf 157$! 158$! Restore the original default device:[directory]. 159$! 160$ set default 'def_orig' 161$ exit 162$ 163$! ----- Subroutines to build the shareable libraries 164$! For each supported architecture, there's a main shareable library 165$! creator, which is called from the main code above. 166$! The creator will define a number of variables to tell the next levels of 167$! subroutines what routines to use to write to the option files, call the 168$! main processor, read_func_num, and when that is done, it will write version 169$! data at the end of the .opt file, close it, and link the library. 170$! 171$! read_func_num reads through a .num file and calls the writer routine for 172$! each line. It's also responsible for checking that order is properly kept 173$! in the .num file, check that each line applies to VMS and the architecture, 174$! and to fill in "holes" with dummy entries. 175$! 176$! The creator routines depend on the following variables: 177$! libnum The name of the .num file to use as input 178$! libolb The name of the object library to build from 179$! libid The identification string of the shareable library 180$! libopt The name of the .opt file to write 181$! libtit The title of the assembler transfer vector file (VAX only) 182$! libmar The name of the assembler transfer vector file (VAX only) 183$! libmap The name of the map file to write 184$! libgoal The name of the shareable library to write 185$! libref The name of a shareable library to link in 186$! 187$! read_func_num depends on the following variables from the creator: 188$! libwriter The name of the writer routine to call for each .num file line 189$! ----- 190$ 191$! ----- Subroutines for non-VAX 192$! ----- 193$! The creator routine 194$ create_nonvax_shr: 195$ open /write opt 'libopt' 196$ write opt "identification=""",libid," ",libverstr,"""" 197$ write opt libolb, " /library" 198$ if libref .nes. "" then write opt libref,"/SHARE" 199$ write opt "SYMBOL_VECTOR=(-" 200$ libfirstentry := true 201$ libwrch := opt 202$ libwriter := write_nonvax_transfer_entry 203$ textcount = 0 204$ gosub read_func_num 205$ write opt ")" 206$ write opt "GSMATCH=",libvmatch,",",libver 207$ close opt 208$ link /map = 'libmap' /full /share = 'libgoal' 'libopt' /options - 209 'zlib_lib' 210$ return 211$ 212$! The record writer routine 213$ write_nonvax_transfer_entry: 214$ if libentry .eqs. ".dummy" then return 215$ if info_kind .eqs. "VARIABLE" 216$ then 217$ pr:=DATA 218$ else 219$ pr:=PROCEDURE 220$ endif 221$ textcount_this = f$length(pr) + f$length(libentry) + 5 222$ if textcount + textcount_this .gt. 1024 223$ then 224$ write opt ")" 225$ write opt "SYMBOL_VECTOR=(-" 226$ textcount = 16 227$ libfirstentry := true 228$ endif 229$ if libfirstentry 230$ then 231$ write 'libwrch' " ",libentry,"=",pr," -" 232$ else 233$ write 'libwrch' " ,",libentry,"=",pr," -" 234$ endif 235$ libfirstentry := false 236$ textcount = textcount + textcount_this 237$ return 238$ 239$! ----- Subroutines for VAX 240$! ----- 241$! The creator routine 242$ create_vax_shr: 243$ open /write mar 'libmar' 244$ type sys$input:/out=mar: 245; 246; Transfer vector for VAX shareable image 247; 248$ write mar " .TITLE ",libtit 249$ write mar " .IDENT /",libid,"/" 250$ type sys$input:/out=mar: 251; 252; Define macro to assist in building transfer vector entries. Each entry 253; should take no more than 8 bytes. 254; 255 .MACRO FTRANSFER_ENTRY routine 256 .ALIGN QUAD 257 .TRANSFER routine 258 .MASK routine 259 JMP routine+2 260 .ENDM FTRANSFER_ENTRY 261; 262; Place entries in own program section. 263; 264$ write mar " .PSECT $$",libvec,",QUAD,PIC,USR,CON,REL,LCL,SHR,EXE,RD,NOWRT" 265$ write mar libvec,"_xfer:" 266$ libwrch := mar 267$ libwriter := write_vax_ftransfer_entry 268$ gosub read_func_num 269$ type sys$input:/out=mar: 270; 271; Allocate extra storage at end of vector to allow for expansion. 272; 273$ write mar " .BLKB 32768-<.-",libvec,"_xfer> ; 64 pages total." 274$! libwriter := write_vax_vtransfer_entry 275$! gosub read_func_num 276$ write mar " .END" 277$ close mar 278$ open /write opt 'libopt' 279$ write opt "identification=""",libid," ",libverstr,"""" 280$ write opt libobj 281$ write opt libolb, " /library" 282$ if libref .nes. "" then write opt libref,"/SHARE" 283$ type sys$input:/out=opt: 284! 285! Ensure transfer vector is at beginning of image 286! 287CLUSTER=FIRST 288$ write opt "COLLECT=FIRST,$$",libvec 289$ write opt "GSMATCH=",libvmatch,",",libver 290$ type sys$input:/out=opt: 291! 292! make psects nonshareable so image can be installed. 293! 294PSECT_ATTR=$CHAR_STRING_CONSTANTS,NOWRT 295$ libwrch := opt 296$ libwriter := write_vax_psect_attr 297$ gosub read_func_num 298$ close opt 299$ macro/obj='libobj' 'libmar' 300$ link /map = 'libmap' /full /share = 'libgoal' 'libopt' /options - 301 'zlib_lib' 302$ return 303$ 304$! The record writer routine for VAX functions 305$ write_vax_ftransfer_entry: 306$ if info_kind .nes. "FUNCTION" then return 307$ if libentry .eqs ".dummy" 308$ then 309$ write 'libwrch' " .BLKB 8" ! Dummy is zeroes... 310$ else 311$ write 'libwrch' " FTRANSFER_ENTRY ",libentry 312$ endif 313$ return 314$! The record writer routine for VAX variables (should never happen!) 315$ write_vax_psect_attr: 316$ if info_kind .nes. "VARIABLE" then return 317$ if libentry .eqs ".dummy" then return 318$ write 'libwrch' "PSECT_ATTR=",libentry,",NOSHR" 319$ return 320$ 321$! ----- Common subroutines 322$! ----- 323$! The .num file reader. This one has great responsibility. 324$ read_func_num: 325$ open /read libnum 'libnum' 326$ goto read_nums 327$ 328$ read_nums: 329$ libentrynum=0 330$ liblastentry:=false 331$ entrycount=0 332$ loop: 333$ read /end=loop_end /err=loop_end libnum line 334$ lin = f$edit( line, "COMPRESS,TRIM") 335$! Skip a "#" comment line. 336$ if (f$extract( 0, 1, lin) .eqs. "#") then goto loop 337$ entrynum = f$int(f$element( 1, " ", lin)) 338$ entryinfo = f$element( 2, " ", lin) 339$ curentry = f$element( 0, " ", lin) 340$ info_exist = f$element( 0, ":", entryinfo) 341$ info_platforms = ","+ f$element(1, ":", entryinfo)+ "," 342$ info_kind = f$element( 2, ":", entryinfo) 343$ info_algorithms = ","+ f$element( 3, ":", entryinfo)+ "," 344$ if info_exist .eqs. "NOEXIST" then goto loop 345$ truesum = 0 346$ falsesum = 0 347$ negatives = 1 348$ plat_i = 0 349$ loop1: 350$ plat_entry = f$element( plat_i, ",", info_platforms) 351$ plat_i = plat_i + 1 352$ if plat_entry .eqs. "" then goto loop1 353$ if plat_entry .nes. "," 354$ then 355$ if f$extract(0,1,plat_entry) .nes. "!" then negatives = 0 356$ if (arch_vax) 357$ then 358$ if plat_entry .eqs. "EXPORT_VAR_AS_FUNCTION" then - 359$ truesum = truesum + 1 360$ if plat_entry .eqs. "!EXPORT_VAR_AS_FUNCTION" then - 361$ falsesum = falsesum + 1 362$ endif 363$! 364$ if ((plat_entry .eqs. "VMS") .or. - 365 ((plat_entry .eqs. "ZLIB") .and. (ZLIB .nes. "")) .or. - 366 (arch_vax .and. (plat_entry .eqs. "VMSVAX"))) then - 367 truesum = truesum + 1 368$! 369$ if ((plat_entry .eqs. "!VMS") .or. - 370 (arch_vax .and. (plat_entry .eqs. "!VMSVAX"))) then - 371 falsesum = falsesum + 1 372$! 373$ goto loop1 374$ endif 375$ endloop1: 376$!DEBUG!$ if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms 377$!DEBUG!$ then 378$!DEBUG!$ write sys$output line 379$!DEBUG!$ write sys$output " truesum = ",truesum,- 380$!DEBUG! ", negatives = ",negatives,", falsesum = ",falsesum 381$!DEBUG!$ endif 382$ if falsesum .ne. 0 then goto loop 383$ if truesum+negatives .eq. 0 then goto loop 384$ alg_i = 0 385$ loop2: 386$ alg_entry = f$element(alg_i,",",info_algorithms) 387$ alg_i = alg_i + 1 388$ if alg_entry .eqs. "" then goto loop2 389$ if alg_entry .nes. "," 390$ then 391$ if disabled_algorithms - ("," + alg_entry + ",") .nes disabled_algorithms then goto loop 392$ if f$trnlnm("OPENSSL_NO_"+alg_entry) .nes. "" then goto loop 393$ goto loop2 394$ endif 395$ endloop2: 396$ if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms 397$ then 398$!DEBUG!$ write sys$output curentry," ; ",entrynum," ; ",entryinfo 399$ endif 400$ redo: 401$ next:=loop 402$ tolibentry=curentry 403$ if libentrynum .ne. entrynum 404$ then 405$ entrycount=entrycount+1 406$ if entrycount .lt. entrynum 407$ then 408$!DEBUG!$ write sys$output "Info: entrycount: ''entrycount', entrynum: ''entrynum' => 0" 409$ tolibentry=".dummy" 410$ next:=redo 411$ endif 412$ if entrycount .gt. entrynum 413$ then 414$ write sys$error "Decreasing library entry numbers! Can't continue" 415$ write sys$error """",line,"""" 416$ close libnum 417$ return 418$ endif 419$ libentry=tolibentry 420$!DEBUG!$ write sys$output entrycount," ",libentry," ",entryinfo 421$ if libentry .nes. "" .and. libwriter .nes. "" then gosub 'libwriter' 422$ else 423$ write sys$error "Info: ""''curentry'"" is an alias for ""''libentry'"". Overriding..." 424$ endif 425$ libentrynum=entrycount 426$ goto 'next' 427$ loop_end: 428$ close libnum 429$ return 430$ 431$! The version number reader 432$ read_version_info: 433$ libver = "" 434$ open /read vf [.CRYPTO]OPENSSLV.H 435$ loop_rvi: 436$ read/err=endloop_rvi/end=endloop_rvi vf rvi_line 437$ if rvi_line - "SHLIB_VERSION_NUMBER """ .eqs. rvi_line then - 438 goto loop_rvi 439$ libverstr = f$element(1,"""",rvi_line) 440$ libvmajor = f$element(0,".",libverstr) 441$ libvminor = f$element(1,".",libverstr) 442$ libvedit = f$element(2,".",libverstr) 443$ libvpatch = f$cvui(0,8,f$extract(1,1,libvedit)+"@")-f$cvui(0,8,"@") 444$ libvedit = f$extract(0,1,libvedit) 445$ libver = f$string(f$int(libvmajor)*100)+","+- 446 f$string(f$int(libvminor)*100+f$int(libvedit)*10+f$int(libvpatch)) 447$ if libvmajor .eqs. "0" 448$ then 449$ libvmatch = "EQUAL" 450$ else 451$ ! Starting with the 1.0 release, backward compatibility should be 452$ ! kept, so switch over to the following 453$ libvmatch = "LEQUAL" 454$ endif 455$ endloop_rvi: 456$ close vf 457$ return 458$ 459$! The disabled algorithms reader 460$ read_disabled_algorithms_info: 461$ disabled_algorithms = "," 462$ open /read cf [.CRYPTO.'ARCH']OPENSSLCONF.H 463$ loop_rci: 464$ read/err=endloop_rci/end=endloop_rci cf rci_line 465$ rci_line = f$edit(rci_line,"TRIM,COMPRESS") 466$ rci_ei = 0 467$ if f$extract(0,9,rci_line) .eqs. "# define " then rci_ei = 2 468$ if f$extract(0,8,rci_line) .eqs. "#define " then rci_ei = 1 469$ if rci_ei .eq. 0 then goto loop_rci 470$ rci_e = f$element(rci_ei," ",rci_line) 471$ if f$extract(0,11,rci_e) .nes. "OPENSSL_NO_" then goto loop_rci 472$ disabled_algorithms = disabled_algorithms + f$extract(11,999,rci_e) + "," 473$ goto loop_rci 474$ endloop_rci: 475$ close cf 476$ return 477