Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55968
  • 博文数量: 18
  • 博客积分: 161
  • 博客等级: 入伍新兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-14 21:52
文章分类
文章存档

2012年(18)

分类:

2012-04-16 21:39:05

原文地址:BINDDIR技术:概念、使用 作者:passthru

 

    binddir400下一个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后被其它pgmcallp进行调用。如果这个module被改变,被调用的pgm就要重新对新编译的module进行重新链接,即把编译后的module的地址(pointer)更新到pgm调用的系统表中。

只有通过updpgmpgm进行module新的地址pointer进行更新,更新后的pgm才可以对新的module进行callp调用。

我们马上会想到,如果有Npgm对一个module进行调用,如果这个module被修改重新编译,不是就要对Npgm进行updpgm进行重新pointer更新吗?答案是肯定的。

如果有这样情况发生,我们会发现如果用binddir单独装载module,就会造成一旦这个module进行修改重新编译,就要对调用它的所有pgm进行更新。我们在开发过程中就要不断的记录所有调用这个modulepgm,一旦这个module被修改重新编译,我们就要用cl统一进行updpgm

 

IBM针对这个计算瓶颈采用了一个有效的解决方法,那就是srvpgm,一个os400obj的类型。

Srvpgm一方面通过符号(symbol)定义关联每一个module的链接,即pointer地址。另一方面,一个调用这个srvpgmmodule的外部调用程序pgm,通过binddirpgmbinddi下的srvpgm的地址pointer进行编译链接,srvpgm就是通过两个绝对地址进行转换,即符号symbol对应srvpgm下的modulessrvpgm对应调用的pgm。这样,一旦srvpgm下的modules进行从新编译,只要对srvpgm和相关的module进行updsrvpgm就可以了。因为外部pgm通过binddirsrvpgm的地址链接没有必要更新,所以无需对pgmsrvpgm进行重新链接操作,即无需重新编译pgm

 

因为pgmsrvpgm的链接是固定的,所以,在updsrvpgm.bnd文件使用时,不能改变srvpgmmodules的符号symbol位置,即不能改变.bnd文件Symbol在文件中的顺序或位置。

 

Binddir的使用:

1)  装载modules/*srvpgm

2)外部pgm代码用H表定义,如H bnddir’MyBndDir’)。

 

顺便说一下,如果对srvpgm下的module进行debug连调,即通过一个pgm与被调用的module进行debug,在strdbg pgm后用f14装载这个srvpgm,装载类型是*srvpgmdebug窗下就会显示这个srpgm下所有的modules,然后再用5选项进入到需要debugmodule中设置断点。

阅读(885) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~