JPH05257672A - コンパイルドコードオブジェクトのパッチ処理方式 - Google Patents
コンパイルドコードオブジェクトのパッチ処理方式Info
- Publication number
- JPH05257672A JPH05257672A JP4089728A JP8972892A JPH05257672A JP H05257672 A JPH05257672 A JP H05257672A JP 4089728 A JP4089728 A JP 4089728A JP 8972892 A JP8972892 A JP 8972892A JP H05257672 A JPH05257672 A JP H05257672A
- Authority
- JP
- Japan
- Prior art keywords
- area
- compiled code
- patch
- code object
- correction
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000012545 processing Methods 0.000 title claims abstract description 32
- 238000012937 correction Methods 0.000 claims abstract description 120
- 238000000034 method Methods 0.000 claims abstract description 51
- 238000012986 modification Methods 0.000 claims description 38
- 230000004048 modification Effects 0.000 claims description 38
- 238000002715 modification method Methods 0.000 claims description 15
- 238000003672 processing method Methods 0.000 claims description 6
- 230000006870 function Effects 0.000 description 9
- 238000010586 diagram Methods 0.000 description 4
Landscapes
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
(57)【要約】
【目的】 コンパイラが生成出力したコンパイルドコー
ドオブジェクトをインタプリタが記憶領域にロードして
実行管理を行う言語処理システムにおいて、コンパイル
ドコードオブジェクトの修正をパッチで行う。 【構成】 インタプリタ3内のローダ8の判定部81は修
正情報71に基づき修正箇所を認識し、その修正方法を決
定する。短命令列修正方法で修正する場合、短命令列修
正手段82はその修正箇所の内容を該当する機械語命令列
61で書き換える。長命令列修正方法で修正する場合、長
命令列修正手段83はその修正箇所の内容をパッチエリア
42に分岐する命令に書き換えると共に該当する機械語命
令列61と前記修正箇所の直後へ分岐する命令とを追加パ
ッチ領域9に格納する。修正ファイルロード手段84は修
正後のコンパイルドコードオブジェクト及び追加パッチ
領域9の内容を記憶領域4にロードする。
ドオブジェクトをインタプリタが記憶領域にロードして
実行管理を行う言語処理システムにおいて、コンパイル
ドコードオブジェクトの修正をパッチで行う。 【構成】 インタプリタ3内のローダ8の判定部81は修
正情報71に基づき修正箇所を認識し、その修正方法を決
定する。短命令列修正方法で修正する場合、短命令列修
正手段82はその修正箇所の内容を該当する機械語命令列
61で書き換える。長命令列修正方法で修正する場合、長
命令列修正手段83はその修正箇所の内容をパッチエリア
42に分岐する命令に書き換えると共に該当する機械語命
令列61と前記修正箇所の直後へ分岐する命令とを追加パ
ッチ領域9に格納する。修正ファイルロード手段84は修
正後のコンパイルドコードオブジェクト及び追加パッチ
領域9の内容を記憶領域4にロードする。
Description
【0001】
【産業上の利用分野】本発明は、インタプリタとコンパ
イラとを備え、コンパイラが生成出力したコンパイルド
コードオブジェクトをインタプリタが記憶領域にロード
しその実行管理を行う言語処理システムに関し、特にコ
ンパイルドコードオブジェクトのパッチ処理方式に関す
る。
イラとを備え、コンパイラが生成出力したコンパイルド
コードオブジェクトをインタプリタが記憶領域にロード
しその実行管理を行う言語処理システムに関し、特にコ
ンパイルドコードオブジェクトのパッチ処理方式に関す
る。
【0002】
【従来の技術】言語処理システムの一種に、ソースプロ
グラムやデータオブジェクトを解釈実行するインタプリ
タと実行効率を向上させるためにソースプログラムを翻
訳するコンパイラとから構成され、コンパイラが関数単
位にソースプログラムをコンパイルして出力する機械語
命令列を含むコンパイルドコードオブジェクトを、イン
タプリタが記憶領域にロードして実行管理する言語処理
システムがある。なお、このような言語処理システムを
記載した文献としては、例えば、特願昭63−3108
27号添付明細書および図面がある。
グラムやデータオブジェクトを解釈実行するインタプリ
タと実行効率を向上させるためにソースプログラムを翻
訳するコンパイラとから構成され、コンパイラが関数単
位にソースプログラムをコンパイルして出力する機械語
命令列を含むコンパイルドコードオブジェクトを、イン
タプリタが記憶領域にロードして実行管理する言語処理
システムがある。なお、このような言語処理システムを
記載した文献としては、例えば、特願昭63−3108
27号添付明細書および図面がある。
【0003】ところで、コンパイルして生成された既に
存在するコンパイルドコードオブジェクトが一部不正な
機械語命令列を含む場合、所期の機能を実現することが
できないので、その修正が必要となる。
存在するコンパイルドコードオブジェクトが一部不正な
機械語命令列を含む場合、所期の機能を実現することが
できないので、その修正が必要となる。
【0004】ここで、一般にコンパイルユニットの修正
方法としては、ソースプログラムを修正してこれを再コ
ンパイルする方法と、所謂パッチによってコンパイルユ
ニット中の機械語を直接に修正する方法とがあるが、こ
の種の言語処理システムでは、コンパイルドコードオブ
ジェクトがそのオペレーティングシステム上で定められ
たコンパイルユニット形式を有していないため、コンパ
イルユニットに対する既存のパッチシステムが存在して
もそれを使用することができない。
方法としては、ソースプログラムを修正してこれを再コ
ンパイルする方法と、所謂パッチによってコンパイルユ
ニット中の機械語を直接に修正する方法とがあるが、こ
の種の言語処理システムでは、コンパイルドコードオブ
ジェクトがそのオペレーティングシステム上で定められ
たコンパイルユニット形式を有していないため、コンパ
イルユニットに対する既存のパッチシステムが存在して
もそれを使用することができない。
【0005】そこで、従来は、ソースプログラムを修正
し、これを再コンパイルすることによって、修正された
コンパイルドコードオブジェクトを生成していた。
し、これを再コンパイルすることによって、修正された
コンパイルドコードオブジェクトを生成していた。
【0006】
【発明が解決しようとする課題】従って、修正する機械
語命令列が全体のほんの一部でもソースプログラム全体
を再コンパイルするために多くの労力と時間を必要とし
ていた。
語命令列が全体のほんの一部でもソースプログラム全体
を再コンパイルするために多くの労力と時間を必要とし
ていた。
【0007】また、元のコンパイルドコードオブジェク
トが生成されたときのコンパイル環境を再現できない場
合には、再コンパイルすることができないので修正する
ことはできなかった。
トが生成されたときのコンパイル環境を再現できない場
合には、再コンパイルすることができないので修正する
ことはできなかった。
【0008】本発明はこのような事情に鑑みて為された
ものであり、その目的は、既に存在するコンパイルドコ
ードオブジェクトをパッチ方式によって修正することが
できる新規なコンパイルドコードオブジェクトのパッチ
処理方式を提供することにある。
ものであり、その目的は、既に存在するコンパイルドコ
ードオブジェクトをパッチ方式によって修正することが
できる新規なコンパイルドコードオブジェクトのパッチ
処理方式を提供することにある。
【0009】
【課題を解決するための手段】本発明は上記の目的を達
成するために、ソースプログラムを翻訳してコンパイル
ドコードオブジェクトを出力するコンパイラと該コンパ
イラが出力したコンパイルドコードオブジェクトを記憶
領域にロードして解釈実行するインタプリタとを含む言
語処理システムにおけるコンパイルドコードオブジェク
トのパッチ処理方式において、修正対象のコンパイルド
コードオブジェクトを格納するファイルと、修正内容で
ある機械語命令列を格納するパッチイメージ格納部と、
前記修正対象のコンパイルドコードオブジェクトの修正
位置と該修正位置に適用すべき前記パッチイメージ格納
部中の機械語命令列との関係を示す修正情報を入力する
修正情報入力手段と、追加パッチ領域とを備え、且つ、
前記インタプリタ内のローダに、前記入力された修正情
報に基づき、前記ファイル中のコンパイルドコードオブ
ジェクトの修正箇所を認識すると共に該修正箇所を短命
令列修正方法で修正するか、長命令列修正方法で修正す
るかを判定する判定部と、該判定部により短命令列修正
方法で修正すると判定された前記コンパイルドコードオ
ブジェクトの修正箇所を前記パッチイメージ格納部に格
納された該当する機械語命令列で書き換える短命令列修
正手段と、前記判定部により長命令列修正方法で修正す
ると判定された前記コンパイルドコードオブジェクトの
修正箇所をパッチエリアに分岐する命令で書き換えると
共に、前記パッチイメージ格納部に格納された該当する
機械語命令列と前記修正箇所へ制御を戻す命令とを前記
追加パッチ領域に格納する長命令列修正手段と、前記修
正後のコンパイルドコードオブジェクトおよび前記追加
パッチ領域の内容を前記記憶領域にロードする修正ファ
イルロード手段とを備えている。
成するために、ソースプログラムを翻訳してコンパイル
ドコードオブジェクトを出力するコンパイラと該コンパ
イラが出力したコンパイルドコードオブジェクトを記憶
領域にロードして解釈実行するインタプリタとを含む言
語処理システムにおけるコンパイルドコードオブジェク
トのパッチ処理方式において、修正対象のコンパイルド
コードオブジェクトを格納するファイルと、修正内容で
ある機械語命令列を格納するパッチイメージ格納部と、
前記修正対象のコンパイルドコードオブジェクトの修正
位置と該修正位置に適用すべき前記パッチイメージ格納
部中の機械語命令列との関係を示す修正情報を入力する
修正情報入力手段と、追加パッチ領域とを備え、且つ、
前記インタプリタ内のローダに、前記入力された修正情
報に基づき、前記ファイル中のコンパイルドコードオブ
ジェクトの修正箇所を認識すると共に該修正箇所を短命
令列修正方法で修正するか、長命令列修正方法で修正す
るかを判定する判定部と、該判定部により短命令列修正
方法で修正すると判定された前記コンパイルドコードオ
ブジェクトの修正箇所を前記パッチイメージ格納部に格
納された該当する機械語命令列で書き換える短命令列修
正手段と、前記判定部により長命令列修正方法で修正す
ると判定された前記コンパイルドコードオブジェクトの
修正箇所をパッチエリアに分岐する命令で書き換えると
共に、前記パッチイメージ格納部に格納された該当する
機械語命令列と前記修正箇所へ制御を戻す命令とを前記
追加パッチ領域に格納する長命令列修正手段と、前記修
正後のコンパイルドコードオブジェクトおよび前記追加
パッチ領域の内容を前記記憶領域にロードする修正ファ
イルロード手段とを備えている。
【0010】
【作用】本発明のコンパイルドコードオブジェクトのパ
ッチ処理方式においては、ファイルが修正対象のコンパ
イルドコードオブジェクトを保持すると共にパッチイメ
ージ格納部が修正内容である機械語命令列を保持し、修
正情報入力手段が修正対象のコンパイルドコードオブジ
ェクトの修正位置とその修正位置に適用すべきパッチイ
メージ格納部中の機械語命令列との関係を示す修正情報
を入力する。
ッチ処理方式においては、ファイルが修正対象のコンパ
イルドコードオブジェクトを保持すると共にパッチイメ
ージ格納部が修正内容である機械語命令列を保持し、修
正情報入力手段が修正対象のコンパイルドコードオブジ
ェクトの修正位置とその修正位置に適用すべきパッチイ
メージ格納部中の機械語命令列との関係を示す修正情報
を入力する。
【0011】インタプリタ内のローダによるコンパイル
ドコードオブジェクトのロードに際し、ローダ内の判定
部が、入力された修正情報に基づき、ファイル中のコン
パイルドコードオブジェクトの修正箇所を認識すると共
にその修正箇所を短命令列修正方法で修正するか、長命
令列修正方法で修正するかを判定し、短命令列修正方法
で修正すると判定された場合、短命令列修正手段が、コ
ンパイルドコードオブジェクトの修正箇所をパッチイメ
ージ格納部に格納された該当する機械語命令列で書き換
え、長命令列修正方法で修正すると判定された場合、長
命令列修正手段が、コンパイルドコードオブジェクトの
修正箇所をパッチエリアに分岐する命令で書き換えると
共に、パッチイメージ格納部に格納された該当する機械
語命令列と前記修正箇所へ制御を戻す命令とを追加パッ
チ領域に格納する。
ドコードオブジェクトのロードに際し、ローダ内の判定
部が、入力された修正情報に基づき、ファイル中のコン
パイルドコードオブジェクトの修正箇所を認識すると共
にその修正箇所を短命令列修正方法で修正するか、長命
令列修正方法で修正するかを判定し、短命令列修正方法
で修正すると判定された場合、短命令列修正手段が、コ
ンパイルドコードオブジェクトの修正箇所をパッチイメ
ージ格納部に格納された該当する機械語命令列で書き換
え、長命令列修正方法で修正すると判定された場合、長
命令列修正手段が、コンパイルドコードオブジェクトの
修正箇所をパッチエリアに分岐する命令で書き換えると
共に、パッチイメージ格納部に格納された該当する機械
語命令列と前記修正箇所へ制御を戻す命令とを追加パッ
チ領域に格納する。
【0012】そして、修正ファイルロード手段が、修正
後のコンパイルドコードオブジェクトおよび前記追加パ
ッチ領域の内容を記憶領域にロードする。
後のコンパイルドコードオブジェクトおよび前記追加パ
ッチ領域の内容を記憶領域にロードする。
【0013】
【実施例】次に本発明の実施例について図面を参照して
詳細に説明する。
詳細に説明する。
【0014】図1を参照すると、本発明を適用した言語
処理システム1は、コンパイラ2とインタプリタ3と記
憶領域4とを含み、ファイル5,パッチイメージ格納部
6,修正情報入力部7および追加パッチ領域9が接続さ
れている。
処理システム1は、コンパイラ2とインタプリタ3と記
憶領域4とを含み、ファイル5,パッチイメージ格納部
6,修正情報入力部7および追加パッチ領域9が接続さ
れている。
【0015】インタプリタ3はコンパイルドコードオブ
ジェクトを記憶領域4にロードするローダ8を有し、こ
のローダ8には修正部85および修正ファイルロード手
段84が設けられている。また、修正部85には判定部
81,短命令列修正手段82および長命令列修正手段8
3が設けられている。
ジェクトを記憶領域4にロードするローダ8を有し、こ
のローダ8には修正部85および修正ファイルロード手
段84が設けられている。また、修正部85には判定部
81,短命令列修正手段82および長命令列修正手段8
3が設けられている。
【0016】ファイル5には、修正対象のコンパイルド
コードオブジェクト51が格納されている。このコンパ
イルドコードオブジェクト51はコンパイラ2が図示し
ないソースプログラムを翻訳することにより生成出力し
たものである。
コードオブジェクト51が格納されている。このコンパ
イルドコードオブジェクト51はコンパイラ2が図示し
ないソースプログラムを翻訳することにより生成出力し
たものである。
【0017】パッチイメージ格納部6には、修正内容で
ある機械語命令列61が格納されている。
ある機械語命令列61が格納されている。
【0018】修正情報入力部7は、修正対象のコンパイ
ルドコードオブジェクト51の修正位置とその修正位置
に適用すべき機械語命令列61との関係を示す修正情報
71を入力するための手段である。
ルドコードオブジェクト51の修正位置とその修正位置
に適用すべき機械語命令列61との関係を示す修正情報
71を入力するための手段である。
【0019】言語処理システム1は、コンパイラ2が出
力したコンパイルドコードオブジェクトをインタプリタ
3が記憶領域4にロードして解釈実行することで所定の
機能を達成しているが、既に存在するコンパイルドコー
ドオブジェクトの一部に不正な機械語命令が含まれてい
ると所期の機能を達成することができない。そこで、コ
ンパイルドコードオブジェクトを正しい機械語命令で置
き換えるパッチ処理を施すわけであるが、本実施例で
は、このパッチ処理をインタプリタ3のローダ8におい
て、以下のように実施する。
力したコンパイルドコードオブジェクトをインタプリタ
3が記憶領域4にロードして解釈実行することで所定の
機能を達成しているが、既に存在するコンパイルドコー
ドオブジェクトの一部に不正な機械語命令が含まれてい
ると所期の機能を達成することができない。そこで、コ
ンパイルドコードオブジェクトを正しい機械語命令で置
き換えるパッチ処理を施すわけであるが、本実施例で
は、このパッチ処理をインタプリタ3のローダ8におい
て、以下のように実施する。
【0020】先ず、利用者は置き換えに使用する正しい
機械語命令列61を作成してパッチイメージ格納部6に
記憶し、また修正対象のコンパイルドコードオブジェク
ト51の修正位置とその修正位置に適用すべきパッチイ
メージ格納部6中の機械語命令列61との関係を示す修
正情報71を作成する。
機械語命令列61を作成してパッチイメージ格納部6に
記憶し、また修正対象のコンパイルドコードオブジェク
ト51の修正位置とその修正位置に適用すべきパッチイ
メージ格納部6中の機械語命令列61との関係を示す修
正情報71を作成する。
【0021】例えば、コンパイルドコードオブジェクト
の先頭から100バイト目〜107バイト目にある合計
8バイトの機械語命令列を図2に示すような4バイトの
機械語命令M1で修正し、200バイト目〜207バイ
ト目にある合計8バイトの機械語命令を図2に示すよう
な合計12バイトの機械語命令M2−1,M2−2,M
2−3で修正する場合、機械語命令M1から構成される
機械語命令列61−1と機械語命令M2−1,M2−
2,M2−3から構成される機械語命令列61−2とを
パッチイメージ格納部6に記憶すると共に、(修正開始
位置=100バイト目,修正終了位置=108バイト
目,適用機械語命令列=61−1)という修正情報と、
(修正開始位置=200バイト目,修正終了位置=20
8バイト目,適用機械語命令列=61−2)という修正
情報とを含む修正情報71を作成する。
の先頭から100バイト目〜107バイト目にある合計
8バイトの機械語命令列を図2に示すような4バイトの
機械語命令M1で修正し、200バイト目〜207バイ
ト目にある合計8バイトの機械語命令を図2に示すよう
な合計12バイトの機械語命令M2−1,M2−2,M
2−3で修正する場合、機械語命令M1から構成される
機械語命令列61−1と機械語命令M2−1,M2−
2,M2−3から構成される機械語命令列61−2とを
パッチイメージ格納部6に記憶すると共に、(修正開始
位置=100バイト目,修正終了位置=108バイト
目,適用機械語命令列=61−1)という修正情報と、
(修正開始位置=200バイト目,修正終了位置=20
8バイト目,適用機械語命令列=61−2)という修正
情報とを含む修正情報71を作成する。
【0022】このような修正情報71が修正情報入力部
7から入力されてインタプリタ3に対しコンパイルドコ
ードオブジェクト51のロードが指示されると、ローダ
8が以下のような処理を行う。
7から入力されてインタプリタ3に対しコンパイルドコ
ードオブジェクト51のロードが指示されると、ローダ
8が以下のような処理を行う。
【0023】ローダ8の修正部85における判定部81
は、修正情報入力部7から1つの修正情報を読み込み、
この修正情報によって指示されているコンパイルドコー
ドオブジェクト51の修正箇所のサイズとその修正箇所
に適用すべき機械語命令列のサイズとを比較し、前者が
後者より大きいか等しければ修正方法を短命令列修正方
法と決定し、前者が後者より小さければ修正方法を長命
令列修正方法と決定する。
は、修正情報入力部7から1つの修正情報を読み込み、
この修正情報によって指示されているコンパイルドコー
ドオブジェクト51の修正箇所のサイズとその修正箇所
に適用すべき機械語命令列のサイズとを比較し、前者が
後者より大きいか等しければ修正方法を短命令列修正方
法と決定し、前者が後者より小さければ修正方法を長命
令列修正方法と決定する。
【0024】修正部85の短命令列修正手段82は、判
定部81により短命令列修正方法で修正すると決定され
たコンパイルドコードオブジェクト51の修正箇所を、
パッチイメージ格納部6に格納された該当する機械語命
令列で書き換える。
定部81により短命令列修正方法で修正すると決定され
たコンパイルドコードオブジェクト51の修正箇所を、
パッチイメージ格納部6に格納された該当する機械語命
令列で書き換える。
【0025】他方、長命令列修正手段83は、判定部8
1により長命令列修正方法で修正すると決定されたコン
パイルドコードオブジェクト51の修正箇所を、パッチ
エリア42に分岐する命令で書き換えると共に、パッチ
イメージ格納部6に格納された該当する機械語命令列と
前記修正箇所へ制御を戻す命令とを追加パッチ領域9に
格納する。
1により長命令列修正方法で修正すると決定されたコン
パイルドコードオブジェクト51の修正箇所を、パッチ
エリア42に分岐する命令で書き換えると共に、パッチ
イメージ格納部6に格納された該当する機械語命令列と
前記修正箇所へ制御を戻す命令とを追加パッチ領域9に
格納する。
【0026】例えば図2の場合、(修正開始位置=10
0バイト目,修正終了位置=108バイト目,適用機械
語命令列=61−1)という修正情報に基づき、判定部
81は、修正箇所のサイズ=8(108−100)バイ
トと、その修正箇所に適用すべき機械語命令列61−1
のサイズ=4バイトとを比較し、前者が後者より小さい
ので、短命令列修正方法で修正すると決定する。
0バイト目,修正終了位置=108バイト目,適用機械
語命令列=61−1)という修正情報に基づき、判定部
81は、修正箇所のサイズ=8(108−100)バイ
トと、その修正箇所に適用すべき機械語命令列61−1
のサイズ=4バイトとを比較し、前者が後者より小さい
ので、短命令列修正方法で修正すると決定する。
【0027】このため、短命令列修正手段82は、図2
に示すように、コンパイルドコードオブジェクト51の
修正箇所の100バイト目の内容を機械語命令列61−
1を構成する機械語命令M1で書き換え、修正箇所の残
りの4バイトを何もしない命令であるNOP命令で書き
換える。
に示すように、コンパイルドコードオブジェクト51の
修正箇所の100バイト目の内容を機械語命令列61−
1を構成する機械語命令M1で書き換え、修正箇所の残
りの4バイトを何もしない命令であるNOP命令で書き
換える。
【0028】また、(修正開始位置=200バイト目,
修正終了位置=208バイト目,適用機械語命令列=6
1−2)という修正情報に基づき、判定部81は、修正
箇所のサイズ=8(208−200)バイトと、その修
正箇所に適用する機械語命令列61−2のサイズ=12
バイトとを比較し、前者が後者より大きいので、長命令
列修正方法で修正すると決定する。
修正終了位置=208バイト目,適用機械語命令列=6
1−2)という修正情報に基づき、判定部81は、修正
箇所のサイズ=8(208−200)バイトと、その修
正箇所に適用する機械語命令列61−2のサイズ=12
バイトとを比較し、前者が後者より大きいので、長命令
列修正方法で修正すると決定する。
【0029】このため、長命令列修正手段83は、図2
に示すように、コンパイルドコードオブジェクト51の
修正箇所の200バイト目の内容をパッチエリア42に
分岐する命令B1で書き換える。更に、追加パッチ領域
9の先頭から16バイトの領域に、今回の修正箇所に適
用すべき機械語命令列61−2を構成する機械語命令M
2−1,M2−2,M2−3と、これらの命令実行後に
修正箇所の終端つまり修正すべき機械語命令列の次の命
令が実行されるように制御をコンパイルドコードオブジ
ェクト51に移す命令B2とを格納する。
に示すように、コンパイルドコードオブジェクト51の
修正箇所の200バイト目の内容をパッチエリア42に
分岐する命令B1で書き換える。更に、追加パッチ領域
9の先頭から16バイトの領域に、今回の修正箇所に適
用すべき機械語命令列61−2を構成する機械語命令M
2−1,M2−2,M2−3と、これらの命令実行後に
修正箇所の終端つまり修正すべき機械語命令列の次の命
令が実行されるように制御をコンパイルドコードオブジ
ェクト51に移す命令B2とを格納する。
【0030】次に、修正部85の上述した処理が終了す
ると、ローダ8の修正ファイルロード手段84は、ファ
イル5中の修正後のコンパイルドコードオブジェクト5
1を記憶領域4のコンパイルドコードオブジェクトをロ
ードするための領域41にロードすると共に追加パッチ
領域9の内容を記憶領域4のパッチエリア42にロード
する。
ると、ローダ8の修正ファイルロード手段84は、ファ
イル5中の修正後のコンパイルドコードオブジェクト5
1を記憶領域4のコンパイルドコードオブジェクトをロ
ードするための領域41にロードすると共に追加パッチ
領域9の内容を記憶領域4のパッチエリア42にロード
する。
【0031】以上のような処理が行われることにより、
記憶領域4には修正後のコンパイルドコードオブジェク
ト51がロードされたことになる。
記憶領域4には修正後のコンパイルドコードオブジェク
ト51がロードされたことになる。
【0032】次に、記憶領域4上の一関数のコンパイル
ドコードオブジェクトの終端からの領域をパッチエリア
42として使用し、且つ、ファイル5上のコンパイルド
コードオブジェクト51の終端からの領域を追加パッチ
領域9として使用する実施例について説明する。
ドコードオブジェクトの終端からの領域をパッチエリア
42として使用し、且つ、ファイル5上のコンパイルド
コードオブジェクト51の終端からの領域を追加パッチ
領域9として使用する実施例について説明する。
【0033】図3はこのような実施例においてローダ8
が実行する処理の一例を示すフローチャートである。な
お、図3中、ステップS1〜S4は判定部81で、ステ
ップS5は短命令列修正手段82で、ステップS6〜S
10は長命令列修正手段83で、ステップS11は修正
ファイルロード手段84で実行される。
が実行する処理の一例を示すフローチャートである。な
お、図3中、ステップS1〜S4は判定部81で、ステ
ップS5は短命令列修正手段82で、ステップS6〜S
10は長命令列修正手段83で、ステップS11は修正
ファイルロード手段84で実行される。
【0034】図3に示すようにローダ8は動作を開始す
ると、先ず、パッチエリア42の使用領域を管理するポ
インタPEを0に初期化する(S1)。
ると、先ず、パッチエリア42の使用領域を管理するポ
インタPEを0に初期化する(S1)。
【0035】次に、修正情報入力部7から1つの修正情
報を読み込み(S2)、修正情報の終了か否かを判断し
(S3)、終了でなければ、今回ステップS2で読み込
んだ修正情報に基づきコンパイルドコードオブジェクト
51の修正箇所のサイズとその修正箇所に適用すべき機
械語命令列のサイズとを比較し(S4)、前者が後者よ
り大きいか等しければ修正方法を短命令列修正方法と決
定し、前者が後者より小さければ修正方法を長命令列修
正方法と決定する。そして、短命令列修正方法で修正す
る場合はステップS5を実行してステップS2に戻り、
長命令列修正方法で修正する場合はステップS6〜S8
を実行してステップS2に戻る。
報を読み込み(S2)、修正情報の終了か否かを判断し
(S3)、終了でなければ、今回ステップS2で読み込
んだ修正情報に基づきコンパイルドコードオブジェクト
51の修正箇所のサイズとその修正箇所に適用すべき機
械語命令列のサイズとを比較し(S4)、前者が後者よ
り大きいか等しければ修正方法を短命令列修正方法と決
定し、前者が後者より小さければ修正方法を長命令列修
正方法と決定する。そして、短命令列修正方法で修正す
る場合はステップS5を実行してステップS2に戻り、
長命令列修正方法で修正する場合はステップS6〜S8
を実行してステップS2に戻る。
【0036】従って、図2に示した例では、(修正開始
位置=100バイト目,修正終了位置=108バイト
目,適用機械語命令列=61−1)という修正情報の場
合、修正箇所のサイズが修正箇所に適用すべき機械語命
令列61−1のサイズより大きいので、短命令列修正方
法で修正すると判定され(S4でYES)、図2に示す
ように、コンパイルドコードオブジェクト51の修正箇
所の100バイト目の内容を機械語命令列61−1を構
成する機械語命令M1で書き換え、修正箇所の残りの4
バイトを何もしない命令であるNOP命令で書き換える
(S5)。
位置=100バイト目,修正終了位置=108バイト
目,適用機械語命令列=61−1)という修正情報の場
合、修正箇所のサイズが修正箇所に適用すべき機械語命
令列61−1のサイズより大きいので、短命令列修正方
法で修正すると判定され(S4でYES)、図2に示す
ように、コンパイルドコードオブジェクト51の修正箇
所の100バイト目の内容を機械語命令列61−1を構
成する機械語命令M1で書き換え、修正箇所の残りの4
バイトを何もしない命令であるNOP命令で書き換える
(S5)。
【0037】また、(修正開始位置=200バイト目,
修正終了位置=208バイト目,適用機械語命令列=6
1−2)という修正情報の場合、修正箇所のサイズが修
正箇所に適用する機械語命令列61−2のサイズより小
さいので、長命令列修正方法で修正すると判定される
(S4でNO)。
修正終了位置=208バイト目,適用機械語命令列=6
1−2)という修正情報の場合、修正箇所のサイズが修
正箇所に適用する機械語命令列61−2のサイズより小
さいので、長命令列修正方法で修正すると判定される
(S4でNO)。
【0038】このため、先ずステップS6が実行され、
修正箇所からパッチエリア42内の今回使用する場所ま
での分岐幅を計算する。
修正箇所からパッチエリア42内の今回使用する場所ま
での分岐幅を計算する。
【0039】本実施例の場合、コンパイルドコードオブ
ジェクトの終端からの領域をパッチエリアとして使用す
るので、分岐幅は以下の計算式で求められる。 分岐幅=コンパイルドコードオブジェクト51のサイズ −今回の修正箇所の修正開始位置 +ポインタPEの値
ジェクトの終端からの領域をパッチエリアとして使用す
るので、分岐幅は以下の計算式で求められる。 分岐幅=コンパイルドコードオブジェクト51のサイズ −今回の修正箇所の修正開始位置 +ポインタPEの値
【0040】なお、コンパイルドコードオブジェクト5
1のサイズは、図4に示すようにコンパイルドコードオ
ブジェクト51中のヘッダ情報中に記述されているもの
を使用する。
1のサイズは、図4に示すようにコンパイルドコードオ
ブジェクト51中のヘッダ情報中に記述されているもの
を使用する。
【0041】従って、コンパイルドコードオブジェクト
51のサイズを1000バイトとすると、今回の修正箇
所の修正開始位置は200バイト目であり、現時点のポ
インタPEの値は0なので、分岐幅は1000−200
+0=800となる。
51のサイズを1000バイトとすると、今回の修正箇
所の修正開始位置は200バイト目であり、現時点のポ
インタPEの値は0なので、分岐幅は1000−200
+0=800となる。
【0042】次に、ステップS7において、分岐幅80
0の分岐命令を生成し、図4に示すように修正箇所の先
頭の内容をその分岐命令B11で書き換える。
0の分岐命令を生成し、図4に示すように修正箇所の先
頭の内容をその分岐命令B11で書き換える。
【0043】そして、今回の修正に使用する機械語命令
例61−2は12バイトであり、この命令列実行後に修
正箇所の直後に分岐する命令として4バイトが必要なの
で、合計16バイトに相当する値「16」をポインタP
Eに加算し(S8)、ステップS2に戻る。
例61−2は12バイトであり、この命令列実行後に修
正箇所の直後に分岐する命令として4バイトが必要なの
で、合計16バイトに相当する値「16」をポインタP
Eに加算し(S8)、ステップS2に戻る。
【0044】以上のような処理を行い、ステップS3で
YESと判定されたら、即ち修正情報71の全てを処理
し終えたら、ステップS9へ進み、全ての長命令列修正
方法による機械語命令列について、修正エリア分岐命令
を生成して付加し、ファイル5中のコンパイルドコード
オブジェクト51の後ろの追加パッチ領域91にまとめ
て追加する。
YESと判定されたら、即ち修正情報71の全てを処理
し終えたら、ステップS9へ進み、全ての長命令列修正
方法による機械語命令列について、修正エリア分岐命令
を生成して付加し、ファイル5中のコンパイルドコード
オブジェクト51の後ろの追加パッチ領域91にまとめ
て追加する。
【0045】図2の場合、長命令列修正方法による修正
箇所は1つだけなので、図4に示すように、その修正箇
所に適用する機械語命令M2−1,M2−2,M2−3
とコンパイルドコードオブジェクト51の208バイト
目に分岐する修正エリア分岐命令B21とが追加パッチ
領域91に格納される。
箇所は1つだけなので、図4に示すように、その修正箇
所に適用する機械語命令M2−1,M2−2,M2−3
とコンパイルドコードオブジェクト51の208バイト
目に分岐する修正エリア分岐命令B21とが追加パッチ
領域91に格納される。
【0046】次に、追加パッチ領域91に格納された機
械語命令列のサイズ分だけ図4のコンパイルドコードオ
ブジェクト51中のサイズ情報を修正し(S10)、そ
の後、ファイル5中の修正後のコンパイルドコードオブ
ジェクト51(追加パッチ領域の内容を含む)を記憶領
域4にロードする。
械語命令列のサイズ分だけ図4のコンパイルドコードオ
ブジェクト51中のサイズ情報を修正し(S10)、そ
の後、ファイル5中の修正後のコンパイルドコードオブ
ジェクト51(追加パッチ領域の内容を含む)を記憶領
域4にロードする。
【0047】次に、記憶領域4上のコンパイルドコード
オブジェクトの終端からの領域とは別の領域であって或
るレジスタRによって先頭が指示され且つ複数のコンパ
イルドコードオブジェクトで共用される領域をパッチエ
リア42として使用すると共に、追加パッチ領域9をコ
ンパイルドコードオブジェクト毎に備える実施例につい
て説明する。なお、この場合、各追加パッチ領域9は対
応するコンパイルドコードオブジェクトが格納されてい
るファイル5中に設けられているものとする。
オブジェクトの終端からの領域とは別の領域であって或
るレジスタRによって先頭が指示され且つ複数のコンパ
イルドコードオブジェクトで共用される領域をパッチエ
リア42として使用すると共に、追加パッチ領域9をコ
ンパイルドコードオブジェクト毎に備える実施例につい
て説明する。なお、この場合、各追加パッチ領域9は対
応するコンパイルドコードオブジェクトが格納されてい
るファイル5中に設けられているものとする。
【0048】図5および図6はこのような実施例におい
てローダ8が実行する処理の一例を示すフローチャート
である。
てローダ8が実行する処理の一例を示すフローチャート
である。
【0049】図5および図6の処理が図3の処理と相違
するところは、図3のステップS6〜S8がステップS
21,S22に変更され、図3のステップS9〜S11
がステップS23〜S31に変更されていることなの
で、相違点にかかる動作のみ以下説明する。
するところは、図3のステップS6〜S8がステップS
21,S22に変更され、図3のステップS9〜S11
がステップS23〜S31に変更されていることなの
で、相違点にかかる動作のみ以下説明する。
【0050】ローダ8は、ステップS4で長命令列修正
方法で修正すると判定した場合、レジスタRおよびスタ
ックを使用する仮のサブルーチン分岐命令を生成し、フ
ァイル5中のコンパイルドコードオブジェクト51の修
正箇所を、その仮のサブルーチン分岐命令および必要に
応じNOP命令で書き換える(S21)。
方法で修正すると判定した場合、レジスタRおよびスタ
ックを使用する仮のサブルーチン分岐命令を生成し、フ
ァイル5中のコンパイルドコードオブジェクト51の修
正箇所を、その仮のサブルーチン分岐命令および必要に
応じNOP命令で書き換える(S21)。
【0051】ここで、仮のサブルーチン分岐命令とは、
現在のアドレスをスタックに積んだ後、命令中に記述さ
れた分岐幅だけ離れた場所へ分岐する命令(本来のサブ
ルーチン分岐命令)であって、その分岐幅が未だ確定し
ておらず従って分岐幅の記述箇所に目印となる記号およ
び或る数値が埋込まれた命令をいう。
現在のアドレスをスタックに積んだ後、命令中に記述さ
れた分岐幅だけ離れた場所へ分岐する命令(本来のサブ
ルーチン分岐命令)であって、その分岐幅が未だ確定し
ておらず従って分岐幅の記述箇所に目印となる記号およ
び或る数値が埋込まれた命令をいう。
【0052】このような仮のサブルーチン分岐命令を使
用するのは、本実施例の場合、記憶領域4中のパッチエ
リアを複数のコンパイルドコードオブジェクトで共用す
るが、追加パッチ領域は各コンパイルドコードオブジェ
クトで独立に管理され、そのロードも別々に行われるた
め、現在処理しているコンパイルドコードオブジェクト
の長命令列修正方法による機械語命令列がパッチエリア
のどの箇所以降の領域に格納されるかは、未だこの時点
では確定していないことによる。
用するのは、本実施例の場合、記憶領域4中のパッチエ
リアを複数のコンパイルドコードオブジェクトで共用す
るが、追加パッチ領域は各コンパイルドコードオブジェ
クトで独立に管理され、そのロードも別々に行われるた
め、現在処理しているコンパイルドコードオブジェクト
の長命令列修正方法による機械語命令列がパッチエリア
のどの箇所以降の領域に格納されるかは、未だこの時点
では確定していないことによる。
【0053】また、仮のサブルーチン分岐命令の分岐幅
部分に埋込まれる数値は、ポインタPEの値である。
部分に埋込まれる数値は、ポインタPEの値である。
【0054】従って、図2のコンパイルドコードオブジ
ェクト51の200バイト目〜203バイト目の修正箇
所の場合、その時点のポインタPEの値は0なので、分
岐幅部分に仮のサブルーチン分岐命令であることを示す
目印と数値0とが埋込まれた仮のサブルーチン分岐命令
が生成され、これで図7に示すようにファイル5中のコ
ンパイルドコードオブジェクト51の修正箇所の200
バイト目の内容が書き換えられ、続く4バイトの内容が
NOP命令で書き換えられる。
ェクト51の200バイト目〜203バイト目の修正箇
所の場合、その時点のポインタPEの値は0なので、分
岐幅部分に仮のサブルーチン分岐命令であることを示す
目印と数値0とが埋込まれた仮のサブルーチン分岐命令
が生成され、これで図7に示すようにファイル5中のコ
ンパイルドコードオブジェクト51の修正箇所の200
バイト目の内容が書き換えられ、続く4バイトの内容が
NOP命令で書き換えられる。
【0055】なお、ステップS21の実行後、ステップ
S22にて、今回の修正に使用する機械語命令例61−
2のサイズとこの命令列実行後に修正箇所に制御を戻す
命令のサイズとの合計サイズに相当する16バイト分だ
けポインタPEが更新される。
S22にて、今回の修正に使用する機械語命令例61−
2のサイズとこの命令列実行後に修正箇所に制御を戻す
命令のサイズとの合計サイズに相当する16バイト分だ
けポインタPEが更新される。
【0056】次にステップS3で全ての修正情報の処理
を終えたことを判定すると、全ての長命令列修正方法に
よる機械語命令列について、修正エリアリターン命令を
生成して付加し、図7のファイル5中の追加パッチ領域
92にまとめて格納する(S23)。
を終えたことを判定すると、全ての長命令列修正方法に
よる機械語命令列について、修正エリアリターン命令を
生成して付加し、図7のファイル5中の追加パッチ領域
92にまとめて格納する(S23)。
【0057】ここで、修正エリアリターン命令とは、ス
タックに積まれたアドレスにもどる命令である。
タックに積まれたアドレスにもどる命令である。
【0058】図2の場合、長命令列修正方法による修正
箇所は1つだけなので、図7に示すように、その修正箇
所に適用する機械語命令M2−1,M2−2,M2−3
と修正エリアリターン命令B22とが追加パッチ領域9
2に格納される。
箇所は1つだけなので、図7に示すように、その修正箇
所に適用する機械語命令M2−1,M2−2,M2−3
と修正エリアリターン命令B22とが追加パッチ領域9
2に格納される。
【0059】以上の処理後、以下のようにして、ファイ
ル5中の修正後のコンパイルドコードオブジェクト51
と追加パッチ領域92の内容を記憶領域4にロードす
る。
ル5中の修正後のコンパイルドコードオブジェクト51
と追加パッチ領域92の内容を記憶領域4にロードす
る。
【0060】先ず、追加パッチ領域92の内容を図7の
記憶領域4のパッチエリア42’にロードする(S2
4)。このとき、パッチエリア42’が空であれば先頭
の領域にロードするが、既に別の内容がロードされてい
る場合にはその直後の領域にロードする。そして、この
ときパッチエリア42’のどの箇所からロードしたかを
示すロード位置を変数Lに設定しておく(S25)。図
7の場合、パッチエリア42’の10バイト目以降にロ
ードしたので、L=10と設定しておく。
記憶領域4のパッチエリア42’にロードする(S2
4)。このとき、パッチエリア42’が空であれば先頭
の領域にロードするが、既に別の内容がロードされてい
る場合にはその直後の領域にロードする。そして、この
ときパッチエリア42’のどの箇所からロードしたかを
示すロード位置を変数Lに設定しておく(S25)。図
7の場合、パッチエリア42’の10バイト目以降にロ
ードしたので、L=10と設定しておく。
【0061】次にファイル5中の修正後のコンパイルド
コードオブジェクト51を4バイトずつ読み出し(S2
6)、読み出した4バイトの内容が仮のサブルーチン分
岐命令か否かを判定し(S28)、仮のサブルーチン分
岐命令でなければ(S28でNO)、読み出し内容を図
7の記憶領域4の領域41にロードする(S29)。
コードオブジェクト51を4バイトずつ読み出し(S2
6)、読み出した4バイトの内容が仮のサブルーチン分
岐命令か否かを判定し(S28)、仮のサブルーチン分
岐命令でなければ(S28でNO)、読み出し内容を図
7の記憶領域4の領域41にロードする(S29)。
【0062】他方、読み出し内容が仮のサブルーチン分
岐命令のときは(S28でYES)、変数Lの値を用い
て仮のサブルーチン分岐命令を修正し(S30)、この
修正したサブルーチン分岐命令を記憶領域4の領域41
にロードする(S31)。
岐命令のときは(S28でYES)、変数Lの値を用い
て仮のサブルーチン分岐命令を修正し(S30)、この
修正したサブルーチン分岐命令を記憶領域4の領域41
にロードする(S31)。
【0063】例えば、図7の仮のサブルーチン分岐命令
B12の場合、分岐幅部分に埋込まれた数値は0であ
り、変数Lの値は10なので、0と10を加算した値1
0を分岐幅として分岐幅部分に書き込んでサブルーチン
分岐命令B13をロードする。
B12の場合、分岐幅部分に埋込まれた数値は0であ
り、変数Lの値は10なので、0と10を加算した値1
0を分岐幅として分岐幅部分に書き込んでサブルーチン
分岐命令B13をロードする。
【0064】以上のような処理を繰り返し、ステップS
27でコンパイルドコードオブジェクト51の全ての内
容を処理し終えたことを判定すると処理を終了する。
27でコンパイルドコードオブジェクト51の全ての内
容を処理し終えたことを判定すると処理を終了する。
【0065】次に、記憶領域4上のコンパイルドコード
オブジェクトの終端からの領域とは別の領域であって或
るレジスタRによって先頭が指示され且つ複数のコンパ
イルドコードオブジェクトで共用される領域をパッチエ
リアとして使用すると共に、追加パッチ領域9を複数の
コンパイルドコードオブジェクトで共用されるパッチ格
納ファイルで構成して関数単位のパッチ内容をコンパイ
ルドコードオブジェクト単位に管理するのではなく一つ
の言語処理システムにおける全関数のパッチ内容を一括
して格納管理する実施例について説明する。
オブジェクトの終端からの領域とは別の領域であって或
るレジスタRによって先頭が指示され且つ複数のコンパ
イルドコードオブジェクトで共用される領域をパッチエ
リアとして使用すると共に、追加パッチ領域9を複数の
コンパイルドコードオブジェクトで共用されるパッチ格
納ファイルで構成して関数単位のパッチ内容をコンパイ
ルドコードオブジェクト単位に管理するのではなく一つ
の言語処理システムにおける全関数のパッチ内容を一括
して格納管理する実施例について説明する。
【0066】図8はこのような実施例においてローダ8
が実行する処理の一例を示すフローチャートである。
が実行する処理の一例を示すフローチャートである。
【0067】図8の処理が図3の処理と相違するところ
は、図3のステップS1とS2の間にステップS41,
S42が挿入され、ステップS6〜S8がステップS4
3〜S45に変更され、ステップS9〜S11がステッ
プS46,S47に変更されていることである。以下、
相違点にかかる動作のみ説明する。
は、図3のステップS1とS2の間にステップS41,
S42が挿入され、ステップS6〜S8がステップS4
3〜S45に変更され、ステップS9〜S11がステッ
プS46,S47に変更されていることである。以下、
相違点にかかる動作のみ説明する。
【0068】ローダ8は、ロードすべきコンパイルドコ
ードオブジェクトが複数存在する場合、先ず、その1つ
に注目し(S41)、この注目したコンパイルドコード
オブジェクトについてステップS2〜S5,S43〜S
45の処理を行い、それが終了すれば別のコンパイルド
コードオブジェクトに注目し同様の処理を行う。そし
て、全てのコンパイルドコードオブジェクトについてス
テップS2〜S5,S43〜S45の処理を行うと(S
42でYES)、ステップS46,S47の処理を行
う。
ードオブジェクトが複数存在する場合、先ず、その1つ
に注目し(S41)、この注目したコンパイルドコード
オブジェクトについてステップS2〜S5,S43〜S
45の処理を行い、それが終了すれば別のコンパイルド
コードオブジェクトに注目し同様の処理を行う。そし
て、全てのコンパイルドコードオブジェクトについてス
テップS2〜S5,S43〜S45の処理を行うと(S
42でYES)、ステップS46,S47の処理を行
う。
【0069】或るコンパイルドコードオブジェクトを処
理している過程において、ローダ8は、ステップS4で
長命令列修正方法で修正すると判定すると、レジスタR
およびスタックを使用するサブルーチン分岐命令を生成
し、ファイル5中のコンパイルドコードオブジェクト5
1の修正箇所を、そのサブルーチン分岐命令および必要
に応じNOP命令で書き換える(S43)。
理している過程において、ローダ8は、ステップS4で
長命令列修正方法で修正すると判定すると、レジスタR
およびスタックを使用するサブルーチン分岐命令を生成
し、ファイル5中のコンパイルドコードオブジェクト5
1の修正箇所を、そのサブルーチン分岐命令および必要
に応じNOP命令で書き換える(S43)。
【0070】本実施例の場合、関数に対する全てのパッ
チ内容は図9に示す共通のパッチ格納ファイル93に格
納され且つその内容が図9のパッチエリア42”にその
まま格納されるため、上記のサブルーチン分岐命令の分
岐幅はこの時点で決定できる。即ち、現時点のポインタ
PEの値そのものが分岐幅となる。
チ内容は図9に示す共通のパッチ格納ファイル93に格
納され且つその内容が図9のパッチエリア42”にその
まま格納されるため、上記のサブルーチン分岐命令の分
岐幅はこの時点で決定できる。即ち、現時点のポインタ
PEの値そのものが分岐幅となる。
【0071】次に、修正エリアリターン命令を生成し、
今回の長命令列修正方法による機械語命令列に付加し、
パッチ格納ファイル93に格納する(S44)。そし
て、ポインタPEの値をその機械語命令列および修正エ
リアリターン命令のサイズ分だけ更新する(S45)。
今回の長命令列修正方法による機械語命令列に付加し、
パッチ格納ファイル93に格納する(S44)。そし
て、ポインタPEの値をその機械語命令列および修正エ
リアリターン命令のサイズ分だけ更新する(S45)。
【0072】従って、図2のコンパイルドコードオブジ
ェクト51の200バイト目〜203バイト目の修正箇
所の場合、その時点のポインタPEの値は0なので、図
9に示すように分岐幅=0のサブルーチン分岐命令B1
3が生成され、これで図9に示すようにコンパイルドコ
ードオブジェクト51の修正箇所の200バイト目の内
容が書き換えられ、続く4バイトの内容がNOP命令で
書き換えられる。
ェクト51の200バイト目〜203バイト目の修正箇
所の場合、その時点のポインタPEの値は0なので、図
9に示すように分岐幅=0のサブルーチン分岐命令B1
3が生成され、これで図9に示すようにコンパイルドコ
ードオブジェクト51の修正箇所の200バイト目の内
容が書き換えられ、続く4バイトの内容がNOP命令で
書き換えられる。
【0073】ローダ8はコンパイルドコードオブジェク
ト51に対する処理を終えると、次に処理すべきコンパ
イルドコードオブジェクトがあれば同様の動作を行う。
ここで、図9に示すように別のコンパイルドコードオブ
ジェクト51’を格納するファイル5’があり、その修
正箇所を長命令列修正方法で修正する場合、その修正箇
所に挿入するサブルーチン分岐命令の分岐幅は、その時
点のポインタPEの値16が使用され、またその長命令
列修正方法で使用する機械語命令列を構成する機械語命
令M3−1,M3−2と修正エリアリターン命令B23
とはパッチ格納ファイル93中の上記修正エリアリター
ン命令B22の直後に格納される。
ト51に対する処理を終えると、次に処理すべきコンパ
イルドコードオブジェクトがあれば同様の動作を行う。
ここで、図9に示すように別のコンパイルドコードオブ
ジェクト51’を格納するファイル5’があり、その修
正箇所を長命令列修正方法で修正する場合、その修正箇
所に挿入するサブルーチン分岐命令の分岐幅は、その時
点のポインタPEの値16が使用され、またその長命令
列修正方法で使用する機械語命令列を構成する機械語命
令M3−1,M3−2と修正エリアリターン命令B23
とはパッチ格納ファイル93中の上記修正エリアリター
ン命令B22の直後に格納される。
【0074】さて、以上のようにして必要とする全ての
コンパイルドコードオブジェクトに対する修正処理を終
えると(S42でYES)、ローダ8は、修正後のコン
パイルドコードオブジェクト51,51’を記憶領域4
にロードし(S46)、パッチ格納ファイル93の内容
をパッチエリア42”にロードし(S47)、処理を終
える。
コンパイルドコードオブジェクトに対する修正処理を終
えると(S42でYES)、ローダ8は、修正後のコン
パイルドコードオブジェクト51,51’を記憶領域4
にロードし(S46)、パッチ格納ファイル93の内容
をパッチエリア42”にロードし(S47)、処理を終
える。
【0075】
【発明の効果】以上説明したように、本発明によれば、
既に存在するコンパイルドコードオブジェクトを直接に
修正することができる。
既に存在するコンパイルドコードオブジェクトを直接に
修正することができる。
【0076】従って、ソースプログラムを再コンパイル
することなく修正済みのコンパイルドコードオブジェク
トを得ることができ、修正したい機械語命令列が全体の
ほんの一部である場合には特に効果がある。
することなく修正済みのコンパイルドコードオブジェク
トを得ることができ、修正したい機械語命令列が全体の
ほんの一部である場合には特に効果がある。
【0077】また、元のコンパイルドコードオブジェク
トが生成されたときのコンパイル環境を再現できない場
合でも、修正したコンパイルドコードオブジェクトを生
成することができる。
トが生成されたときのコンパイル環境を再現できない場
合でも、修正したコンパイルドコードオブジェクトを生
成することができる。
【図1】本発明を適用した言語処理システムの一例を示
すブロック図である。
すブロック図である。
【図2】修正に使う機械語命令列,修正情報,追加パッ
チ領域の内容の一例と修正後のコンパイルドコードオブ
ジェクトの例を示す図である。
チ領域の内容の一例と修正後のコンパイルドコードオブ
ジェクトの例を示す図である。
【図3】記憶領域上の一関数のコンパイルドコードオブ
ジェクトの終端からの領域をパッチエリアとして使用
し、且つ、ファイル上のコンパイルドコードオブジェク
トの終端からの領域を追加パッチ領域として使用する実
施例においてローダが実行する処理の一例を示すフロー
チャートである。
ジェクトの終端からの領域をパッチエリアとして使用
し、且つ、ファイル上のコンパイルドコードオブジェク
トの終端からの領域を追加パッチ領域として使用する実
施例においてローダが実行する処理の一例を示すフロー
チャートである。
【図4】ファイル上のコンパイルドコードオブジェクト
の終端からの領域に設定された追加パッチ領域に格納さ
れた命令列の例とその命令で修正されるコンパイルドコ
ードオブジェクトの修正箇所の内容例とを示す図であ
る。
の終端からの領域に設定された追加パッチ領域に格納さ
れた命令列の例とその命令で修正されるコンパイルドコ
ードオブジェクトの修正箇所の内容例とを示す図であ
る。
【図5】記憶領域上のコンパイルドコードオブジェクト
の終端からの領域とは別の領域であって所定のレジスタ
によって先頭が指示され且つ複数のコンパイルドコード
オブジェクトで共用される領域をパッチエリアとして使
用すると共に、追加パッチ領域をコンパイルドコードオ
ブジェクト毎に備える実施例においてローダが実行する
処理の一例の一部を示すフローチャートである。
の終端からの領域とは別の領域であって所定のレジスタ
によって先頭が指示され且つ複数のコンパイルドコード
オブジェクトで共用される領域をパッチエリアとして使
用すると共に、追加パッチ領域をコンパイルドコードオ
ブジェクト毎に備える実施例においてローダが実行する
処理の一例の一部を示すフローチャートである。
【図6】図5の処理の続きの処理の一例を示すフローチ
ャートである。
ャートである。
【図7】記憶領域上のコンパイルドコードオブジェクト
の終端からの領域とは別の領域であって所定のレジスタ
によって先頭が指示され且つ複数のコンパイルドコード
オブジェクトで共用されるパッチエリアの内容例と、コ
ンパイルドコードオブジェクト毎に備わる追加パッチ領
域の内容例と、修正後のコンパイルドコードオブジェク
トの内容例とを示す図である。
の終端からの領域とは別の領域であって所定のレジスタ
によって先頭が指示され且つ複数のコンパイルドコード
オブジェクトで共用されるパッチエリアの内容例と、コ
ンパイルドコードオブジェクト毎に備わる追加パッチ領
域の内容例と、修正後のコンパイルドコードオブジェク
トの内容例とを示す図である。
【図8】記憶領域上のコンパイルドコードオブジェクト
の終端からの領域とは別の領域であって所定のレジスタ
によって先頭が指示され且つ複数のコンパイルドコード
オブジェクトで共用される領域をパッチエリアとして使
用すると共に、追加パッチ領域を複数のコンパイルドコ
ードオブジェクトで共用されるパッチ格納ファイルで構
成した実施例ににおいてローダが実行する処理の一例を
示すフローチャートである。
の終端からの領域とは別の領域であって所定のレジスタ
によって先頭が指示され且つ複数のコンパイルドコード
オブジェクトで共用される領域をパッチエリアとして使
用すると共に、追加パッチ領域を複数のコンパイルドコ
ードオブジェクトで共用されるパッチ格納ファイルで構
成した実施例ににおいてローダが実行する処理の一例を
示すフローチャートである。
【図9】記憶領域上のコンパイルドコードオブジェクト
の終端からの領域とは別の領域であって所定のレジスタ
によって先頭が指示され且つ複数のコンパイルドコード
オブジェクトで共用されるパッチエリアの内容例と、パ
ッチ格納ファイルの内容例と、修正後のコンパイルドコ
ードオブジェクトの内容例とを示す図である。
の終端からの領域とは別の領域であって所定のレジスタ
によって先頭が指示され且つ複数のコンパイルドコード
オブジェクトで共用されるパッチエリアの内容例と、パ
ッチ格納ファイルの内容例と、修正後のコンパイルドコ
ードオブジェクトの内容例とを示す図である。
1…言語処理システム 2…コンパイラ 3…インタプリタ 4…記憶領域 5…ファイル 6…パッチイメージ格納部 7…修正情報入力部 8…ローダ 9,91…追加パッチ領域 41…コンパイルドコードオブジェクトをロードする領
域 42,42’,42”…パッチエリア 51,51’…コンパイルドコードオブジェクト 61,61−1,61−2…機械語命令列 71…修正情報 81…判定部 82…短命令列修正手段 83…長命令列修正手段 84…修正ファイルロード手段 85…修正部 93…パッチ格納ファイル
域 42,42’,42”…パッチエリア 51,51’…コンパイルドコードオブジェクト 61,61−1,61−2…機械語命令列 71…修正情報 81…判定部 82…短命令列修正手段 83…長命令列修正手段 84…修正ファイルロード手段 85…修正部 93…パッチ格納ファイル
Claims (4)
- 【請求項1】 ソースプログラムを翻訳してコンパイル
ドコードオブジェクトを出力するコンパイラと該コンパ
イラが出力したコンパイルドコードオブジェクトを記憶
領域にロードして解釈実行するインタプリタとを含む言
語処理システムにおけるコンパイルドコードオブジェク
トのパッチ処理方式において、 修正対象のコンパイルドコードオブジェクトを格納する
ファイルと、 修正内容である機械語命令列を格納するパッチイメージ
格納部と、 前記修正対象のコンパイルドコードオブジェクトの修正
位置と該修正位置に適用すべき前記パッチイメージ格納
部中の機械語命令列との関係を示す修正情報を入力する
修正情報入力手段と、 追加パッチ領域とを備え、且つ、 前記インタプリタ内のローダに、 前記入力された修正情報に基づき、前記ファイル中のコ
ンパイルドコードオブジェクトの修正箇所を認識すると
共に該修正箇所を短命令列修正方法で修正するか、長命
令列修正方法で修正するかを判定する判定部と、 該判定部により短命令列修正方法で修正すると判定され
た前記コンパイルドコードオブジェクトの修正箇所を前
記パッチイメージ格納部に格納された該当する機械語命
令列で書き換える短命令列修正手段と、 前記判定部により長命令列修正方法で修正すると判定さ
れた前記コンパイルドコードオブジェクトの修正箇所を
パッチエリアに分岐する命令で書き換えると共に、前記
パッチイメージ格納部に格納された該当する機械語命令
列と前記修正箇所へ制御を戻す命令とを前記追加パッチ
領域に格納する長命令列修正手段と、 前記修正後のコンパイルドコードオブジェクトおよび前
記追加パッチ領域の内容を前記記憶領域にロードする修
正ファイルロード手段とを備えることを特徴とするコン
パイルドコードオブジェクトのパッチ処理方式。 - 【請求項2】 前記記憶領域上の前記コンパイルドコー
ドオブジェクトの終端からの領域を前記パッチエリアと
して使用すると共に、前記ファイル上の前記コンパイル
ドコードオブジェクトの終端からの領域を前記追加パッ
チ領域として使用し、且つ、 前記長命令列修正手段は、前記判定部により長命令列修
正方法で修正すると判定された前記コンパイルドコード
オブジェクトの修正箇所を前記パッチエリアの今回使用
する領域に分岐する命令で書き換えると共に、前記パッ
チイメージ格納部に格納された該当する機械語命令列と
前記修正箇所へ分岐する命令とを前記追加パッチ領域に
格納し、更に前記追加パッチ領域に格納した機械語命令
列のサイズ分だけ前記コンパイルドコードオブジェクト
のサイズ情報を修正することを特徴とする請求項1記載
のコンパイルドコードオブジェクトのパッチ処理方式。 - 【請求項3】 前記記憶領域上のコンパイルドコードオ
ブジェクトの終端からの領域とは別の領域であって所定
のレジスタによって先頭が指示され且つ複数のコンパイ
ルドコードオブジェクトで共用される領域を前記パッチ
エリアとして使用すると共に、前記追加パッチ領域をコ
ンパイルドコードオブジェクト毎に備え、且つ、 前記長命令列修正手段は、前記判定部により長命令列修
正方法で修正すると判定された前記コンパイルドコード
オブジェクトの修正箇所を、前記レジスタおよびスタッ
クを使用して前記パッチエリアに分岐する仮のサブルー
チン分岐命令で書き換えると共に、前記パッチイメージ
格納部に格納された該当する機械語命令列と前記修正箇
所へ前記スタックを使用して制御を戻すリターン命令と
を前記追加パッチ領域に格納し、 前記修正ファイルロード手段は、前記修正後のコンパイ
ルドコードオブジェクトおよびそれに対応する前記追加
パッチ領域の内容を前記記憶領域にロードする際に、前
記追加パッチ領域の内容をロードした前記パッチエリア
の領域に基づき、前記修正後のコンパイルドコードオブ
ジェクト中の前記仮のサブルーチン分岐命令を修正する
ことを特徴とする請求項1記載のコンパイルドコードオ
ブジェクトのパッチ処理方式。 - 【請求項4】 前記記憶領域上のコンパイルドコードオ
ブジェクトの終端からの領域とは別の領域であって所定
のレジスタによって先頭が指示され且つ複数のコンパイ
ルドコードオブジェクトで共用される領域を前記パッチ
エリアとして使用すると共に、前記追加パッチ領域を複
数のコンパイルドコードオブジェクトで共用されるパッ
チ格納ファイルで構成し、且つ、 前記長命令列修正手段は、前記判定部により長命令列修
正方法で修正すると判定された前記コンパイルドコード
オブジェクトの修正箇所を、前記レジスタおよびスタッ
クを使用して前記パッチエリアの今回使用する領域に分
岐するサブルーチン分岐命令で書き換えると共に、前記
パッチイメージ格納部に格納された該当する機械語命令
列と前記修正箇所へ前記スタックを使用して制御を戻す
リターン命令とを前記パッチ格納ファイルに格納し、 前記修正ファイルロード手段は、前記修正後のコンパイ
ルドコードオブジェクトを前記記憶領域にロードすると
共に前記パッチ格納ファイルの内容を前記パッチエリア
にロードすることを特徴とする請求項1記載のコンパイ
ルドコードオブジェクトのパッチ処理方式。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP4089728A JPH05257672A (ja) | 1992-03-13 | 1992-03-13 | コンパイルドコードオブジェクトのパッチ処理方式 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP4089728A JPH05257672A (ja) | 1992-03-13 | 1992-03-13 | コンパイルドコードオブジェクトのパッチ処理方式 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JPH05257672A true JPH05257672A (ja) | 1993-10-08 |
Family
ID=13978822
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP4089728A Pending JPH05257672A (ja) | 1992-03-13 | 1992-03-13 | コンパイルドコードオブジェクトのパッチ処理方式 |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JPH05257672A (ja) |
-
1992
- 1992-03-13 JP JP4089728A patent/JPH05257672A/ja active Pending
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| JP4931583B2 (ja) | ネイティブ結合を行なうための方法および装置 | |
| US7992131B2 (en) | Macro to instantiate a variable used with a first macro requiring use of a second macro suitable for said variable | |
| US20060026575A1 (en) | Method and system of adaptive dynamic compiler resolution | |
| US6983458B1 (en) | System for optimizing data type definition in program language processing, method and computer readable recording medium therefor | |
| US7386843B2 (en) | Method and system for register allocation | |
| JPH09152961A (ja) | ソフトウエアプログラムにバージョン設定情報を付す方法および装置 | |
| EP0833246A2 (en) | A method of producing a computer program | |
| JPH11242597A (ja) | Javaバイトコードデータのフローグラフの生成方法 | |
| EP1728155B1 (en) | Method and system for performing link-time code optimization without additional code analysis | |
| US20050071809A1 (en) | System and method for serializing objects in a compiled programming language | |
| JP3539613B2 (ja) | ループ飛び出し文を含むループに対する配列サマリ解析方法 | |
| US7810086B2 (en) | Safe code-motion of dangerous instructions during compiler optimization | |
| US20010042241A1 (en) | Apparatus and method for executing program using just-in time-compiler system | |
| JP5128602B2 (ja) | プログラムコード変換に関して動的にリンクされた関数呼び出しを行うための方法及び装置 | |
| JPH05257672A (ja) | コンパイルドコードオブジェクトのパッチ処理方式 | |
| Bravenboer et al. | Rewriting strategies for instruction selection | |
| JPH05257739A (ja) | コンパイルドコードオブジェクトのパッチ処理方式 | |
| JP2864955B2 (ja) | コンパイルドコードオブジェクトのパッチ処理方式 | |
| Hawblitzel et al. | A garbage-collecting typed assembly language | |
| JP3596570B2 (ja) | クラスの主記憶装置への配置方法 | |
| JP3889227B2 (ja) | プログラム実行装置、プログラム実行方法、記録媒体、及び制御プログラム | |
| Leroy | Compiling functional languages | |
| Strecker | Investigating type-certifying compilation with Isabelle | |
| JPH04321135A (ja) | コンパイラのオブジェクト修正指示方式 | |
| Scott | Towards a Verified Compiler from Cogent to LLVM |