2012年(18)
分类:
2012-04-16 21:39:05
原文地址:BINDDIR技术:概念、使用 作者:passthru
binddir是400下一个obj类型,通过crtbnddir进行创建。
binddir的作用是把*module、*srvpgm类型的obj进行装载。装载可以通过1)用ADDBNDDIRE进行cl脚本加载;2)用wrkbnddir,进行交互装载。用编译参数指定bnddir仅仅对编译代码中调用外部module/s已经装载到binddir之下的名称指定。
binddir的作用,把不是最终执行代码*modules/*srvpgm装载到binddir后,相当于对*modules/*srvpgm套上一个可执行的shell。只有经过装在到binddir下的*modules/*srvpgm才能被调用,即可执行。
只有装载到binddir,或通过14选项进行编译的*modules才可以被调用执行。
如果某个*module被装载到binddir后被其它pgm用callp进行调用。如果这个module被改变,被调用的pgm就要重新对新编译的module进行重新链接,即把编译后的module的地址(pointer)更新到pgm调用的系统表中。
只有通过updpgm对pgm进行module新的地址pointer进行更新,更新后的pgm才可以对新的module进行callp调用。
我们马上会想到,如果有N个pgm对一个module进行调用,如果这个module被修改重新编译,不是就要对N个pgm进行updpgm进行重新pointer更新吗?答案是肯定的。
如果有这样情况发生,我们会发现如果用binddir单独装载module,就会造成一旦这个module进行修改重新编译,就要对调用它的所有pgm进行更新。我们在开发过程中就要不断的记录所有调用这个module的pgm,一旦这个module被修改重新编译,我们就要用cl统一进行updpgm。
IBM针对这个计算瓶颈采用了一个有效的解决方法,那就是srvpgm,一个os400下obj的类型。
Srvpgm一方面通过符号(symbol)定义关联每一个module的链接,即pointer地址。另一方面,一个调用这个srvpgm下module的外部调用程序pgm,通过binddir把pgm与binddi下的srvpgm的地址pointer进行编译链接,srvpgm就是通过两个绝对地址进行转换,即符号symbol对应srvpgm下的modules,srvpgm对应调用的pgm。这样,一旦srvpgm下的modules进行从新编译,只要对srvpgm和相关的module进行updsrvpgm就可以了。因为外部pgm通过binddir与srvpgm的地址链接没有必要更新,所以无需对pgm与srvpgm进行重新链接操作,即无需重新编译pgm
因为pgm对srvpgm的链接是固定的,所以,在updsrvpgm对.bnd文件使用时,不能改变srvpgm下modules的符号symbol位置,即不能改变.bnd文件Symbol在文件中的顺序或位置。
Binddir的使用:
1) 装载modules/*srvpgm;
2)外部pgm代码用H表定义,如H bnddir(’MyBndDir’)。
顺便说一下,如果对srvpgm下的module进行debug连调,即通过一个pgm与被调用的module进行debug,在strdbg pgm后用f14装载这个srvpgm,装载类型是*srvpgm。debug窗下就会显示这个srpgm下所有的modules,然后再用5选项进入到需要debug的module中设置断点。