HP OpenVMS Systems

ask the wizard
Content starts here

Problems with Linker Documentation?

» close window

The Question is:

 
Hello,
 
I tried your example in OpenVMS Linker Utility, but got some errors. Please
 advise on how to use the VMS linker to add symbol vector.  Thanks.
 
my_math.cxx
 
int myadd(int value_1, int value_2)
 
   int result;
   result=value_1 + value_2;
   return(result);
 
 
int mysub(int value_1, int value_2)
 
   int result;
   result=value_1 - value_2;
   return(result);
 
 
$ cxx my_math.cxx
$ link /share my_math.OBJ, -
                sys$input:/opt
        SYMBOL_VECTOR=(myadd=procedure,mysub=procedure)
 
Here is what I get:
 
%LINK-W-NUDFSYMS, 2 undefined symbols:
%LINK-I-UDFSYM,         MYADD
%LINK-I-UDFSYM,         MYSUB
%LINK-W-USEUNDEFSYMV, undefined symbol MYADD referenced
        in symbol vector option
%LINK-W-USEUNDEFSYMV, undefined symbol MYSUB referenced
        in symbol vector option
 
 
 
 
 
 


The Answer is :

 
  Thank you for bringing this old VAX C syntax to the attention
  of the OpenVMS Wizard.  (Please note that the examples are C,
  and not C++.)
 
  Please see the shareable image cookbook available at the Ask
  The Wizard website, and also please see topic 2486.
 
  An updated version -- one that contains the rough equivilent of
  the various examples present in chapters 2, 3, and 4 of the
  OpenVMS LINKER manual -- is included below.
 
 
 
 
$! my_linker_demo.com
 
$! OpenVMS LINKER Example Procedure
 
$ CALL CLEAN
 
$ create my_defs.h
#ifndef __MY_LOADED
#define __MY_LOADED 1
int myadd( int, int );
int mysub( int, int );
int mymul( int, int );
int mydiv( int, int );
#endif
 
$ create my_main.c
#include "my_defs.h"
#include <stdio.h>
#include <ssdef.h>
main()
  {
  int Num1 = 6, Num2 = 5, Result = 0;
 
  Result = mysub( Num1, Num2 );
  printf("The result is %d\n", Result );
 
  return SS$_NORMAL;
  }
 
$ cc/decc/prefix=all my_main.c
 
$ create my_math.c
#include "my_defs.h"
myadd( int Val1, int Val2 )
  {
  return Val1 + Val2;
  }
mysub( int Val1, int Val2 )
  {
  return Val1 - Val2;
  }
mymul( int Val1, int Val2 )
  {
  return Val1 * Val2;
  }
mydiv( int Val1, int Val2 )
  {
  return Val1 / Val2;
  }
 
$ cc/decc/prefix=all my_math.c
 
 
$! +++++++
$! MY_IMG1 -- Create a monolithic image
$!
$ link/execute=my_img1 my_math.obj,my_main.obj
 
$! Run the MY_IMG1 image.
$!
$ write sys$output "run my_img1"
$ run my_img1
 
 
$! +++++++
$! MY_IMG2 -- With an object library
$!
$ library/create/object/insert my_objlib.olb my_math.obj
$ link/execute=my_img2 my_main.obj,my_objlib/library
 
$! Run the MY_IMG2 image.
$!
$ write sys$output "run my_img2"
$ run my_img2
 
 
$! +++++++
$! MY_IMG3 -- With a (temporary/user) library reference via LNK$LIBRARY
$!
$ define/user lnk$library my_objlib.olb
$ link/execute=my_img3.exe my_main.obj
 
$! Run the MY_IMG3 image.
$!
$ write sys$output "run my_img3"
$ run my_img3
 
$ goto SHRIMG_'f$getsyi("ARCH_NAME")
$ exit
 
 
$SHRIMG_VAX:
 
$! Build an OpenVMS VAX shareable image.
 
$! Build the Macro32 transfer vectors.
$!
$ macro sys$input:/object=my_vectors.obj
 
; create a program section to hold just the vectors, and
; to keep all transfer vectors quadword aligned.
 
    .psect  $$$XFRVEC,exe,shr,nowrt,rd,pic,quad
 
