123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454 |
- $! MKSHARED.COM -- Create shareable images.
- $!
- $! P1: "64" for 64-bit pointers.
- $!
- $! P2: Zlib object library path (optional).
- $!
- $! Input: [.UTIL]LIBEAY.NUM,[.xxx.EXE.CRYPTO]SSL_LIBCRYPTO[32].OLB
- $! [.UTIL]SSLEAY.NUM,[.xxx.EXE.SSL]SSL_LIBSSL[32].OLB
- $! Output: [.xxx.EXE.CRYPTO]SSL_LIBCRYPTO_SHR[32].OPT,.MAP,.EXE
- $! [.xxx.EXE.SSL]SSL_LIBSSL_SRH[32].OPT,.MAP,.EXE
- $!
- $! So far, tests have only been made on VMS for Alpha. VAX will come in time.
- $! ===========================================================================
- $!
- $! Announce/identify.
- $!
- $ proc = f$environment( "procedure")
- $ write sys$output "@@@ "+ -
- f$parse( proc, , , "name")+ f$parse( proc, , , "type")
- $!
- $! Save the original default device:[directory].
- $!
- $ def_orig = f$environment( "default")
- $ on error then goto tidy
- $ on control_c then goto tidy
- $!
- $! SET DEFAULT to the main kit directory.
- $!
- $ proc = f$environment("procedure")
- $ proc = f$parse( "A.;", proc)- "A.;"
- $ set default 'proc'
- $ set default [-]
- $!
- $! ----- Prepare info for processing: version number and file info
- $ gosub read_version_info
- $ if libver .eqs. ""
- $ then
- $ write sys$error "ERROR: Couldn't find any library version info..."
- $ go to tidy:
- $ endif
- $
- $ if (f$getsyi("cpu") .lt. 128)
- $ then
- $ arch_vax = 1
- $ arch = "VAX"
- $ else
- $ arch_vax = 0
- $ arch = f$edit( f$getsyi( "ARCH_NAME"), "UPCASE")
- $ if (arch .eqs. "") then arch = "UNK"
- $ endif
- $!
- $ archd = arch
- $ lib32 = "32"
- $ shr = "SHR32"
- $!
- $ if (p1 .nes. "")
- $ then
- $ if (p1 .eqs. "64")
- $ then
- $ archd = arch+ "_64"
- $ lib32 = ""
- $ shr = "SHR"
- $ else
- $ if (p1 .nes. "32")
- $ then
- $ write sys$output "Second argument invalid."
- $ write sys$output "It should be "32", "64", or nothing."
- $ exit
- $ endif
- $ endif
- $ endif
- $!
- $ ZLIB = p2
- $ zlib_lib = ""
- $ if (ZLIB .nes. "")
- $ then
- $ file2 = f$parse( ZLIB, "libz.olb", , , "syntax_only")
- $ if (f$search( file2) .eqs. "")
- $ then
- $ write sys$output ""
- $ write sys$output "The Option ", ZLIB, " Is Invalid."
- $ write sys$output " Can't find library: ''file2'"
- $ write sys$output ""
- $ goto tidy
- $ endif
- $ zlib_lib = ", ''file2' /library"
- $ endif
- $!
- $ if (arch_vax)
- $ then
- $ libtit = "CRYPTO_TRANSFER_VECTOR"
- $ libid = "Crypto"
- $ libnum = "[.UTIL]LIBEAY.NUM"
- $ libdir = "[.''ARCHD'.EXE.CRYPTO]"
- $ libmar = "''libdir'SSL_LIBCRYPTO_''shr'.MAR"
- $ libolb = "''libdir'SSL_LIBCRYPTO''lib32'.OLB"
- $ libopt = "''libdir'SSL_LIBCRYPTO_''shr'.OPT"
- $ libobj = "''libdir'SSL_LIBCRYPTO_''shr'.OBJ"
- $ libmap = "''libdir'SSL_LIBCRYPTO_''shr'.MAP"
- $ libgoal= "''libdir'SSL_LIBCRYPTO_''shr'.EXE"
- $ libref = ""
- $ libvec = "LIBCRYPTO"
- $ if f$search( libolb) .nes. "" then gosub create_vax_shr
- $ libtit = "SSL_TRANSFER_VECTOR"
- $ libid = "SSL"
- $ libnum = "[.UTIL]SSLEAY.NUM"
- $ libdir = "[.''ARCHD'.EXE.SSL]"
- $ libmar = "''libdir'SSL_LIBSSL_''shr'.MAR"
- $ libolb = "''libdir'SSL_LIBSSL''lib32'.OLB"
- $ libopt = "''libdir'SSL_LIBSSL_''shr'.OPT"
- $ libobj = "''libdir'SSL_LIBSSL_''shr'.OBJ"
- $ libmap = "''libdir'SSL_LIBSSL_''shr'.MAP"
- $ libgoal= "''libdir'SSL_LIBSSL_''shr'.EXE"
- $ libref = "[.''ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO_''shr'.EXE"
- $ libvec = "LIBSSL"
- $ if f$search( libolb) .nes. "" then gosub create_vax_shr
- $ else
- $ libid = "Crypto"
- $ libnum = "[.UTIL]LIBEAY.NUM"
- $ libdir = "[.''ARCHD'.EXE.CRYPTO]"
- $ libolb = "''libdir'SSL_LIBCRYPTO''lib32'.OLB"
- $ libopt = "''libdir'SSL_LIBCRYPTO_''shr'.OPT"
- $ libmap = "''libdir'SSL_LIBCRYPTO_''shr'.MAP"
- $ libgoal= "''libdir'SSL_LIBCRYPTO_''shr'.EXE"
- $ libref = ""
- $ if f$search( libolb) .nes. "" then gosub create_nonvax_shr
- $ libid = "SSL"
- $ libnum = "[.UTIL]SSLEAY.NUM"
- $ libdir = "[.''ARCHD'.EXE.SSL]"
- $ libolb = "''libdir'SSL_LIBSSL''lib32'.OLB"
- $ libopt = "''libdir'SSL_LIBSSL_''shr'.OPT"
- $ libmap = "''libdir'SSL_LIBSSL_''shr'.MAP"
- $ libgoal= "''libdir'SSL_LIBSSL_''shr'.EXE"
- $ libref = "[.''ARCHD'.EXE.CRYPTO]SSL_LIBCRYPTO_''shr'.EXE"
- $ if f$search( libolb) .nes. "" then gosub create_nonvax_shr
- $ endif
- $!
- $ tidy:
- $!
- $! Close any open files.
- $!
- $ if (f$trnlnm( "libnum", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
- close libnum
- $!
- $ if (f$trnlnm( "mar", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
- close mar
- $!
- $ if (f$trnlnm( "opt", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
- close opt
- $!
- $ if (f$trnlnm( "vf", "LNM$PROCESS", 0, "SUPERVISOR") .nes. "") then -
- close vf
- $!
- $! Restore the original default device:[directory].
- $!
- $ set default 'def_orig'
- $ exit
- $
- $! ----- Subroutines to build the shareable libraries
- $! For each supported architecture, there's a main shareable library
- $! creator, which is called from the main code above.
- $! The creator will define a number of variables to tell the next levels of
- $! subroutines what routines to use to write to the option files, call the
- $! main processor, read_func_num, and when that is done, it will write version
- $! data at the end of the .opt file, close it, and link the library.
- $!
- $! read_func_num reads through a .num file and calls the writer routine for
- $! each line. It's also responsible for checking that order is properly kept
- $! in the .num file, check that each line applies to VMS and the architecture,
- $! and to fill in "holes" with dummy entries.
- $!
- $! The creator routines depend on the following variables:
- $! libnum The name of the .num file to use as input
- $! libolb The name of the object library to build from
- $! libid The identification string of the shareable library
- $! libopt The name of the .opt file to write
- $! libtit The title of the assembler transfer vector file (VAX only)
- $! libmar The name of the assembler transfer vector file (VAX only)
- $! libmap The name of the map file to write
- $! libgoal The name of the shareable library to write
- $! libref The name of a shareable library to link in
- $!
- $! read_func_num depends on the following variables from the creator:
- $! libwriter The name of the writer routine to call for each .num file line
- $! -----
- $
- $! ----- Subroutines for non-VAX
- $! -----
- $! The creator routine
- $ create_nonvax_shr:
- $ open /write opt 'libopt'
- $ write opt "identification=""",libid," ",libverstr,""""
- $ write opt libolb, " /library"
- $ if libref .nes. "" then write opt libref,"/SHARE"
- $ write opt "SYMBOL_VECTOR=(-"
- $ libfirstentry := true
- $ libwrch := opt
- $ libwriter := write_nonvax_transfer_entry
- $ textcount = 0
- $ gosub read_func_num
- $ write opt ")"
- $ write opt "GSMATCH=",libvmatch,",",libver
- $ close opt
- $ link /map = 'libmap' /full /share = 'libgoal' 'libopt' /options -
- 'zlib_lib'
- $ return
- $
- $! The record writer routine
- $ write_nonvax_transfer_entry:
- $ if libentry .eqs. ".dummy" then return
- $ if info_kind .eqs. "VARIABLE"
- $ then
- $ pr:=DATA
- $ else
- $ pr:=PROCEDURE
- $ endif
- $ textcount_this = f$length(pr) + f$length(libentry) + 5
- $ if textcount + textcount_this .gt. 1024
- $ then
- $ write opt ")"
- $ write opt "SYMBOL_VECTOR=(-"
- $ textcount = 16
- $ libfirstentry := true
- $ endif
- $ if libfirstentry
- $ then
- $ write 'libwrch' " ",libentry,"=",pr," -"
- $ else
- $ write 'libwrch' " ,",libentry,"=",pr," -"
- $ endif
- $ libfirstentry := false
- $ textcount = textcount + textcount_this
- $ return
- $
- $! ----- Subroutines for VAX
- $! -----
- $! The creator routine
- $ create_vax_shr:
- $ open /write mar 'libmar'
- $ type sys$input:/out=mar:
- ;
- ; Transfer vector for VAX shareable image
- ;
- $ write mar " .TITLE ",libtit
- $ write mar " .IDENT /",libid,"/"
- $ type sys$input:/out=mar:
- ;
- ; Define macro to assist in building transfer vector entries. Each entry
- ; should take no more than 8 bytes.
- ;
- .MACRO FTRANSFER_ENTRY routine
- .ALIGN QUAD
- .TRANSFER routine
- .MASK routine
- JMP routine+2
- .ENDM FTRANSFER_ENTRY
- ;
- ; Place entries in own program section.
- ;
- $ write mar " .PSECT $$",libvec,",QUAD,PIC,USR,CON,REL,LCL,SHR,EXE,RD,NOWRT"
- $ write mar libvec,"_xfer:"
- $ libwrch := mar
- $ libwriter := write_vax_ftransfer_entry
- $ gosub read_func_num
- $ type sys$input:/out=mar:
- ;
- ; Allocate extra storage at end of vector to allow for expansion.
- ;
- $ write mar " .BLKB 32768-<.-",libvec,"_xfer> ; 64 pages total."
- $! libwriter := write_vax_vtransfer_entry
- $! gosub read_func_num
- $ write mar " .END"
- $ close mar
- $ open /write opt 'libopt'
- $ write opt "identification=""",libid," ",libverstr,""""
- $ write opt libobj
- $ write opt libolb, " /library"
- $ if libref .nes. "" then write opt libref,"/SHARE"
- $ type sys$input:/out=opt:
- !
- ! Ensure transfer vector is at beginning of image
- !
- CLUSTER=FIRST
- $ write opt "COLLECT=FIRST,$$",libvec
- $ write opt "GSMATCH=",libvmatch,",",libver
- $ type sys$input:/out=opt:
- !
- ! make psects nonshareable so image can be installed.
- !
- PSECT_ATTR=$CHAR_STRING_CONSTANTS,NOWRT
- $ libwrch := opt
- $ libwriter := write_vax_psect_attr
- $ gosub read_func_num
- $ close opt
- $ macro/obj='libobj' 'libmar'
- $ link /map = 'libmap' /full /share = 'libgoal' 'libopt' /options -
- 'zlib_lib'
- $ return
- $
- $! The record writer routine for VAX functions
- $ write_vax_ftransfer_entry:
- $ if info_kind .nes. "FUNCTION" then return
- $ if libentry .eqs ".dummy"
- $ then
- $ write 'libwrch' " .BLKB 8" ! Dummy is zeroes...
- $ else
- $ write 'libwrch' " FTRANSFER_ENTRY ",libentry
- $ endif
- $ return
- $! The record writer routine for VAX variables (should never happen!)
- $ write_vax_psect_attr:
- $ if info_kind .nes. "VARIABLE" then return
- $ if libentry .eqs ".dummy" then return
- $ write 'libwrch' "PSECT_ATTR=",libentry,",NOSHR"
- $ return
- $
- $! ----- Common subroutines
- $! -----
- $! The .num file reader. This one has great responsibility.
- $ read_func_num:
- $ open /read libnum 'libnum'
- $ goto read_nums
- $
- $ read_nums:
- $ libentrynum=0
- $ liblastentry:=false
- $ entrycount=0
- $ loop:
- $ read /end=loop_end /err=loop_end libnum line
- $ lin = f$edit( line, "COMPRESS,TRIM")
- $! Skip a "#" comment line.
- $ if (f$extract( 0, 1, lin) .eqs. "#") then goto loop
- $ entrynum = f$int(f$element( 1, " ", lin))
- $ entryinfo = f$element( 2, " ", lin)
- $ curentry = f$element( 0, " ", lin)
- $ info_exist = f$element( 0, ":", entryinfo)
- $ info_platforms = ","+ f$element(1, ":", entryinfo)+ ","
- $ info_kind = f$element( 2, ":", entryinfo)
- $ info_algorithms = ","+ f$element( 3, ":", entryinfo)+ ","
- $ if info_exist .eqs. "NOEXIST" then goto loop
- $ truesum = 0
- $ falsesum = 0
- $ negatives = 1
- $ plat_i = 0
- $ loop1:
- $ plat_entry = f$element( plat_i, ",", info_platforms)
- $ plat_i = plat_i + 1
- $ if plat_entry .eqs. "" then goto loop1
- $ if plat_entry .nes. ","
- $ then
- $ if f$extract(0,1,plat_entry) .nes. "!" then negatives = 0
- $ if (arch_vax)
- $ then
- $ if plat_entry .eqs. "EXPORT_VAR_AS_FUNCTION" then -
- $ truesum = truesum + 1
- $ if plat_entry .eqs. "!EXPORT_VAR_AS_FUNCTION" then -
- $ falsesum = falsesum + 1
- $ endif
- $!
- $ if ((plat_entry .eqs. "VMS") .or. -
- ((plat_entry .eqs. "ZLIB") .and. (ZLIB .nes. "")) .or. -
- (arch_vax .and. (plat_entry .eqs. "VMSVAX"))) then -
- truesum = truesum + 1
- $!
- $ if ((plat_entry .eqs. "!VMS") .or. -
- (arch_vax .and. (plat_entry .eqs. "!VMSVAX"))) then -
- falsesum = falsesum + 1
- $!
- $ goto loop1
- $ endif
- $ endloop1:
- $!DEBUG!$ if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms
- $!DEBUG!$ then
- $!DEBUG!$ write sys$output line
- $!DEBUG!$ write sys$output " truesum = ",truesum,-
- $!DEBUG! ", negatives = ",negatives,", falsesum = ",falsesum
- $!DEBUG!$ endif
- $ if falsesum .ne. 0 then goto loop
- $ if truesum+negatives .eq. 0 then goto loop
- $ alg_i = 0
- $ loop2:
- $ alg_entry = f$element(alg_i,",",info_algorithms)
- $ alg_i = alg_i + 1
- $ if alg_entry .eqs. "" then goto loop2
- $ if alg_entry .nes. ","
- $ then
- $ if alg_entry .eqs. "KRB5" then goto loop ! Special for now
- $ if alg_entry .eqs. "STATIC_ENGINE" then goto loop ! Special for now
- $ if f$trnlnm("OPENSSL_NO_"+alg_entry) .nes. "" then goto loop
- $ goto loop2
- $ endif
- $ endloop2:
- $ if info_platforms - "EXPORT_VAR_AS_FUNCTION" .nes. info_platforms
- $ then
- $!DEBUG!$ write sys$output curentry," ; ",entrynum," ; ",entryinfo
- $ endif
- $ redo:
- $ next:=loop
- $ tolibentry=curentry
- $ if libentrynum .ne. entrynum
- $ then
- $ entrycount=entrycount+1
- $ if entrycount .lt. entrynum
- $ then
- $!DEBUG!$ write sys$output "Info: entrycount: ''entrycount', entrynum: ''entrynum' => 0"
- $ tolibentry=".dummy"
- $ next:=redo
- $ endif
- $ if entrycount .gt. entrynum
- $ then
- $ write sys$error "Decreasing library entry numbers! Can't continue"
- $ write sys$error """",line,""""
- $ close libnum
- $ return
- $ endif
- $ libentry=tolibentry
- $!DEBUG!$ write sys$output entrycount," ",libentry," ",entryinfo
- $ if libentry .nes. "" .and. libwriter .nes. "" then gosub 'libwriter'
- $ else
- $ write sys$error "Info: ""''curentry'"" is an alias for ""''libentry'"". Overriding..."
- $ endif
- $ libentrynum=entrycount
- $ goto 'next'
- $ loop_end:
- $ close libnum
- $ return
- $
- $! The version number reader
- $ read_version_info:
- $ libver = ""
- $ open /read vf [.CRYPTO]OPENSSLV.H
- $ loop_rvi:
- $ read/err=endloop_rvi/end=endloop_rvi vf rvi_line
- $ if rvi_line - "SHLIB_VERSION_NUMBER """ .eqs. rvi_line then -
- goto loop_rvi
- $ libverstr = f$element(1,"""",rvi_line)
- $ libvmajor = f$element(0,".",libverstr)
- $ libvminor = f$element(1,".",libverstr)
- $ libvedit = f$element(2,".",libverstr)
- $ libvpatch = f$cvui(0,8,f$extract(1,1,libvedit)+"@")-f$cvui(0,8,"@")
- $ libvedit = f$extract(0,1,libvedit)
- $ libver = f$string(f$int(libvmajor)*100)+","+-
- f$string(f$int(libvminor)*100+f$int(libvedit)*10+f$int(libvpatch))
- $ if libvmajor .eqs. "0"
- $ then
- $ libvmatch = "EQUAL"
- $ else
- $ ! Starting with the 1.0 release, backward compatibility should be
- $ ! kept, so switch over to the following
- $ libvmatch = "LEQUAL"
- $ endif
- $ endloop_rvi:
- $ close vf
- $ return
|