(57)【要約】【課題】独立に開発されたソフトウェアを、１つのマルチコアプロセッサに統合する場合に、正常な動作を保証しながら、共通に使用される命令コードを共有することにより冗長な命令コードを含まない、縮小されたサイズのロードモジュールを生成する。【解決手段】ビルドツールが備えるライブラリにおいて、それに含まれる関数のそれぞれに、リエントラント属性を予め付与しておく。複数のプログラムを統合するときに、それぞれのプログラムのオブジェクトコード群から呼び出されるリエントラント関数の関数名を統合して、全てのリエントラント関数名を重複なく含む全リエントラント関数名ファイルを出力する。複数のプログラムのオブジェクトコード群にリンク処理を行って、それぞれに対応するロードモジュールを作成する。また、全リエントラント関数名ファイルに基づいて、リエントラント関数のロードモジュールを作成する。【選択図】図１
2014182711.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに読み込まれて実行されることにより、入力された複数のオブジェクトコード群に基づいて、リエントラント関数を含むライブラリを参照して、上記複数のオブジェクトコード群に対応するロードモジュールを出力する、ビルドツールであって、
リエントラント関数名出力部と、全リエントラント関数名出力部と、リエントラント関数ロードモジュール出力部と、コードリンク部とを備え、
上記リエントラント関数名出力部は、第１オブジェクトコード群と第２オブジェクトコード群が入力され、上記ライブラリを参照して、上記ライブラリ内のリエントラント関数であって、上記第１オブジェクトコード群から参照される全てのリエントラント関数の関数名を保持する、第１リエントラント関数名ファイルと、上記ライブラリ内のリエントラント関数であって、上記第２オブジェクトコード群から参照される全てのリエントラント関数の関数名を保持する、第２リエントラント関数名ファイルとを出力し、
上記全リエントラント関数名出力部は、上記第１及び第２リエントラント関数名ファイルが入力され、上記第１及び第２リエントラント関数名ファイルに含まれる全てのリエントラント関数名を重複なく含む全リエントラント関数名ファイルを出力し、
上記リエントラント関数ロードモジュール出力部は、上記全リエントラント関数名ファイルが入力され、上記ライブラリを参照して、上記全リエントラント関数名ファイルに含まれる全てのリエントラント関数の実行コードを含み、上記全リエントラント関数名ファイルに含まれないリエントラント関数のコードを含まないリエントラント関数ロードモジュールと、上記リエントラント関数ロードモジュール内のリエントラント関数のアドレス情報を保持するリエントラント関数アドレス情報ファイルとを出力し、
上記コードリンク部は、上記第１及び第２オブジェクトコード群と上記リエントラント関数アドレス情報ファイルが入力され、上記ライブラリを参照して、上記第１及び第２オブジェクトコード群における、リエントラント関数を参照する関数名シンボルを上記リエントラント関数アドレス情報ファイル内の関数アドレスで置き換え、リエントラント関数以外を呼び出す関数のアドレス未解決な関数名シンボルを、上記ライブラリとリンクしてアドレス解決し、上記第１及び第２オブジェクトコード群にそれぞれ対応する第１及び第２ロードモジュールを出力する、ビルドツール。
【請求項２】
請求項１において、リエントラント関数ロードモジュール更新判定部と、リエントラント関数名追加出力部とを、さらに備え、
上記リエントラント関数名出力部は、第３オブジェクトコード群が入力され、上記ライブラリを参照して、上記ライブラリ内のリエントラント関数であって、上記第３オブジェクトコード群から参照される全てのリエントラント関数の関数名を保持する、第３リエントラント関数名ファイルを出力し、
上記リエントラント関数ロードモジュール更新判定部は、上記第３リエントラント関数名ファイルと上記全リエントラント関数名ファイルが入力され、上記第３リエントラント関数名ファイルに含まれ、上記全リエントラント関数名ファイルに含まれない関数名の有無に基づいて、上記全リエントラント関数名ファイルの更新要否情報を格納するリエントラント関数ロードモジュール更新情報ファイルを出力し、
上記リエントラント関数名追加出力部は、上記第３リエントラント関数名ファイルと、上記リエントラント関数ロードモジュール更新情報ファイルと、上記全リエントラント関数名ファイルが入力され、上記リエントラント関数ロードモジュール更新情報ファイルの上記更新要否情報に基づいて、上記第３リエントラント関数名ファイルに含まれていて、上記全リエントラント関数名ファイルに含まれていないリエントラント関数名を上記全リエントラント関数名ファイルに追記し、
上記リエントラント関数ロードモジュール出力部は、上記リエントラント関数名追加出力部によって追記された上記全リエントラント関数名ファイルと、上記リエントラント関数ロードモジュール更新情報ファイルとが入力され、上記ライブラリを参照して、上記リエントラント関数ロードモジュール更新情報ファイルの上記更新要否情報に従って、上記リエントラント関数ロードモジュール及び上記リエントラント関数アドレス情報ファイルを更新し、
上記コードリンク部は、上記第３オブジェクトコード群と上記リエントラント関数ロードモジュール出力部によって更新された上記関数アドレス情報ファイルが入力され、上記ライブラリを参照して、上記第３オブジェクトコード群における、リエントラント関数を参照する関数名シンボルを、上記関数アドレス情報ファイル内の関数アドレスで置き換え、リエントラント関数以外を呼び出す関数のアドレス未解決な関数名シンボルを、上記ライブラリとリンクしてアドレス解決し、上記第３オブジェクトコード群に対応する第３ロードモジュールを出力する、ビルドツール。
【請求項３】
請求項１において、再リンク情報判定部と、リエントラント関数ロードモジュール更新判定部と、リエントラント関数名編集出力部とをさらに備え、
上記リエントラント関数名出力部は、上記第１オブジェクトコード群から変更された第４オブジェクトコード群が入力され、上記ライブラリを参照して、上記ライブラリ内のリエントラント関数であって、上記第４オブジェクトコード群から参照される全てのリエントラント関数の関数名を保持する、第４リエントラント関数名ファイルを出力し、
上記全リエントラント関数名出力部は、上記第４リエントラント関数名ファイルと上記第２リエントラント関数名ファイルが入力され、上記第４及び第２リエントラント関数名ファイルに含まれる全てのリエントラント関数名を重複なく含む第２全リエントラント関数名ファイルを出力し、
上記再リンク情報判定部は、上記全リエントラント関数名ファイルと、上記第２全リエントラント関数名ファイルと、上記第２リエントラント関数名ファイルとが入力され、上記第２リエントラント関数名ファイルを再リンクするか否かの情報を再リンク情報ファイルに出力し、
上記リエントラント関数ロードモジュール更新判定部は、上記全リエントラント関数名ファイルと上記第２全リエントラント関数名ファイルが入力され、リエントラント関数ロードモジュールを更新するか否かの更新情報を格納するリエントラント関数ロードモジュール更新情報ファイルを出力し、
上記リエントラント関数名編集出力部は、上記全リエントラント関数名ファイルと上記第２全リエントラント関数名ファイルと上記リエントラント関数ロードモジュール更新情報ファイルとが入力され、上記リエントラント関数ロードモジュール更新情報ファイルの情報に従って上記全リエントラント関数名ファイルを上記第２全リエントラント関数名ファイルで上書きし、
上記リエントラント関数ロードモジュール出力部は、上記リエントラント関数名編集出力部で編集された上記全リエントラント関数名ファイルと上記リエントラント関数ロードモジュール更新情報ファイルが入力され、上記ライブラリを参照して、上記リエントラント関数ロードモジュール更新情報ファイルの情報に従って、上記リエントラント関数ロードモジュールと上記関数アドレス情報ファイルとを更新し、
上記コードリンク部は、上記第４オブジェクトコード群と、上記再リンク情報ファイルと、上記関数アドレス情報ファイルとが入力され、上記ライブラリを参照して、上記第４オブジェクトコード群における、リエントラント関数を参照する関数名シンボルを上記関数アドレス情報ファイル内の関数アドレスで置き換え、リエントラント関数以外を呼び出す関数のアドレス未解決な関数名シンボルを、上記ライブラリとリンクしてアドレス解決し、上記第４オブジェクトコード群に対応するロードモジュールを出力して上記第１ロードモジュールを上書きし、上記再リンク情報ファイルに上記第２オブジェクトコード群を再リンクする情報があるなら上記第２オブジェクトコード群において、リエントラント関数を参照する関数名シンボルを上記関数アドレス情報ファイル内の関数アドレスで置き換え、それら以外の未解決なシンボルは上記ライブラリとリンクしてそのアドレスを解決した結果であるロードモジュールを出力して上記第２ロードモジュールを上書きする、ビルドツール。
【請求項４】
請求項２において、上記リエントラント関数ロードモジュール出力部は、上記リエントラント関数ロードモジュール更新情報ファイルが更新不要以外の情報を含む場合にのみ、上記全リエントラント関数名ファイルに含まれるリエントラント関数のコードのみから構成されるリエントラント関数ロードモジュールを上書きし、上記リエントラント関数ロードモジュール内の全てのリエントラント関数のアドレス情報を保持する関数アドレス情報ファイルを出力して上記関数アドレス情報ファイルを上書きする、ビルドツール。
【請求項５】
請求項３において、上記再リンク情報判定部は、上記全リエントラント関数名ファイルと上記第２全リエントラント関数名ファイルのファイル先頭から最初に異なる関数名が出現するまでの関数名から構成される一致関数名ファイルを作成し、上記第２リエントラント関数名ファイルの中に上記一致関数名ファイルにない関数名が含まれる場合には再リンクし、含まれない場合に再リンクしないという制御情報を再リンク情報ファイルに出力する、ビルドツール。
【請求項６】
請求項３において、上記リエントラント関数ロードモジュール更新判定部は、上記全リエントラント関数名ファイルと上記第２全リエントラント関数名ファイルのファイル先頭から最初に異なる関数名が出現するまでの関数名から構成される一致関数名ファイルを作成し、上記全リエントラント関数名ファイルと上記一致関数名ファイルが一致した場合に更新必要とし、一致しなければ書換え必要とし、上記第２全リエントラント関数名ファイルと上記一致関数名ファイルが一致したら更新不要とする制御情報を格納するリエントラント関数ロードモジュール更新情報ファイルを出力する、ビルドツール。
【請求項７】
請求項３において、上記リエントラント関数名編集出力部は、上記リエントラント関数ロードモジュール更新情報ファイルが、更新必要とする情報を含む場合には、上記第４リエントラント関数名ファイルに含まれていて、上記全リエントラント関数名ファイルに含まれていないリエントラント関数名を上記全リエントラント関数名ファイルに追加書きし、上記リエントラント関数ロードモジュール更新情報ファイルが書換え必要とする情報を含むなら、上記第２全リエントラント関数名ファイルを上記全リエントラント関数名ファイルに上書き出力する、ビルドツール。
【請求項８】
コンピュータに読み込まれて実行されることにより、入力された複数のオブジェクトコード群に基づいて、リエントラント関数を含むライブラリを参照して、上記複数のオブジェクトコード群に対応するロードモジュールを出力する、ビルドツールであって、
第１オブジェクトコード群と第２オブジェクトコード群が入力され、上記ライブラリを参照して、上記第１オブジェクトコード群から参照される全てのリエントラント関数の関数名と、上記第２オブジェクトコード群から参照される全てのリエントラント関数の関数名とに含まれる全てのリエントラント関数名を重複なく含む全リエントラント関数名リストを作成し、
上記全リエントラント関数名リストに含まれる全てのリエントラント関数の実行コードを含み、上記全リエントラント関数名ファイルに含まれないリエントラント関数のコードを含まない、リエントラント関数ロードモジュールと、上記第１及び第２オブジェクトコード群にそれぞれ対応する第１及び第２ロードモジュールとを出力する、ビルドツール。
【請求項９】
請求項８において、第３オブジェクトコード群がさらに入力され、上記第３オブジェクトコード群から参照される全てのリエントラント関数の関数名のうち、上記全リエントラント関数名リストに含まれない全てのリエントラント関数の関数名を、上記全リエントラント関数名リストに追加し、
上記第３オブジェクトコード群にそれぞれ対応する第３ロードモジュールをさらに出力し、上記全リエントラント関数名リストに新たなリエントラント関数の関数名が追加されたときには、上記リエントラント関数ロードモジュールを再作成して更新する、ビルドツール。
【請求項１０】
請求項８において、上記第１オブジェクトコード群から変更された第４オブジェクトコード群が入力され、上記ライブラリを参照して、上記第４オブジェクトコード群から参照される全てのリエントラント関数の関数名に基づいて、上記全リエントラント関数名リストを更新し、
上記第４オブジェクトコード群に対応する第４ロードモジュールを作成して上記第１ロードモジュールを上書きし、上記全リエントラント関数名リストが更新されたときには、上記リエントラント関数ロードモジュールを再作成して更新する、ビルドツール。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチコアプロセッサ向けのソフトウェア開発環境に関し、特に複数のロードモジュール間でリエントラント属性が混在するライブラリを共有するためのビルドツールに好適に利用できるものである。
【背景技術】
【０００２】
プロセッサ向けのソフトウェア開発環境では、高級言語で開発されたソースプログラムを、プロセッサで実行可能なヘキサファイルに変換するために、ビルド処理が行われる。ビルド処理を行うビルドツールは、ライブラリを備え、コンパイル部、リンク部などの各ステップを含む。ソースプログラムは、コンパイル部によりオブジェクトモジュール（オブジェクトコード群）に変換される。リンク部では、ライブラリを参照して、オブジェクトモジュール（オブジェクトコード群）から、ロードモジュールを生成する。ロードモジュールは、プロセッサからアクセスされるメモリにロードされる、実行形式の命令コードである。実行形式の命令コードは、そのフォーマットからヘキサファイルと呼ばれ、多くの場合、プロセッサのＲＯＭ（Read Only Memory）に格納される。ロードモジュールは、オブジェクトモジュール（オブジェクトコード群）から変換されたヘキサファイルと、オブジェクトモジュールから呼び出される関数のヘキサファイルとを含む。リンクステップでは、オブジェクトコードが格納されるべきアドレス領域である、セクションが指定され、オブジェクトモジュールから変換されたヘキサファイルと関数のヘキサファイルは、それぞれ指定されたセクションに格納されることを前提として生成される。格納されるアドレスを割り付けることは、アドレス解決と呼ばれ、ロードモジュールを、指定されたセクションに格納される実行形式の命令コードである、ヘキサファイルに変換することは、ＲＯＭ化と呼ばれる。
【０００３】
複数の独立したプロセッサシステムで、それぞれ独立に開発されたソフトウェアを、複数のＣＰＵ（Central Processing Unit）コアを備える１つのマルチコアプロセッサに統合する場合がある。このような統合は、集積化によるチップコストの削減や小型化を目的として行われる。このとき、独立に開発された複数のソフトウェアに対して、それぞれ独立にビルド処理を行い、それぞれ独立のロードモジュールを生成する。ビルド処理では、各ロードモジュールを格納するメモリ領域が重複しないように、セクションが指定される。
【０００４】
特許文献１には、複数の実行ファイルを連結して１つのヘキサファイルを作成するときに、複数の実行ファイルに重複して含まれるモジュールを１本化して共有モジュールとする、プログラム編集装置が開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平４−１１７５２３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
複数の独立したプロセッサシステムで、それぞれ独立に開発されたソフトウェアを、１つのマルチコアプロセッサに統合する場合に、複数のソフトウェアから呼び出されて使用される同じ関数の命令コードは、それぞれのソフトウェアのロードモジュールに含まれることとなり、ヘキサファイルが冗長となって統合の利益を十分に享受することができない。これに対して、特許文献１に記載される技術を適用して、複数の実行ファイルに重複して含まれる関数の実行コードを１本化することにより、ヘキサファイルから冗長な部分を削除する解決手段を採用することができるように、思われる。
【０００７】
しかし、特許文献１について本発明者が検討した結果、以下のような新たな課題があることがわかった。
【０００８】
それぞれ独立に開発された複数のソフトウェアを１つのマルチコアプロセッサに統合する場合には、複数のソフトウェアから呼び出されて使用される関数が、同じ関数であっても非同期に呼び出される。その結果、ある関数が複数のソフトウェアのうちの１つから呼び出され使用されている最中に、同じ関数が別のＣＰＵコアで動作する別のソフトウェアによって呼び出され使用される可能性がある。一般に、１つの関数が呼び出され、その演算が実行されている最中に、さらに同じ関数が呼び出されたときに、正常に動作するとは限らない。例えば、その関数の演算の中間データを格納するための汎用レジスタは、関数の呼び出しごとに、重複しないように割り当てられるなどの配慮はなされていないため、一方の関数読み出しが他方の中間データを上書きしてしまい、正常な演算動作を保証することができないからである。
【０００９】
特許文献１に記載される技術は、あくまでも、単一のＣＰＵで順次動作する、複数のプログラムの実行ファイルを連結して１つのヘキサファイルを作成するときに有効な技術に過ぎないため、独立に開発された複数のソフトウェアを、１つのマルチコアプロセッサに統合する場合には、適用することができない。複数の実行ファイルに重複して含まれる関数の実行コードを１本化したときに、その関数が同時に呼び出された場合に正常な演算動作を保証することができないためである。
【００１０】
このような課題を解決するための手段を以下に説明するが、その他の課題と新規な特徴は、本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１１】
一実施の形態によれば、下記の通りである。
【００１２】
すなわち、ビルドツールが備えるライブラリにおいて、それに含まれる関数のそれぞれに、リエントラント属性を予め付与しておく。ここで、リエントラント属性とは、複数のプログラムから、並列かつ非同期に呼び出されても、正常な処理を実行することができる属性である。複数のプログラムを統合するときに、それぞれのプログラムのオブジェクトコード群から呼び出される（参照される）リエントラント関数の関数名をファイル出力する（リエントラント関数名ファイル）。このとき、リエントラント属性を持たない関数の関数名は出力されない。統合対象のすべてのプログラムのリエントラント関数名ファイルを統合して、全てのリエントラント関数名を重複なく含む全リエントラント関数名ファイルを出力する。複数のプログラムで共通して使用される関数の関数名は、この時点で１本化される。複数のプログラムのオブジェクトコード群それぞれにリンク処理を行って、それぞれのロードモジュールを作成する。ただし、この時のロードモジュールには、非リエントラント属性の関数の命令コードは含まれるが、リエントラント属性の関数の命令コードは包含させない。リエントラント属性の関数のロードモジュールは、全リエントラント関数名ファイルに基づいて作成する。
【発明の効果】
【００１３】
上記一実施の形態によって得られる効果を簡単に説明すれば下記のとおりである。
【００１４】
すなわち、独立に開発された複数のソフトウェアを、１つのマルチコアプロセッサに統合する場合に、正常な動作を保証しながら、共通に使用されるリエントラント属性の関数の命令コードを共有することにより冗長な命令コードを含まない、縮小されたサイズのロードモジュールを生成することができる。
【図面の簡単な説明】
【００１５】
【図１】図１は、実施形態１のビルドツールを含む、マルチコアプロセッサであるマイコンチップ用のプログラム開発システム全体を表すブロック図である。
【図２】図２は、実施形態２のビルドツールを含む、マルチコアプロセッサであるマイコンチップ用のプログラム開発システム全体を表すブロック図である。
【図３】図３は、実施形態３のビルドツールを含む、マルチコアプロセッサであるマイコンチップ用のプログラム開発システム全体を表すブロック図である。
【図４】図４は、実施形態１のビルドツールの動作を表す説明図である。
【図５】図５は、実施形態２のビルドツールの動作を表す説明図である。
【図６】図６は、実施形態３のビルドツールの動作を表す説明図である。
【図７】図７は、従来のビルドツールを適用することによって作成されるロードモジュールを表す説明図である。
【図８】図８は、実施形態１のビルドツールによって作成されるロードモジュールを表す説明図である。
【図９】図９は、リエントラント関数ロードモジュールを作るためのダミー関数の一例を示す説明図である。
【図１０】図１０は、リエントラント関数アドレス情報ファイルの一例を示す説明図である。
【発明を実施するための形態】
【００１６】
１．実施の形態の概要
先ず、本願において開示される代表的な実施の形態について概要を説明する。代表的な実施の形態についての概要説明で括弧を付して参照する図面中の参照符号はそれが付された構成要素の概念に含まれるものを例示するに過ぎない。
【００１７】
〔１〕＜リエントラント関数を共有するロードモジュールを生成するビルド＞
コンピュータ（１２）に読み込まれて実行されることにより、入力された複数のオブジェクトコード群（３０）に基づいて、リエントラント関数を含むライブラリ（１０）を参照して、上記複数のオブジェクトコード群に対応するロードモジュール（３４）を出力する、ビルドツール（１）であって、以下のように構成される。
【００１８】
上記ビルドツール（１）は、リエントラント関数名出力部（２）と、全リエントラント関数名出力部（３）と、リエントラント関数ロードモジュール出力部（４）と、コードリンク部（５）とを備える。
【００１９】
上記リエントラント関数名出力部（２）は、第１オブジェクトコード群（３０＿１）と第２オブジェクトコード群（３０＿２）が入力され、上記ライブラリを参照して、上記ライブラリ内のリエントラント関数であって、上記第１オブジェクトコード群から参照される全てのリエントラント関数の関数名を保持する、第１リエントラント関数名ファイル（３１＿１）を出力する。また、上記リエントラント関数名出力部は、上記ライブラリ内のリエントラント関数であって、上記第２オブジェクトコード群から参照される全てのリエントラント関数の関数名を保持する、第２リエントラント関数名ファイル（３１＿２）を出力する。
【００２０】
上記全リエントラント関数名出力部（３）は、上記第１及び第２リエントラント関数名ファイルが入力され、上記第１及び第２リエントラント関数名ファイルに含まれる全てのリエントラント関数名を重複なく含む全リエントラント関数名ファイル（３２）を出力する。
【００２１】
上記リエントラント関数ロードモジュール出力部（４）は、上記全リエントラント関数名ファイルが入力され、上記ライブラリを参照して、リエントラント関数ロードモジュール（ロードモジュールＲ：３４＿Ｒ）と、リエントラント関数アドレス情報ファイル（３３）とを出力する。上記リエントラント関数ロードモジュールは、上記全リエントラント関数名ファイルに含まれる全てのリエントラント関数の実行コードを含み、上記全リエントラント関数名ファイルに含まれないリエントラント関数のコードを含まない。上記リエントラント関数アドレス情報ファイルは、上記リエントラント関数ロードモジュール内のリエントラント関数のアドレス情報を保持する。
【００２２】
上記コードリンク部（５）は、上記第１及び第２オブジェクトコード群と上記リエントラント関数アドレス情報ファイルが入力され、上記ライブラリを参照して、上記第１及び第２オブジェクトコード群にそれぞれ対応する第１及び第２ロードモジュール（３４＿１、３４＿２）を出力する。このとき、上記コードリンク部は、上記第１及び第２オブジェクトコード群における、リエントラント関数を参照する関数名シンボルを上記リエントラント関数アドレス情報ファイル内の関数アドレスで置き換え、リエントラント関数以外を呼び出す関数のアドレス未解決な関数名シンボルを、上記ライブラリとリンクしてアドレス解決する。
【００２３】
これにより、複数のロードモジュール間で共通して利用されるリエントラント関数の実行コードを共有することによって、全体コードサイズを最小化したロードモジュールを出力することができる。また、リエントラント属性（リエントラントか否か）が混在するライブラリに対して上記を可能にする。
【００２４】
〔２〕＜オブジェクトコード群の追加に伴う再ビルド＞
項１において、上記ビルドツール（１）は、エントラント関数ロードモジュール更新判定部（６）と、リエントラント関数名追加出力部（７）とを、さらに備える。
【００２５】
上記リエントラント関数名出力部（２）は、第３オブジェクトコード群（３０＿３）が入力され、上記ライブラリを参照して、上記ライブラリ内のリエントラント関数であって、上記第３オブジェクトコード群から参照される全てのリエントラント関数の関数名を保持する、第３リエントラント関数名ファイル（３１＿３）を出力する。
【００２６】
上記リエントラント関数ロードモジュール更新判定部（ロードモジュールＲ更新判定部：６）は、上記第３リエントラント関数名ファイル（３１＿３）と上記全リエントラント関数名ファイル（３２＿１）が入力され、リエントラント関数ロードモジュール更新情報ファイル（ロードモジュールＲ更新情報ファイル：３６）を出力する。上記リエントラント関数ロードモジュール更新情報ファイルは、上記第３リエントラント関数名ファイルに含まれ、上記全リエントラント関数名ファイルに含まれない関数名の有無に基づいて、上記全リエントラント関数名ファイルの更新要否情報を格納する。
【００２７】
上記リエントラント関数名追加出力部（７）には、上記第３リエントラント関数名ファイル（３１＿３）と、上記全リエントラント関数名ファイル（３２）と、上記リエントラント関数ロードモジュール更新情報ファイル（ロードモジュールＲ更新情報ファイル：３６）とが入力される。上記リエントラント関数名追加出力部は、上記リエントラント関数ロードモジュール更新情報ファイルの上記更新要否情報に基づいて、上記第３リエントラント関数名ファイルに含まれていて、上記全リエントラント関数名ファイルに含まれていないリエントラント関数名を上記全リエントラント関数名ファイル（３２＿１）に追記する。
【００２８】
上記リエントラント関数ロードモジュール出力部（４）には、上記リエントラント関数名追加出力部によって追記された上記全リエントラント関数名ファイル（３２＿１）と、上記リエントラント関数ロードモジュール更新情報ファイル（ロードモジュールＲ更新情報ファイル：３６）とが入力される。上記リエントラント関数ロードモジュール出力部は、上記ライブラリを参照して、上記リエントラント関数ロードモジュール更新情報ファイルの上記更新要否情報に従って、上記リエントラント関数ロードモジュール及び上記リエントラント関数アドレス情報ファイル（３３）を更新する。
【００２９】
上記コードリンク部（５）には、上記第３オブジェクトコード群（３０＿３）と更新された上記関数アドレス情報ファイル（３３）が入力される。上記第３オブジェクトコード群に対応する第３ロードモジュール（３４＿３）を出力する。上記コードリンク部は、上記ライブラリを参照して、上記第３オブジェクトコード群における、リエントラント関数を参照する関数名シンボルを、上記関数アドレス情報ファイル内の関数アドレスで置き換え、リエントラント関数以外を呼び出す関数のアドレス未解決な関数名シンボルを、上記ライブラリとリンクしてアドレス解決する。
【００３０】
これにより、追加オブジェクトコードがある場合でも共通関数が共有でき、しかも、ビルド時間を短縮することができる。
【００３１】
〔３〕＜オブジェクトコードの変更に伴う再ビルド＞
請求項１において、上記ビルドツール（１）は、再リンク情報判定部（８）と、リエントラント関数ロードモジュール更新判定部（ロードモジュールＲ更新判定部：６）と、リエントラント関数名編集出力部（９）とをさらに備える。
【００３２】
上記リエントラント関数名出力部（２）は、上記第１オブジェクトコード群から変更された第４オブジェクトコード群（３０＿４）が入力され、上記ライブラリを参照して、上記ライブラリ内のリエントラント関数であって、上記第４オブジェクトコード群から参照される全てのリエントラント関数の関数名を保持する、第４リエントラント関数名ファイル（３１＿４）を出力する。
【００３３】
上記全リエントラント関数名出力部（３）は、上記第４リエントラント関数名ファイルと上記第２リエントラント関数名ファイルが入力され、上記第４及び第２リエントラント関数名ファイルに含まれる全てのリエントラント関数名を重複なく含む第２全リエントラント関数名ファイル（３２＿２）を出力する。
【００３４】
上記再リンク情報判定部（８）は、上記全リエントラント関数名ファイル（３２）と、上記第３全リエントラント関数名ファイル（３２＿２）と、上記第２リエントラント関数名ファイル（３１＿２）とが入力され、上記第２リエントラント関数名ファイルを再リンクするか否かの情報を再リンク情報ファイル（３７）に出力する。
【００３５】
上記リエントラント関数ロードモジュール更新判定部（ロードモジュールＲ更新判定部：６）には、上記全リエントラント関数名ファイル（３２）と上記第２全リエントラント関数名ファイル（３２＿２）が入力される。上記リエントラント関数ロードモジュール更新判定部は、リエントラント関数ロードモジュールを更新するか否かの更新情報を格納するリエントラント関数ロードモジュール更新情報ファイル（ロードモジュールＲ更新情報ファイル：３６）を出力する。
【００３６】
上記リエントラント関数名編集出力部（９）には、上記全リエントラント関数名ファイル（３２）と、上記第２全リエントラント関数名ファイル（３２＿２）と上記リエントラント関数ロードモジュール更新情報ファイルが入力される。上記リエントラント関数名編集出力部は、上記リエントラント関数ロードモジュール更新情報ファイルの情報に従って上記全リエントラント関数名ファイルを上記第２全リエントラント関数名ファイルで上書きする。
【００３７】
上記リエントラント関数ロードモジュール出力部（４）には、上記リエントラント関数名編集出力部で編集された上記全リエントラント関数名ファイルと上記リエントラント関数ロードモジュール更新情報ファイルが入力される。前上記リエントラント関数ロードモジュール出力部は、記ライブラリを参照して、上記リエントラント関数ロードモジュール更新情報ファイルの情報に従って、上記リエントラント関数ロードモジュール（ロードモジュールＲ：３４＿Ｒ）と上記関数アドレス情報ファイル（３３）とを更新する。
【００３８】
上記コードリンク部（５）には、上記第４オブジェクトコード群（３０＿４）と、上記再リンク情報ファイル（３７）と、上記関数アドレス情報ファイル（３３）とが入力される。上記コードリンク部（５）は、上記ライブラリを参照して、上記第４オブジェクトコード群における、リエントラント関数を参照する関数名シンボルを上記関数アドレス情報ファイル内の関数アドレスで置き換える。さらに、リエントラント関数以外を呼び出す関数のアドレス未解決な関数名シンボルを、上記ライブラリとリンクしてアドレス解決し、上記第４オブジェクトコード群に対応するロードモジュールを出力して上記第１ロードモジュールを上書きする。上記コードリンク部（５）は、上記ライブラリを参照して、上記再リンク情報ファイルに上記第２オブジェクトコード群を再リンクする情報があるなら上記第２オブジェクトコード群において、リエントラント関数を参照する関数名シンボルを上記関数アドレス情報ファイル内の関数アドレスで置き換える。さらに、それら以外の未解決なシンボルは上記ライブラリとリンクしてそのアドレスを解決した結果であるロードモジュールを出力して上記第２ロードモジュールを上書きする。
【００３９】
これにより、例えば実施形態１に示した方法で、既にロードモジュールを作成したオブジェクトコード群に修正が発生した場合でも共通するリエントラント関数が共有でき、しかも、ビルド時間を短縮することができる。
【００４０】
〔４〕＜ロードモジュールＲが更新不要の場合に再作成を省略＞
項２又は項３において、上記リエントラント関数ロードモジュール出力部（４）は、上記リエントラント関数ロードモジュール更新情報ファイルが更新不要以外の情報を含む場合にのみ、上記全リエントラント関数名ファイルに含まれるリエントラント関数のコードのみから構成されるリエントラント関数ロードモジュールを上書きする。また、上記リエントラント関数ロードモジュール出力部は、上記リエントラント関数ロードモジュール内の全てのリエントラント関数のアドレス情報を保持する関数アドレス情報ファイルを出力して上記関数アドレス情報ファイルを上書きする。
【００４１】
これにより、リエントラント関数ロードモジュール（ロードモジュールＲ：３４＿Ｒ）の変更が不要ならリエントラント関数ロードモジュールを再作成しないことによって、ビルドにかかる時間を短縮する。
【００４２】
〔５〕＜再リンクの要否判定＞
項３において、上記再リンク情報判定部（８）は、上記全リエントラント関数名ファイル（３２）と上記第２全リエントラント関数名ファイル（３２＿２）のファイル先頭から最初に異なる関数名が出現するまでの関数名から構成される一致関数名ファイルを作成する。上記再リンク情報判定部は、上記第２リエントラント関数名ファイル（３１＿２）の中に上記一致関数名ファイルにない関数名が含まれる場合には再リンクし、含まれない場合に再リンクしないという制御情報を再リンク情報ファイル（３７）に出力する。
【００４３】
これにより、例えば実施形態１に示す方法で、既にロードモジュールを作成したオブジェクトコード群に修正が発生した場合に、修正が発生したオブジェクトコード群以外のオブジェクトコード群の再リンクが必要か否かを判定して処理することで、ビルドにかかる時間を短くすることができる。
【００４４】
〔６〕＜リエントラント関数ロードモジュールの変更の要否と再リンク要否の判定＞
項３において、上記リエントラント関数ロードモジュール更新判定部（ロードモジュールＲ更新判定部：６）は、上記全リエントラント関数名ファイル（３２＿１）と上記第２全リエントラント関数名ファイル（３２＿２）のファイル先頭から最初に異なる関数名が出現するまでの関数名から構成される一致関数名ファイルを作成する。上記全リエントラント関数名ファイル（３２＿１）と上記一致関数名ファイルが一致した場合に更新必要とし、一致しなければ書換え必要とし、上記第２全リエントラント関数名ファイル（３２＿２）と上記一致関数名ファイルが一致したら更新不要とする制御情報を格納するリエントラント関数ロードモジュール更新情報ファイル（ロードモジュールＲ更新情報ファイル：３６）を出力する。
【００４５】
これにより、例えば実施形態１に示す方法で、既にロードモジュールを作成したオブジェクトコード群に修正が発生した場合に、リエントラント関数ロードモジュールの変更が必要か否か、修正が発生したオブジェクトコード群以外のオブジェクトコード群の再リンクが必要か否かを判定するので、ビルドにかかる時間を短くすることができる。
【００４６】
〔７〕＜全リエントラント関数名ファイルの編集の要否判定＞
項３において、上記リエントラント関数名編集出力部（９）は、上記リエントラント関数ロードモジュール更新情報ファイルが、更新必要とする情報を含む場合には、上記第４リエントラント関数名ファイル（３１＿４）に含まれていて、上記全リエントラント関数名ファイル（３２＿１）に含まれていないリエントラント関数名を上記全リエントラント関数名ファイル（３２＿１）に追加書きする。上記リエントラント関数ロードモジュール更新情報ファイルが書換え必要とする情報を含むなら、上記第２全リエントラント関数名ファイル（３２＿２）を上記全リエントラント関数名ファイル（３２＿１）に上書き出力する。
【００４７】
これにより、例えば実施形態１に示す方法で、既にロードモジュールを作成したオブジェクトコード群に修正が発生した場合に、リエントラント関数ロードモジュールに変更必要か、書換え必要か、いずれも不要か、に従って、リエントラント関数ロードモジュールのビルドの準備をすることで、結果としてビルドにかかる時間を短くすることができる。
【００４８】
〔８〕＜リエントラント関数を共有するビルド＞
コンピュータ（１２）に読み込まれて実行されることにより、入力された複数のオブジェクトコード群（３０）に基づいて、リエントラント関数を含むライブラリ（１０）を参照して、上記複数のオブジェクトコード群に対応するロードモジュール（３４）を出力する、ビルドツール（１）であって、以下のように構成される。
【００４９】
上記ビルドツールには、第１オブジェクトコード群（３０＿１）と第２オブジェクトコード群（３０＿２）が入力される。上記ビルドツールは、上記ライブラリを参照して、上記第１オブジェクトコード群から参照される全てのリエントラント関数の関数名と、上記第２オブジェクトコード群から参照される全てのリエントラント関数の関数名とに含まれる全てのリエントラント関数名を重複なく含む全リエントラント関数名リスト（３２）を作成する。
【００５０】
上記ビルドツールは、リエントラント関数ロードモジュール（ロードモジュールＲ：３４＿Ｒ）と、上記第１及び第２オブジェクトコード群にそれぞれ対応する第１及び第２ロードモジュール（３４＿１、３４＿２）とを出力する。上記リエントラント関数ロードモジュールは、上記全リエントラント関数名リストに含まれる全てのリエントラント関数の実行コードを含み、上記全リエントラント関数名ファイルに含まれないリエントラント関数のコードを含まない。
【００５１】
これにより、複数のロードモジュール間で共通して利用されるリエントラント関数の実行コードを共有することによって、全体コードサイズを最小化したロードモジュールを出力することができる。また、リエントラント属性（リエントラントか否か）が混在するライブラリに対して上記を可能にする。
【００５２】
〔９〕＜オブジェクトコード群の追加に伴う再ビルド＞
項８において、第３オブジェクトコード群（３０＿３）がさらに入力され、上記第３オブジェクトコード群から参照される全てのリエントラント関数の関数名のうち、上記全リエントラント関数名リストに含まれない全てのリエントラント関数の関数名を、上記全リエントラント関数名リストに追加する。
【００５３】
上記第３オブジェクトコード群にそれぞれ対応する第３ロードモジュール（３４＿３）をさらに出力する。さらに、上記全リエントラント関数名リストに新たなリエントラント関数の関数名が追加されたときには、上記リエントラント関数ロードモジュールを再作成して更新する。
【００５４】
これにより、追加オブジェクトコードがある場合でも共通関数が共有でき、しかも、ビルド時間を短縮することができる。
【００５５】
〔１０〕＜オブジェクトコード群の変更に伴う再ビルド＞
項８において、上記第１オブジェクトコード群から変更された第４オブジェクトコード群（３０＿４）が入力され、上記ライブラリを参照して、上記第４オブジェクトコード群から参照される全てのリエントラント関数の関数名に基づいて、上記全リエントラント関数名リストを更新する。
【００５６】
上記第４オブジェクトコード群に対応する第４ロードモジュールを作成して上記第１ロードモジュールを上書きし、上記全リエントラント関数名リストが更新されたときには、上記リエントラント関数ロードモジュールを再作成して更新する。
【００５７】
これにより、例えば実施形態１に示した方法で、既にロードモジュールを作成したオブジェクトコード群に修正が発生した場合でも共通するリエントラント関数が共有でき、しかも、ビルド時間を短縮することができる。
【００５８】
２．実施の形態の詳細
実施の形態について更に詳述する。
【００５９】
〔実施形態１〕
図１は、実施形態１のビルドツールを含む、マルチコアプロセッサであるマイコンチップ用のプログラム開発システム全体を表すブロック図である。
【００６０】
マイコンチップ用のプログラム開発システムは、実施形態１のビルドツールが実行されるコンピュータの一例であるＰＣ本体１２にディスプレイ１４とキーボード１３が接続され、ＲＯＭライタ１５を介して、マイコンチップ２０に接続可能な構成となっている。ＰＣ本体１２は、ＣＰＵ１６、ハードディスク（ＨＤＤ： Hard Disk Drive）１７、ＲＡＭ１８が互いにバス１９で接続されて構成される。マイコンチップ２０は複数のＣＰＵコアを含むマルチコアプロセッサである。図示されるマイコンチップ２０は、ＣＰＵコア１（２１＿１）とＣＰＵコア２（２１＿２）、ＲＯＭ２５、及びＲＡＭ２４が、互いにバス２６で接続されて構成される。図示される２個より多いＣＰＵコアを含んで構成されてもよく、さらに他の機能モジュールを含んで構成されてもよい。ＣＰＵコア１（２１＿１）は、ＣＰＵ１（２１＿１）とローカルメモリＬＭ１（２３＿１）を含み、ＣＰＵコア２（２１＿２）は、ＣＰＵ２（２１＿２）とローカルメモリＬＭ２（２３＿２）を含んで構成される。必ずしもローカルメモリを含んで構成される必要はないが、ローカルメモリを備えることにより、バス上のメモリを共有した場合に比べて、ＣＰＵごとの動作の独立性が高まり、個々にまた全体でも高速化される。ＲＯＭ２５には、ＲＯＭライタ１５を経由して書き込まれた、ロードモジュール３５が格納される。
【００６１】
ＰＣ本体１２のＨＤＤ１７には、ライブラリ１０を備えたビルドツール１が格納されており、ＲＡＭ１８に転送され、ビルドプログラムが実行される。ＲＡＭ１８には、入力されたオブジェクトコード群１及び２（３０＿１〜２）と、中間データであるリエントラント関数名ファイル１及び２（３１＿１〜２）、全リエントラント関数名ファイル３２、リエントラント関数アドレス情報ファイル３３、ロードモジュール１、２及びＲ（３４＿１〜２と３４＿Ｒ）が保持される。生成されたロードモジュール１、２及びＲ（３４＿１〜２と３４＿Ｒ）は、ＲＯＭライタ１５により、マイコンチップ２０のＲＯＭ２５に書き込まれる。ＲＯＭ２５はフラッシュメモリ（登録商標）などの電気的に消去・書替可能なＲＯＭとするのが好適である。ＲＯＭ２５はマイコンチップ２０に集積せず、外付けＲＯＭとしてもよい。その場合には、ロードモジュール３５は、格納されるＲＯＭ２５から、実行段階にマイコンチップ２０上のＲＡＭ２４またはローカルメモリ２３＿１〜２に転送されてもよいし、逐次ＣＰＵコアからアクセスされてもよい。
【００６２】
ビルドツール１は、リエントラント関数名出力部２と、全リエントラント関数名出力部３と、リエントラント関数ロードモジュール出力部４と、コードリンク部５とを備える。入力された複数のオブジェクトコード群３０に基づいて、リエントラント関数を含むライブラリ１０を参照して、複数のオブジェクトコード群３０のそれぞれに対応するロードモジュール３４と、複数のオブジェクトコード群３０で使用されるリエントラント関数のロードモジュール３４＿Ｒを出力する。
【００６３】
図４は、実施形態１のビルドツールの動作を表す説明図である。ビルドツール１に入力される、オブジェクトコード群１（３０＿１）は、アドレスが未解決の関数f1とf2の呼出しを含み、これらの関数のアドレス解決ができればロードモジュール１（３４＿１）となるものである。オブジェクトコード群２（３０＿２）はアドレスが未解決の関数f2とf3の呼出しを含み、これらの関数のアドレス解決ができればロードモジュール２（３４＿２）となるものである。ライブラリ１０は関数f1, f2, f3, f4, f5の関数定義を含み、関数f1, f2, f3, f4, f5は全て、リエントラント属性を持つものとする。
【００６４】
リエントラント関数名出力部２は、入力されたオブジェクトコード群１と２（３０＿１〜２）とライブラリ１０を参照して、それぞれのオブジェクトコード群に対応する、リエントラント関数名ファイル（３１＿１〜２）を出力する。リエントラント関数名ファイル３１＿１〜２は、それぞれオブジェクトコード群１と２（３０＿１〜２）から参照される、全てのリエントラント関数の関数名を保持する。
【００６５】
リエントラント関数名出力部２は、通常のリンカと同様の処理を行い、オブジェクトコード群１（３０＿１）の中のアドレスが未解決のシンボルを探し、それがライブラリに存在するなら、そのシンボル名をリエントラント情報ファイル１（３１＿１）に出力する。オブジェクトコード群（３０＿１）はアドレスが未解決の関数シンボルf1とf2を含み、これらはリエントラント属性を持つ関数としてライブラリに含まれているので、リエントラント情報ファイル１（３１＿１）には関数名f1とf2が出力される。
【００６６】
同様にして、リエントラント関数名出力部２は、オブジェクトコード群２（３０＿２）に対しても通常のリンカと同様の処理を行い、オブジェクトコード群２（３０＿２）の中のアドレスが未解決のシンボルを探し、それがライブラリに存在するなら、そのシンボル名をリエントラント情報ファイル２（３１＿２）に出力する。オブジェクトコード群２（３０＿２）はアドレスが未解決の関数シンボルf2とf3を含み、これらはライブラリに含まれているので、リエントラント情報ファイル２（３１＿２）には関数名f2とf3が出力される。
【００６７】
全リエントラント関数名出力部３は、リエントラント関数名ファイル３１＿１〜２に含まれる全てのリエントラント関数名を重複なく含む、全リエントラント関数名ファイル３２を出力する。リエントラント情報ファイル１（３１＿１）は関数名f1とf2を含み、リエントラント情報ファイル２（３１＿２）は関数名f2とf3を含むファイルである。全リエントラント情報ファイル３２は、関数名f1、f2、f3を含むファイルとなる。関数名f2は、リエントラント情報ファイル１（３１＿１）とリエントラント情報ファイル２（３１＿２）の両方に含まれるが、この時点で一本化される。
【００６８】
リエントラント関数ロードモジュール出力部４は、全リエントラント関数名ファイル３２に含まれる全てのリエントラント関数の実行コードを含む、ロードモジュールＲ（３４＿Ｒ）を出力する。ロードモジュールＲ（３４＿Ｒ）には、全リエントラント関数名ファイル３２に含まれないリエントラント関数や、非リエントラント関数の実行コードは含まれない。リエントラント関数ロードモジュール出力部４は、さらに、ロードモジュールＲ（３４＿Ｒ）内のリエントラント関数のアドレス情報を保持するリエントラント関数アドレス情報ファイル３３を出力する。リエントラント関数アドレス情報ファイル３３は関数名シンボルとそのシンボルが指すアドレスから構成されるオブジェクトコードである。図１０を引用して詳述する。
【００６９】
図１０は、リエントラント関数アドレス情報ファイル３３の一例を示す説明図である。
【００７０】
関数シンボルf1, f2, f3に対してそれが指すアドレスが各々、0x1a、0x24、0x38であることを示す。図１０はこれをより具体的にアセンブラソースプログラムの形で表したものである。「.public _f1」は、シンボル「_f1」を他のファイルからでも参照できるように宣言するアセンブラ言語の疑似命令である。但し、「_f1」は、Ｃ言語におけるシンボル「f1」をアセンブラ言語に変換したことを示すために、シンボル名の先頭に「_」が付与されている。図４では、説明を簡単にするためにシンボル名の先頭の「_」を省略して図示する。「.public _f2」及び「.public _f3」についても同様である。「_f1: .equ  0x1a」はシンボル「_f1」が値0x1aを持つことを示すアセンブラ言語の疑似命令である。「_f2: .equ  0x24」及び「_f3: .equ  0x38」についても同様である。
【００７１】
図４の説明に戻る。
【００７２】
リエントラント関数ロードモジュール出力部４から出力される、ロードモジュールＲ（３４＿Ｒ）は、リエントラント関数f1, f2, f3のみから構成されるロードモジュールである。各関数f1, f2, f3の関数定義が各々、リエントラント関数アドレス情報ファイル３３で示されたアドレスに割りついている。
【００７３】
リエントラント関数ロードモジュール出力部４は、まず、全リエントラント関数名ファイル３２を入力して、それらの関数を呼び出すダミー関数を作成する。
【００７４】
図９は、ロードモジュールＲを作るためのダミー関数の一例を示す説明図である。リエントラント関数ロードモジュール出力部４が内部で作成するダミー関数のアセンブラソースファイルである。
「.extern _f1」はファイル外で定義されるシンボル_fを参照することを表すアセンブラ言語の疑似命令である。「.extern _f2」及び「.extern _f3」についても同様である。「dumsec  .cseg  TEXT」は、dumsecという名前のテキストセクションの開始を宣言するアセンブラ言語の疑似命令である。「_dummy」はシンボル_dummyの定義を表す。「call  _f1」は関数シンボル_f1を呼び出すアセンブラ命令である。「return」は関数から呼出し元の関数に戻る命令である。この場合、_dummy関数を呼び出した関数に戻ることを表す。
【００７５】
このファイルとライブラリをリンクすることによって、ダミー関数と関数f1, f2, f3の定義からなるロードモジュールが作成される。リンカの機能によって、ダミー関数が割り付けられるdumsecセクションのアドレスを指定することができ、また、リンカの別の機能によって、出力するロードモジュールのアドレス範囲を指定することもできる。よって、本実施形態ではこの機能を使って、出力されるロードモジュールＲ（３４＿Ｒ）が関数f1, f2, f3のみを含み、ダミー関数自身に対するコードは出力しないようにする。
【００７６】
図４では、こうして出力されたロードモジュールＲ（３４＿Ｒ）を示した。ロードモジュールＲ（３４＿Ｒ）は関数f1, f2, f3の関数定義のみから構成され、各々の関数はアドレス0x1a, 0x24, 0x38に割り付けられている。リエントラント関数ロードモジュール出力部４は同時に、関数f1, f2, f3のシンボル名とこれらが割り付けられたアドレスをアセンブラコードとして出力する。リエントラント関数アドレス情報ファイル３３はこうして出力されたファイルである。これをより具体的にアセンブラソースプログラムの形で表したものである。
【００７７】
コードリンク部５は、入力されたオブジェクトコード群１と２（３０＿１〜２）にそれぞれ対応する、ロードモジュール１及び２（３４＿１、３４＿２）を出力する。このとき、コードリンク部５は、オブジェクトコード群１と２（３０＿１〜２）における、リエントラント関数を参照する関数名シンボルをリエントラント関数アドレス情報ファイル３３内の関数アドレスで置き換えて、ロードモジュール１及び２（３４＿１、３４＿２）を出力する。このとき、リエントラント関数以外を呼び出す関数のアドレス未解決な関数名シンボルは、ライブラリ１０とリンクしてアドレス解決する。ロードモジュール１（３４＿１）はオブジェクトコード群１（３０＿１）における関数f1とf2の呼出しを、ロードモジュールＲ（３４＿Ｒ）における各々の関数のアドレスに置き換えた結果である。ロードモジュール２（３４＿２）はオブジェクトコード群２（３０＿２）における関数f2とf3の呼出しを、ロードモジュールＲ（３４＿Ｒ）における各々の関数のアドレスに置き換えた結果である。
【００７８】
以上説明した通り、オブジェクトコード群１と２で（３０＿１〜２）共有される関数f2に対して、オブジェクトコード群１と２（３０＿１〜２）に対するロードモジュールである、ロードモジュール１と２（３４＿１、３４＿２）がそれぞれ関数f2のコピーを持つのではなく、関数f2に対する１つのコードを共有するので、ロードモジュール群全体の合計コードサイズを減らすことができる。
【００７９】
図７は、従来のビルドツールを適用することによって作成されるロードモジュールを表す説明図である。
【００８０】
（ａ）はプログラム開発・テスト時における２つのロードモジュール１と２がＲＡＭ上に配置される様子を表した図である。ロードモジュール１は、オブジェクトモジュールprog1.obj、並びに、ライブラリ関数sinとcosから構成されるオブジェクトモジュールから構成され、prog1.objの中から関数sin及びcosを呼出す。ロードモジュール２は、オブジェクトモジュールprog2.obj、並びに、ライブラリ関数sinとtanから構成されるオブジェクトモジュールから構成され、prog2.objの中から関数sin及びtanを呼出す。
【００８１】
（ｂ）は（ａ）に示したロードモジュール１及び２を、特許文献１に示される従来技術を適用せずに各々ＲＯＭ化した結果のヘキサファイル１及び２を、各ヘキサファイルがアドレス空間上で連続アドレスになるように配置した様子を表した図である。prog1-hex及びprog2-hexは各々、prog1.obj及びprog2.objをヘキサ化した部分で、sin, cos, tanは各々、（ａ）のオブジェクトモジュール中の関数sin, cos, tanを各々、ヘキサ化した部分である。この時のヘキサファイル１及び２の合計サイズは、prog1-hex、sin, cos, 、prog2-hex, sin, tanの各サイズの合計となる。
【００８２】
一方（ｃ）は、（ａ）に示したロードモジュール１及び２に特許文献１に示される従来技術を適用してＲＯＭ化した結果の統合化されたヘキサファイルを、各構成部分がアドレス空間上で連続アドレスになるように配置した様子を表した図である。特許文献１に示される従来技術ではＲＯＭ化時に重複する関数を削除することができる。（ａ）の例では、関数sinが２つのロードモジュールで重複して使われているので、これを統合化されたヘキサファイルでは1個になるようにする。この結果、統合化ヘキサファイル１及び２の合計サイズは、prog1-hex、sin, cos, 、prog2-hex, tanの各サイズの合計となり、（ｂ）と比較して関数sinのサイズだけ削減される。
【００８３】
しかし、既に述べたように、上記従来技術には問題がある。以下により詳しく説明する。
【００８４】
マルチコア上で２つのロードモジュールを同時にデバッグする目的でロードモジュールを作成しようとする時、ライブラリ関数のコピーを各ロードモジュール内に持つため、全体のサイズが実利用時のサイズより大きくなって利用可能なアドレス範囲を超えてしまい、ロードモジュールが作成できない可能性がある。これが（ｂ）に示される状態である。
【００８５】
また、prog2.objから呼び出すライブラリ関数tanと同じ名前だが処理が異なるユーザ関数がprog1.obj内にある場合、統合化されたヘキサファイルを作成する時に、両方とも同じ名前なので、どちらか一方が削除され、残った関数を２つのヘキサファイルから呼び出してしまうため、プログラマが気づかずに、不正なコードが作成される可能性がある。
【００８６】
また、ＲＯＭ化を行う前のプログラム開発・テスト時と実利用時とでは、同じコードでデバッグすることができないので、プログラムのテストに関して信頼性が劣る。
【００８７】
prog1とprog2に共通の関数sinが、prog1とprog2から同時に呼び出される場合がないことが、保証されていれば、（ｃ）の方法を採ることができる。しかし、prog1とprog2が並列動作するマルチコアの別々のＣＰＵコアで動作する場合は、一方のsin演算中に他方がsin関数を呼び出さない保証はない。そこで、従来技術によれば、（ｂ）の方法を採らざるを得ない。しかし、prog1とprog2が独立に開発されたプログラムであるため（ｂ）を採用するためは、変数名や関数名の競合を調整するなど、プログラムを統合するための新たな作業が生じる。
【００８８】
図８は、実施形態１のビルドツールによって作成されるロードモジュールを表す説明図である。
【００８９】
（ａ）はビルド処理前半で作成されるライブラリ用ロードモジュールと各関数のアドレス情報を含む関数アドレス情報ファイルを表した図である。ライブラリ用ロードモジュール（３４＿Ｒ）は、リエントラント関数sin, cos, tanに対するコードから構成される。このライブラリ用ロードモジュール（３４＿Ｒ）は、この中に含まれる全関数を呼び出すダミーのライブラリ呼出し関数と関数sin, cos, tanを含むライブラリとをリンクして作成される。その際、あるリンクオプションによって、ダミーのライブラリ呼び出し関数に割当てられたセクションを削除する。これによって、関数sin, cos, tanのみを含むロードモジュールが作成される。また、別のリンクオプションによって、関数sin, cos, tanが割り付く絶対アドレスの情報を含むアセンブルソースプログラムである、リエントラント関数アドレス情報ファイル３３を出力する。
【００９０】
（ｂ）はビルド処理後半で作成される２つのロードモジュールを表した図である。
ビルド後半では、まず、関数sinとcosを呼び出すオブジェクトコードprog1.objが（ａ）の関数アドレス情報ファイルとリンクされる。その結果、prog1.obj内のsinとcosに対するアドレスが解決され、アドレス解決された結果のprog1.objがロードモジュール１（３４＿１）となる。また、関数sinとtanを呼び出すオブジェクトコードprog2.objが（ａ）の関数アドレス情報ファイルとリンクされる。その結果、prog2.obj内のsinとtanに対するアドレスが解決され、アドレス解決された結果のprog2.objがロードモジュール２（３４＿２）となる。この結果、ロードモジュール１及び２（３４＿１〜２）、及びライブラリ用ロードモジュール（３４＿Ｒ）の合計サイズは、prog1.obj、prog2.obj, sin, cos, tanの各サイズの合計となり、（ｂ）と比較して関数sinのサイズだけ削減される。このとき、ライブラリ用ロードモジュール（３４＿Ｒ）はリエントラント関数のみから構成されているので、prog1から呼び出されて実行中の関数が、prog2から呼び出されても、正常に動作することが保証される。
【００９１】
以上により、以下の効果を奏する。
【００９２】
マルチコア上で２つのロードモジュールを同時にデバッグする目的でロードモジュールを作成しようとする時、ライブラリ関数は複数ロードモジュール間で共有され、全体のサイズが実利用時のサイズと同じなので、実利用時のサイズが利用可能なアドレス内に収まるなら、常にロードモジュールが作成できる。
【００９３】
また、prog2.objから呼び出すライブラリ関数tanと同じ名前だが処理が異なるユーザ関数がprog1.obj内にある場合、prog1.objと関数アドレス情報ファイルを使ってロードモジュールを作成する時に、関数tanの定義がprog1.obj内と関数アドレス情報ファイル内の2ヶ所にあってリンクエラーとなる。そのため、プログラマは、プログラムの不正に気付くことができる。
【００９４】
また、ＲＯＭ化を行う前のプログラム開発・テスト時と実利用時とで、同じコードでデバッグすることができるので、プログラムのテストに関して信頼性が向上する。
【００９５】
〔実施形態２〕
本実施形態２では、実施形態１に示したビルド処理が実行され、作成されたファイルがＲＡＭ１８上に残されている状況を想定し、さらに新たなオブジェクトコード群を追加する場合に対する、ビルドツールの機能を述べる。
【００９６】
図２は、実施形態２のビルドツールを含む、マルチコアプロセッサであるマイコンチップ用のプログラム開発システム全体を表すブロック図である。
【００９７】
マイコンチップ用のプログラム開発システムは、ディスプレイ１４とキーボード１３が接続され、ＲＯＭライタ１５を介して、マイコンチップ２０に接続可能な構成となっており、図１に示したＰＣ本体１２と同様である。また、マイコンチップ２０の構成も、図１に示したマイコンチップ２０と同様である。同一部分の説明は省略する。
【００９８】
ＰＣ本体１２のＨＤＤ１７には、ライブラリ１０を備えたビルドツール１が格納されており、ＲＡＭ１８に転送され、ビルドプログラムが実行される。ＲＡＭ１８には、追加されるオブジェクトコード群３（３０＿３）、ライブラリ１０、リエントラント関数名ファイル３（３１＿３）、全リエントラント関数名ファイル３２＿１、ロードモジュールＲ更新情報ファイル３６、ロードモジュールＲ（３４＿Ｒ）、及び、関数アドレス情報ファイル３３、ロードモジュール３（３４＿３）が保持される。
【００９９】
ビルドツール１は、リエントラント関数名出力部２と、ロードモジュールＲ更新判定部６と、リエントラント関数名追加出力部７とリエントラント関数ロードモジュール出力部４と、コードリンク部５とを備える。追加して入力されたオブジェクトコード群３（３０＿３）に基づいて、リエントラント関数を含むライブラリ１０を参照して、オブジェクトコード群３（３０＿３）に対応するロードモジュール３（３４＿３）を出力し、リエントラント関数のロードモジュールＲ（３４＿Ｒ）を更新する。生成されたロードモジュール３（３４＿３）と更新されたロードモジュールＲ（３４＿Ｒ）は、ＲＯＭライタ１５により、マイコンチップ２０のＲＯＭ２５に書き込まれる。
【０１００】
図５は、実施形態２のビルドツールの動作を表す説明図である。
【０１０１】
追加されるオブジェクトコード群３（３０＿３）はアドレスが未解決の関数f4の呼出しを含み、これらの関数のアドレス解決ができればロードモジュール３（３４＿３）となるものである。
【０１０２】
リエントラント関数名出力部２は、オブジェクトコード群３（３０＿３）が入力され、ライブラリ１０を参照して、オブジェクトコード群３（３０＿３）から呼び出される、ライブラリ１０のリエントラント関数名を保持するリエントラント関数名ファイル３（３１＿３）を出力する。リエントラント関数名ファイル３（３１＿３）には、関数名f4が含まれる。
【０１０３】
ロードモジュールＲ更新判定部６は、リエントラント関数名ファイル３（３１＿３）と全リエントラント関数名ファイル３２＿１が入力され、実施形態１に示したビルドプログラムから出力された、全リエントラント関数名ファイル３２の更新要否情報を格納する、ロードモジュールＲ更新情報ファイル３６を出力する。全リエントラント関数名ファイル３２の更新の要否は、リエントラント関数名ファイル３（３１＿３）に含まれ、全リエントラント関数名ファイル３２に含まれない関数名の有無に基づいて判断する。ロードモジュールＲ更新情報ファイル３６は、ロードモジュールを更新する必要があることを示す情報「更新必要」を含む。図５に例示されるリエントラント関数名ファイル３（３１＿３）には、更新前の全リエントラント関数名ファイル３２にない関数名f4が含まれているので、「更新必要」とする情報を含む、ロードモジュールＲ更新情報ファイル３６が出力される。
【０１０４】
リエントラント関数名追加出力部７は、リエントラント関数名ファイル３（３１＿３）と、更新前の全リエントラント関数名ファイル３２と、ロードモジュールＲ更新情報ファイル３６の更新要否情報に基づいて、更新後の全リエントラント関数名ファイル３２＿１を出力する。リエントラント関数名追加出力部７は、リエントラント関数名ファイル３（３１＿３）に含まれていて、更新前の全リエントラント関数名ファイル３２に含まれていないリエントラント関数名を追記して、更新後の全リエントラント関数名ファイル３２＿１を出力する。全リエントラント関数名ファイル３２は、実施形態１に示したビルドプログラムから出力された直後は関数名f1, f2, f3を含むファイルであるが、本実施形態で更新処理を行った後は関数名f4が追加され、更新された全リエントラント関数名ファイル３２＿１となる。
【０１０５】
リエントラント関数ロードモジュール出力部４には、リエントラント関数名出力部２によって追記された全リエントラント関数名ファイル３２＿１が入力され、ライブラリ１０を参照して、ロードモジュールＲ更新情報ファイル３６の更新要否情報に従って、ロードモジュールＲ（３４＿Ｒ）及びリエントラント関数アドレス情報ファイル３３を更新する。リエントラント関数ロードモジュール出力部４は、ロードモジュールＲ更新情報ファイル３６の情報が「更新必要」なので、それまでのロードモジュールＲ（３４＿Ｒ）内の関数のアドレスは変更せずに、追加された関数のアドレスを解決して、ロードモジュールＲ（３４＿Ｒ）及び関数アドレス情報ファイル３３を出力して既存のファイルを上書きする。即ち、ロードモジュールＲ（３４＿Ｒ）に関数f4の定義を追加し、リエントラント関数アドレス情報ファイル３３に関数f4が割り付けられたアドレス0x44を追加する。
【０１０６】
コードリンク部５は、オブジェクトコード群３（３０＿３）と更新されたリエントラント関数アドレス情報ファイル３３が入力され、ライブラリ１０を参照して、オブジェクトコード群３（３０＿３）に対応するロードモジュール３（３４＿３）を出力する。オブジェクトコード群３（３０＿３）における、リエントラント関数を参照する関数名シンボルを、リエントラント関数アドレス情報ファイル３３内の関数アドレスで置き換え、リエントラント関数以外を呼び出す関数のアドレス未解決な関数名シンボルを、ライブラリ１０とリンクしてアドレス解決する。オブジェクトコード群３（３０＿３）において、リエントラント関数f4を参照する関数名シンボルを、リエントラント関数アドレス情報ファイル３３内の関数アドレス0x44で置き換えて、ロードモジュール３（３４＿３）を出力する。
【０１０７】
以上、説明したように、オブジェクトコードを追加して新規のリエントラント関数を追加する場合にも、その関数がロードモジュール間で共有され、ロードモジュール群全体の合計コードサイズを小さく保つことができる。また、ロードモジュールＲに以前から登録されている関数の割付アドレスは変更しないので、これらの関数を参照するオブジェクトコード群１及び２の再リンクは必要ない。即ち、高速にビルドを行うことができる。これにより、追加オブジェクトコードがある場合でも共通関数が共有でき、しかも、ビルド時間を短縮することができる。
【０１０８】
〔実施形態３〕
本実施形態３では、実施形態１に示したビルド処理が実行され、作成されたファイルがＲＡＭ１８上に残されている状況を想定し、既にロードモジュールを作成したオブジェクトコード群に修正が発生した場合に対する、ビルドツールの機能を述べる。
【０１０９】
図３は、実施形態３のビルドツールを含む、マルチコアプロセッサであるマイコンチップ用のプログラム開発システム全体を表すブロック図である。
【０１１０】
マイコンチップ用のプログラム開発システムは、ディスプレイ１４とキーボード１３が接続され、ＲＯＭライタ１５を介して、マイコンチップ２０に接続可能な構成となっており、図１に示したＰＣ本体１２と同様である。また、マイコンチップ２０の構成も、図１に示したマイコンチップ２０と同様である。同一部分の説明は省略する。
【０１１１】
ＰＣ本体１２のＨＤＤ１７には、ライブラリ１０を備えたビルドツール１が格納されており、ＲＡＭ１８に転送され、ビルドプログラムが実行される。ＲＡＭ１８には、オブジェクトコード群１（３０＿１）から修正によって変更されたオブジェクトコード群１Ａ（３０＿４）とオブジェクトコード群２（３０＿２）、ライブラリ１０、リエントラント関数名ファイル２（３１＿２）、及び、実施形態１に示したビルドプログラムから出力された、全リエントラント関数名ファイル３２が、ビルドツール１の入力として保持される。また、ロードモジュールＲ更新情報ファイル３６、ロードモジュールＲ（３４＿Ｒ）、関数アドレス情報ファイル３３、及び、ロードモジュール３（３４＿３）が中間データや出力として保持される。
【０１１２】
ビルドツール１は、リエントラント関数名出力部２と、全リエントラント関数名出力部３と、再リンク情報判定部８と、ロードモジュールＲ更新判定部６と、リエントラント関数名編集出力部９とリエントラント関数ロードモジュール出力部４と、コードリンク部５とを備える。変更されたオブジェクトコード群１Ａ（３０＿４）に基づいて、リエントラント関数を含むライブラリ１０を参照して、オブジェクトコード群１（３０＿１）に対応するロードモジュール３４＿１と、リエントラント関数のロードモジュールＲ３４＿Ｒを、それぞれ更新する。更新されたロードモジュール１（３４＿１）とロードモジュールＲ（３４＿Ｒ）は、ＲＯＭライタ１５により、マイコンチップ２０のＲＯＭ２５に書き込まれる。
【０１１３】
図６は、実施形態３のビルドツールの動作を表す説明図である。
【０１１４】
リエントラント関数名出力部２は、オブジェクトコード群１（３０＿１）から変更されたオブジェクトコード群１Ａ（３０＿４）が入力され、ライブラリ１０を参照して、リエントラント関数名ファイル１Ａ（３１＿４）を出力する。リエントラント関数名ファイル１Ａ（３１＿４）は、オブジェクトコード群１Ａ（３０＿４）から参照される、ライブラリ１０内のリエントラント関数の関数名を保持する。図６では、実施形態１においてオブジェクトコード群１（３０＿１）はアドレスが未解決の関数f1, f2, f3の呼出しを含んだファイルだったが、プログラマによって変更されて、アドレスが未解決の関数f2, f3の呼出しを含んだオブジェクトコード群１Ａ（３０＿４）になった例を示す。
【０１１５】
全リエントラント関数名出力部３には、リエントラント関数名ファイル１Ａ（３１＿４）とリエントラント関数名ファイル２（３１＿２）が入力され、それらに含まれる全てのリエントラント関数名を重複なく含む全リエントラント関数名ファイル（３２＿２）が出力される。全リエントラント関数名ファイルは本実施形態のビルド処理による更新前、即ち、実施形態１に示したビルドプログラムを実行した直後は関数名f1, f2, f3を含むファイルであるが、更新後、即ち、本実施形態のビルド処理による更新後の全リエントラント関数名ファイル３２＿２は、関数名f2, f3を含むファイルとなる。
【０１１６】
再リンク情報判定部８には、更新前の全リエントラント関数名ファイル３２と、更新後の全リエントラント関数名ファイル３２＿２と、リエントラント関数名ファイル２（３１＿２）とが入力され、リエントラント関数名ファイル２（３１＿２）を再リンクするか否かの情報を、再リンク情報ファイル３７に出力する。再リンク情報ファイル３７は、既にロードモジュールを作成したオブジェクトコード群を再びロードモジュールＲ（３４＿Ｒ）とリンクするか否かを示す情報であり、図６では「再リンクする」となっている例を示す。
【０１１７】
再リンク情報判定部８は、まず、更新前の全リエントラント関数名ファイル３２の内容「f1, f2, f3」と更新後の全リエントラント関数名ファイル３２＿２の内容「f2, f3」を比較して、ファイル先頭から最初に異なる関数名が出現するまでの関数名から構成される一致関数名ファイルを作成する。図６に示した例では、一致関数名ファイルは空ファイルとなる。次に、リエントラント関数名ファイル２（３１＿２）の中に上記一致関数名ファイルにない関数名が含まれるなら再リンクし、そうでないなら再リンクしないという情報を再リンク情報ファイル３７に出力する。図６に示した例では、リエントラント関数名ファイル２（３１＿２）に、一致関数名ファイルにない関数名f2, f3があるので、「再リンクする」となる。
【０１１８】
ロードモジュールＲ更新判定部６には、更新前の全リエントラント関数名ファイル３２と更新後の全リエントラント関数名ファイル３２＿２が入力され、ロードモジュールＲ（３４＿Ｒ）を更新するか否かの更新情報を格納するロードモジュールＲ更新情報ファイル３６を出力する。ロードモジュールＲ更新情報ファイル３６はロードモジュールＲ（３４＿Ｒ）に含まれる既存部分も更新する必要があることを示す情報「書換え必要」を含むファイルである。
【０１１９】
ロードモジュールＲ更新判定部８もまず、更新前の全リエントラント関数名ファイル３２と更新後の全リエントラント関数名ファイル３２＿２のファイルの先頭から、最初に異なる関数名が出現するまでの関数名から構成される、一致関数名ファイルを作成する。図６に示した例では、一致関数名ファイルは空ファイルとなる。次に、全リエントラント関数名ファイルと一致関数名ファイルが一致していないので、「書換え必要」とする情報をロードモジュールＲ更新情報ファイル３６に出力する。
【０１２０】
リエントラント関数名編集出力部９には、更新前の全リエントラント関数名ファイル３２と、更新後の全リエントラント関数名ファイル３２＿２とが入力され、ロードモジュールＲ更新情報ファイル３６の情報に従って更新前の全リエントラント関数名ファイル３２を更新後の全リエントラント関数名ファイル３２＿２で上書きする。図６に示した例では、リエントラント関数名編集出力部９はロードモジュールＲ更新情報ファイル３６が「書換え必要」とする情報を含むので、リエントラント関数名ファイル１Ａ（３１＿４）を全リエントラント関数名ファイル３２＿２に上書きして出力する。この結果、リエントラント関数名ファイル３２＿２は、更新前のf1, f2, f3から更新後のf2, f3に変わる。
【０１２１】
リエントラント関数ロードモジュール出力部４には、リエントラント関数名編集出力部９で編集された全リエントラント関数名ファイルファイル３２＿２とロードモジュールＲ更新情報ファイル３６が入力され、ライブラリ１０を参照して、ロードモジュールＲ更新情報ファイル３６の情報に従って、ロードモジュールＲ（３４＿Ｒ）とリエントラント関数アドレス情報ファイル３３とを更新する。リエントラント関数アドレス情報ファイル３３は、関数名シンボルとそのシンボルが指すアドレスから構成されるオブジェクトコードであり、更新前、即ち、実施形態１に示したビルドプログラムを実行した直後は関数f1, f2, f3の配置アドレスを含むファイルであるが、更新後、即ち、本実施形態で更新処理を行った後は関数f2, f3の配置アドレスを含むファイルとなる。関数f1が削除されたことにより、関数f2, f3のアドレスが各々、0x24が0x1a, 0x38が0x2eに変更されている。また、ロードモジュールＲ（３４＿Ｒ）は更新前、即ち、実施形態１に示したビルドプログラムを実行した直後は関数f1, f2, f3から構成されるロードモジュールであったが、更新後、即ち、本実施形態で更新処理を行った後は関数f2, f3から構成されるロードモジュールとなる。リエントラント関数ロードモジュール出力部４は、ロードモジュールＲ更新情報ファイル３６の情報「書換え必要」に従って、以前の関数アドレスを全てなくし、新規にリンク処理を行ってロードモジュールＲ（３４＿Ｒ）及びリエントラント関数アドレス情報ファイル３３を出力して既存のファイルを上書きする。この結果、ロードモジュールＲでは関数f2, f3の割付アドレスが0x1a, 0x2eと新たなアドレスに変更される。
【０１２２】
コードリンク部５には、変更されたオブジェクトコード群１Ａ（３０＿４）と、再リンク情報ファイル３７と、リエントラント関数アドレス情報ファイル３３とが入力される。コードリンク部５は、ライブラリ１０を参照して、変更されたオブジェクトコード群１Ａ（３０＿４）における、リエントラント関数を参照する関数名シンボルをリエントラント関数アドレス情報ファイル３３内の関数アドレスで置き換える。さらに、リエントラント関数以外を呼び出す関数のアドレス未解決な関数名シンボルを、上記ライブラリとリンクしてアドレス解決し、変更されたオブジェクトコード群１Ａ（３０＿４）に対応するロードモジュールを出力してロードモジュール１（３４＿１）を上書きする。コードリンク部５は、ライブラリ１０を参照して、再リンク情報ファイル３７にオブジェクトコード群２（３０＿２）を再リンクする情報があるなら、オブジェクトコード群２（３０＿２）において、リエントラント関数を参照する関数名シンボルをリエントラント関数アドレス情報ファイル３３内の関数アドレスで置き換える。さらに、それら以外の未解決なシンボルは上記ライブラリとリンクしてそのアドレスを解決した結果であるロードモジュールを出力してロードモジュール２（３４＿２）を上書きする。
【０１２３】
図６に示した例では、コードリンク部５は再リンク情報ファイルに「再リンクする」との情報があるので、オブジェクトコード群１Ａ（３０＿４）と共にオブジェクトコード群２（３０＿２）も再リンクし、その結果、ロードモジュール１及び２（３４＿１〜２）を出力する。ロードモジュール１（３４＿１）は、オブジェクトコード群１（３０＿１）における関数f1, f2, f3の呼出しが、オブジェクトコード群１Ａ（３０＿４）において関数f2, f3の呼出しに変更にされたことに伴って、各々のシンボルを、ロードモジュールＲ（３４＿Ｒ）における関数f2, f3のアドレス0x1a, 0x2eに置き換えることによって変更される。ロードモジュール２（３４＿２）はオブジェクトコード群２（３０＿２）における関数f2, f3の呼出しを、ロードモジュールＲ（３４＿Ｒ）における関数f2, f3のアドレス0x1a, 0x2eに置換される。
【０１２４】
本実施形態３によれば、例えば実施形態１に示した方法でロードモジュールをすでに作成した、オブジェクトコード群に、その後修正が発生した場合にも、共通なリエントラント関数がロードモジュール間で共有され、ロードモジュール群全体の合計コードサイズが小さく保たれることがわかる。また、ロードモジュールＲの変更が必要か否か、修正が発生したオブジェクトコード群以外のオブジェクトコード群の再リンクが必要か否かを判定して処理するので、ビルドにかかる時間を短くすることができる。
【０１２５】
これにより、例えば実施形態１に示した方法で、既にロードモジュールを作成したオブジェクトコード群に修正が発生した場合でも共通するリエントラント関数が共有でき、しかも、ビルド時間を短縮することができる。
【０１２６】
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
【０１２７】
例えば、ビルドツールを構成する各機能ブロックは、実施形態に示した通りに分割されている必要はなく、ビルドツールが全体として、当該機能を実現する部分を含んで構成されていれば良い。また、ビルドツール自体は、他のツールをさらに含んで構成されてもよく、さらに大きな開発システムの一部として実現されても良い。
【符号の説明】
【０１２８】
１  ビルドツール
２  リエントラント関数名出力部
３  全リエントラント関数名出力部
４  リエントラント関数ロードモジュール（ロードモジュールＲ）出力部
５  コードリンク部
６  リエントラント関数ロードモジュール（ロードモジュールＲ）更新判定部
７  リエントラント関数名追加出力部
８  再リンク情報判定部
９  リエントラント関数名編集出力部
１０  ライブラリ
１２  コンピュータ（ＰＣ）
１３  キーボード
１４  ディスプレイ
１５  ＲＯＭライタ
１６  （コンピュータ側）ＣＰＵ
１７  ハードディスク
１８  （コンピュータ側）ＲＡＭ
１９  （コンピュータ側）バス
２０  マイコンチップ
２１  （マイコンチップ内）ＣＰＵコア
２２  （マイコンチップ内）ＣＰＵ
２３  （マイコンチップ内）ローカルメモリ
２４  （マイコンチップ内）ＲＡＭ
２５  （マイコンチップ内）ＲＯＭ
２６  （マイコンチップ内）バス
３０  オブジェクトコード群
３１  リエントラント関数名ファイル
３２  全リエントラント関数名ファイル
３３  リエントラント関数アドレス情報ファイル
３４  ロードモジュール
３５  （マイコンチップ内）ロードモジュール
３６  リエントラント関数ロードモジュール（ロードモジュールＲ）更新情報ファイル
３７  再リンク情報ファイル
【図１】
2014182711.tif 000003
【図２】
2014182711.tif 000004
【図３】
2014182711.tif 000005
【図４】
2014182711.tif 000006
【図５】
2014182711.tif 000007
【図６】
2014182711.tif 000008
【図７】
2014182711.tif 000009
【図８】
2014182711.tif 000010
【図９】
2014182711.tif 000011
【図１０】
2014182711.tif 000012