; define a macro to simplify creating a transfer vector
; to a routine located in the shareable image.
 
    .macro  XFRVEC  entry_point
    .align  QUAD
    .transfer       entry_point
    .mask   entry_point
    JMP             l^entry_point+2
    .endm
 
; define a macro that places a longword constant directly
; into the transfer vector array.
 
    .macro  XFRCON  constant
    .align  QUAD
    .long   constant
    .endm
 
; and start defining the transfer vectors...
; Append any new entries, and do not remove any existing entries
; (Either make all changes to the vectors in an upward-compatible
; fashion, or plan to have to change the GSMATCH major value on
; the shareable image.)
 
    XFRVEC  myadd
    XFRVEC  mysub
    XFRVEC  mymul
    XFRVEC  mydiv
 
    .End
 
 
$! +++++++++
$! MY_SHRIMG -- Link a shareable image on an OpenVMS VAX system
$!
$ link/shareable=my_shrimg my_math.obj,my_vectors.obj,sys$input:/option
gsmatch=lequal,1,42
Cluster=$$$XFRVEC
Collect=$$$XFRVEC,$$$XFRVEC
 
$ Goto SHRIMG_COMMON
 
$SHRIMG_Alpha:
 
$! Build an OpenVMS VAX shareable image.
 
$! +++++++++
$! MY_SHRIMG -- Link a shareable image on an OpenVMS Alpha system
$!
$ link/shareable=my_shrimg my_math.obj,sys$input:/option
gsmatch=lequal,1,42
! do not re-order nor remove any symbol vector entries.
! append all new entries to the end of the list.
SYMBOL_VECTOR=(-
    myadd=PROCEDURE,-
    mysub=PROCEDURE,-
    mymul=PROCEDURE,-
    mydiv=PROCEDURE )
 
$ Goto SHRIMG_COMMON
 
$SHRIMG_COMMON:
 
 
$! +++++++
$! MY_IMG4 -- Link with the shareable image
$!
$ link/execute=my_img4 my_main.obj,sys$input/options
my_shrimg/shareable
 
$! Run the MY_IMG4 image.
$!   Since the shareable image is not in SYS$SHARE:, we
$!   need a (temporary/user) logical name to reference it.
$!
$ write sys$output "run my_img4"
$ define/user my_shrimg sys$disk:[]my_shrimg
$ run my_img4
 
 
$! +++++++
$! MY_IMG5 -- Link with the shareable image via a shareable image library
$!
$ library/create/share/insert my_shrlib.olb my_shrimg.exe
$ define/user lnk$library my_shrlib.olb
$ link/execute=my_img5 my_main.obj
 
$! Run the MY_IMG5 image.
$!   Since the shareable image is not in SYS$SHARE:, we
$!   need a (temporary/user) logical name to reference it.
$!
$ write sys$output "run my_img5"
$ define/user my_shrimg sys$disk:[]my_shrimg
$ run my_img5
 
$ CALL CLEAN
 
$ EXIT
 
$CLEAN: SUBROUTINE
 
$! Clean up any remnants
 
$ if f$search("my_defs.h") .nes. "" then delete my_defs.h;*
$ if f$search("my_main.c") .nes. "" then delete my_main.c;*
$ if f$search("my_main.obj") .nes. "" then delete my_main.obj;*
$ if f$search("my_math.c") .nes. "" then delete my_math.c;*
$ if f$search("my_math.obj") .nes. "" then delete my_math.obj;*
$ if f$search("my_img1.exe") .nes. "" then delete my_img1.exe;*
$ if f$search("my_img2.exe") .nes. "" then delete my_img2.exe;*
$ if f$search("my_img3.exe") .nes. "" then delete my_img3.exe;*
$ if f$search("my_img4.exe") .nes. "" then delete my_img4.exe;*
$ if f$search("my_img5.exe") .nes. "" then delete my_img5.exe;*
$ if f$search("my_vectors.obj") .nes. "" then delete my_vectors.obj;*
$ if f$search("my_shrimg.exe") .nes. "" then delete my_shrimg.exe;*
$ if f$search("my_shrlib.olb") .nes. "" then delete my_shrlib.olb;*
$ if f$search("my_objlib.olb") .nes. "" then delete my_objlib.olb;*
 
$ ENDSUBROUTINE
 
 

answer written or last revised on ( 23-MAY-2000 )

» close window