HP OpenVMS Systemsask the wizard |
The Question is:
We've been using an utility written in macro for a long time. Now we have
upgraded to OpenVMS 7.3-1, and when we try to link it we get this error mesagge:
$link getproclocks,GETPRLOCK_DEFS
%LINK-W-NUDFSYMS, 3 undefined symbols:
%LINK-I-UDFSYM, EXE$CVT_EPID_TO_PCB
%LINK-I-UDFSYM, LKB$L_OWNQFL
%LINK-I-UDFSYM, PCB$L_LOCKQFL
%LINK-W-USEUNDEF, undefined symbol EXE$CVT_EPID_TO_PCB referenced
in psect $LINKAGE offset %X00000080
in module GETPROCLOCKS file
PTECDISK:[PTEC.BDAT.CSUAREZ.UTILES]GETPROCLOCKS.OBJ;1
%LINK-W-USEUNDEF, undefined symbol PCB$L_LOCKQFL referenced
in psect $LINKAGE offset %X00000090
in module GETPROCLOCKS file
PTECDISK:[PTEC.BDAT.CSUAREZ.UTILES]GETPROCLOCKS.OBJ;1
%LINK-W-USEUNDEF, undefined symbol LKB$L_OWNQFL referenced
in psect $LINKAGE offset %X00000098
in module GETPROCLOCKS file
PTECDISK:[PTEC.BDAT.CSUAREZ.UTILES]GETPROCLOCKS.OBJ;1
Seems to me that these routines (PCB$L_LOCKQFL, LKB$L_OWNQFL) are no longer
available, maybe they were replaced by new ones or placed in another object
library.
Is this so? Which are the new routines? How do I call them?
Thanks for your time.
Rgds,
Carlos
ps.: here is the source code of the macro programs involved:
$type getprlock_defs.mar
..TITLE GETPRLOCK_DEFS
..LIBRARY "SYS$LIBRARY:LIB.MLB"
$LKBDEF GLOBAL
$PCBDEF GLOBAL
..END
$type getproclocks.mar
.title getproclocks
.ident 'V1.1-0'
; This subroutine returns a list of lockids for a given process that are
; in waiting or granted state. This list is built without acquiring any
; synchronization so it can be wrong....
; There are several lines that need adjusting depending on whether this is a
; VAX or an Alpha. These lines can be found by searching for ###
; Aplha Build Instructions
; $ macro/mig getproclocks
; $ link/sysexe getproclocks
; Vax Build Instructions
; Change lines as required for VAX
; $ macro getproclocks
; $ link getproclocks,sys$input:/opt
; sys$system:sys.stb/sele
; ^Z
; ### VAX Comment the next line out
.link 'sys$loadable_images:process_management.stb' /selective_search
.library 'sys$share:lib.mlb'
$ssdef
$lkbdef
$pcbdef
.psect _data,wrt,noexe
buffer: .long 0
buflen: .long 0
pid: .long 0
fail: .long 0
prompt: .ascid 'Enter PID: '
result: .ascid ' '
bb: .blkb 512
symnum: .ascid 'lockcnt'
symnumval: .ascid '00000000'
symdsc: .ascid 'lock0000'
symdsc_2: .quad 0
symval: .ascid ' '
nodename: .blkb 32
nodename_l: .long 0
syi_itms: .word 32
.word SYI$_NODENAME
.address nodename
.address nodename_l
.long 0
.psect _code,nowrt,exe
.entry getproclocks,^m<r2,r3,r4,r5,r6,r7>
; 4(ap) lv pid
; 8(ap) ala pointer to memory to receive list
; 12(ap) lv number of entries that fit in list
cmpl (ap),#3
beql 8$
movl #ss$_insfarg,r0
4$: ret
8$:
; Check system is valid node.
The Answer is : Please use LINK/SYSEXE (and often also /NOSYSLIB) when linking against the OpenVMS kernel structures. The provided example was incomplete, and the OpenVMS Wizard cannot confirm that the LINK command was the error. Additionally, the LKB$L_OWNQFL and PCB$L_LOCKQFL cells were promoted from longword ($L) to quadword ($Q) entries; to LKB$Q_OWNQFL and PCB$Q_LOCKQFL. You may (will) need to modify your code accordingly. $ search sys$share:*.req _OWNQFL,_LOCKQFL macro LKB$Q_OWNQFL = 112,0,0,1 %; literal LKB$S_OWNQFL = 8; ! Owner queue forward link macro PCB$Q_LOCKQFL = 872,0,0,1 %; literal PCB$S_LOCKQFL = 8; ! Lock queue forward link If you require assistance in porting code or in obtaining alternatives to existing kernel-mode hacks, please contact HP Services for assistance.
|