(57)【要約】【課題】  同じ値をとる初期値を１箇所にまとめた実行形式ファイルを生成することのできるリンカ、およびその実行形式ファイルのロードに適した情報処理装置を提供する。【解決手段】  リンカ１は、リンク対象のオブジェクトファイル３００を検索して、型が同じで初期値が同じ変数を検出する変数検出部１１と、変数検出部１１で検出された変数の初期値を１つに統合した統合初期値を実行形式ファイル２０の初期値格納領域に格納する初期値統合部１２と、統合初期値の格納アドレスを転送元アドレスとし、統合初期値を使用する変数の格納アドレスを転送先アドレスとする転送テーブル２１を実行形式ファイル２０中に作成する転送テーブル生成部１３と、転送テーブル２１に記載された転送元アドレスおよび転送先アドレスを参照して統合初期値を変数へ転送する転送ルーチン２２を実行形式ファイル２０中に生成する転送ルーチン生成部１４と、を有する。【選択図】  図１
2007310667.tif 000002
【特許請求の範囲】
【請求項１】
リンク対象のオブジェクトファイルに記述されている変数の中で、同じ型で初期値が同じ変数は前記初期値を１つに統合して初期値格納領域に格納し、その初期値とその初期値を使用する変数との対応を記載した転送テーブルを作成するとともに、前記転送テーブルを参照して前記初期値を前記初期値格納領域から前記変数へ転送する転送ルーチンを生成し、前記オブジェクトファイルをリンクして生成する実行ファイル中に前記転送テーブルおよび前記転送ルーチンを記載することを特徴とするリンカ。
【請求項２】
複数のオブジェクトファイルをリンクして実行形式ファイルを生成するときに前記複数のオブジェクトファイルを検索して、型が同じで初期値が同じ変数を検出する変数検出手段と、
前記変数検出部で検出された変数の初期値を１つに統合した統合初期値を前記実行形式ファイルの初期値格納領域に格納する初期値統合手段と、
前記統合初期値の格納アドレスを転送元アドレスとし、前記統合初期値を使用する変数の格納アドレスを転送先アドレスとする転送テーブルを前記実行形式ファイル中に作成する転送テーブル生成手段と、
前記転送テーブルを参照して前記統合初期値を前記変数へ転送する転送ルーチンを前記実行形式ファイル中に生成する転送ルーチン生成手段と
を有することを特徴とするリンカ。
【請求項３】
前記転送テーブルは、１つに統合された初期値ごとに区切り文字で区切られて、前記転送元アドレスと前記転送先アドレスが記載されていることを特徴とする請求項２に記載されたことを特徴とするリンカ。
【請求項４】
請求項１乃至３のいずれか１項に記載のリンカによって生成された実行形式ファイルがロードされる情報処理装置であって、ロードされた前記実行形式ファイルのメイン処理に移行する前に、前記実行形式ファイル形式に記載されている前記転送ルーチンを実行し、前記転送テーブルに記載されている前記転送元アドレスに格納されている値を前記転送テーブルに記載されている前記転送先アドレスに転送することを特徴とする情報処理装置。
【請求項５】
リセット直後に、前記転送テーブルおよび前記転送ルーチンをＲＡＭ領域に書き込むことを特徴とする請求項４に記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、リンカおよび情報処理装置に関し、特に複数のオブジェクトファイルをリンクして実行形式ファイルを生成するリンカ、およびその生成された実行形式ファイルのプログラムを実行する情報処理装置に関する。
【背景技術】
【０００２】
Ｃ言語などの高級言語で記述されたソースプログラムは、コンパイラおよびアセンブラでオブジェクトプログラムにコンパイルされる。このとき、ソースプログラムが複数のファイルに分かれている場合、それぞれのファイルがコンパイルおよびアセンブルされて、複数のオブジェクトファイルが生成される。この複数のオブジェクトファイルは、リンカでリンクされて、１つの実行形式ファイルに変換される。
【０００３】
Ｃ言語では、プログラム実行中のデータの格納領域を変数と呼び、変数宣言することにより任意に変数を使用することができる。この変数宣言では、それぞれの変数に変数名を付し、変数の種類を示す型を指定する必要がある。また、変数に対して初期値を設定することができる。
【０００４】
このような初期値付きの変数が用いられたソースファイルをコンパイルおよびアセンブルすると、オブジェクトファイル上では、各変数は、ＣＰＵからアクセスされる領域と初期値を格納する領域とに分けられて配置される。このようなオブジェクトファイルをリンクすると、実行形式ファイル上でも、変数は、ＣＰＵからアクセスされる領域と初期値を格納する領域とに分けられて配置される。
【０００５】
このとき、異なる変数が同じ初期値をとる場合でも、初期値を格納する領域には、従来、同じ初期値が重複して格納されていた。そのため、実行形式ファイルをコンピュータのメモリにロードしたときに、この初期値を格納する領域をＲＯＭに割り当てると、ＲＯＭの容量が増大するという問題があった。
【０００６】
そこで、同じ型で同じ初期値を有する読み出し専用変数に対しては、初期値の領域を１個だけ割り当て、各変数はこの初期値を引用することで使用するメモリ容量の低減を図る「実行プログラム最適化装置」が提案されている（特許文献１）。
【０００７】
しかし、上述の「実行プログラム最適化装置」では、その対象が読み出し専用変数に限られているため、メモリ容量の低減効果が少ないという問題があった。
【０００８】
例えば、Ｃ言語では、初期値を設定できるものとして、１つのデータを格納する上述の変数のほかに、同じ型の複数のデータを格納する配列や、異なる型の複数のデータを格納する構造体がある。このような配列や構造体おいて、複数の配列あるいは複数の構造体が、それぞれ同じ初期値をとる場合、従来同様、実行形式ファイルの初期値を格納する領域に同じ初期値が重複して格納されることになる。
【０００９】
特に、配列や構造体が多数のデータを格納する場合、その初期値データも多数となり、メモリ領域をより多く使用するという問題があった。
【特許文献１】特開平１１−３３８７０７号公報  （第３ページ、図１）
【発明の開示】
【発明が解決しようとする課題】
【００１０】
そこで、本発明の目的は、複数のオブジェクトファイルをリンクするときに、同じ値をとる初期値を１箇所にまとめた実行形式ファイルを生成することのできるリンカ、およびその実行形式ファイルのロードに適した情報処理装置を提供することにある。
【課題を解決するための手段】
【００１１】
本発明の一態様によれば、リンク対象のオブジェクトファイルに記述されている変数の中で、同じ型で初期値が同じ変数は前記初期値を１つに統合して初期値格納領域に格納し、その初期値とその初期値を使用する変数との対応を記載した転送テーブルを作成するとともに、前記転送テーブルを参照して前記初期値を前記初期値格納領域から前記変数へ転送する転送ルーチンを生成し、前記オブジェクトファイルをリンクして生成する実行ファイル中に前記転送テーブルおよび前記転送ルーチンを記載することを特徴とするリンカが提供される。
【００１２】
また、本発明の別の一態様によれば、複数のオブジェクトファイルをリンクして実行形式ファイルを生成するときに前記複数のオブジェクトファイルを検索して、型が同じで初期値が同じ変数を検出する変数検出手段と、前記変数検出部で検出された変数の初期値を１つに統合した統合初期値を前記実行形式ファイルの初期値格納領域に格納する初期値統合手段と、前記統合初期値の格納アドレスを転送元アドレスとし、前記統合初期値を使用する変数の格納アドレスを転送先アドレスとする転送テーブルを前記実行形式ファイル中に作成する転送テーブル生成手段と、前記転送テーブルを参照して前記統合初期値を前記変数へ転送する転送ルーチンを前記実行形式ファイル中に生成する転送ルーチン生成手段とを有することを特徴とするリンカが提供される。
【発明の効果】
【００１３】
本発明によれば、実行形式ファイル上で同じ値をとる初期値を１箇所にまとめることのできるので、実行形式ファイルを情報処理装置のメモリにロードしたときに、初期値を格納するメモリの容量を削減することができる。
【発明を実施するための最良の形態】
【００１４】
以下、本発明の実施例を図面を参照して説明する。
【実施例１】
【００１５】
図１は、本発明の実施例１に係るリンカの構成の例を示すブロック図である。本実施例のリンカ１は、複数のソーファイル１００をそれぞれコンパイラ２００でコンパイルした、複数のオブジェクトファイル３００をリンクして、実行形式ファイル２０を生成する。
【００１６】
リンカ１は、リンク対象のオブジェクトファイル３００を検索して、型が同じで初期値が同じ変数を検出する変数検出部１１と、変数検出部１１で検出された変数の初期値を１つに統合した統合初期値を実行形式ファイル２０の初期値格納領域に格納する初期値統合部１２と、統合初期値の格納アドレスを転送元アドレスとし、統合初期値を使用する変数の格納アドレスを転送先アドレスとする転送テーブル２１を実行形式ファイル２０中に作成する転送テーブル生成部１３と、転送テーブル２１に記載された転送元アドレスおよび転送先アドレスを参照して統合初期値を変数へ転送する転送ルーチン２２を実行形式ファイル２０中に生成する転送ルーチン生成部１４と、を有する。
【００１７】
図２は、リンカ１における転送テーブル２１の作成手順を示すフロー図である。なお、転送テーブル２１は、記載事項の増加とともに、所定の記載形式に従って、その内容が追加されるものとする。また、転送テーブル２１のアドレスは、リンク過程においてリンカ１が決定する。
【００１８】
転送テーブル２１の作成の開始にあたっては、まず、使用されている変数の型の中から１つの型を選択する。Ｃ言語の場合、変数の型としては、整数型、倍長整数型、単精度浮動小数点型、倍精度浮動小数点型、文字型が予め定義されている。その他に、これらの型を複数合わせた新しい型として、ユーザが定義した構造体も型として使用される。そこで、ここでは、この構造体も含めて変数の型を選択する（ステップＳ０１）。
【００１９】
このとき、型のサイズは型によって異なるので、選択した型のサイズを転送テーブル２１に出力する（ステップＳ０２）。
【００２０】
続いて、リンク対象の総てのオブジェクトファイル３００を検索し（ステップＳ０３）、初期値が同じ変数を２つ以上検出したか、チェックする（ステップＳ０４）。
【００２１】
初期値が同じ変数を２つ以上検出したときは（ＹＥＳ）、その初期値を１つに統合し、統合初期値として実行形式ファイル２０の初期値格納領域に格納し（ステップＳ０５）、その格納アドレスを転送元アドレスとして転送テーブル２１に記載する（ステップＳ０６）。
【００２２】
さらに、同じ初期値をとる各変数が格納されている変数データ格納領域のアドレスを転送先アドレスとして転送テーブル２１に記載し（ステップＳ０７）、その後に、予め定めた区切り文字を転送テーブル２１に記載する（ステップＳ０８）。
【００２３】
区切り文字の記載後、あるいは、ステップＳ０４のチェックで初期値が同じ変数を２つ以上検出しなかったときは（ＮＯ）、総ての型を検索し終わっているかどうかチェックする（ステップＳ０９）。
【００２４】
総ての型を検索し終わっていないときは（ＮＯ）、ステップＳ０１に戻って、以降のフローを繰り返す。
【００２５】
総ての型を検索し終わっているときは（ＹＥＳ）、転送テーブル２１に記載した区切り文字の個数を転送テーブル２１に記載して（ステップＳ１０）、転送テーブル２１の作成を終了する。
【００２６】
図３に、上述のフローで作成した転送テーブルの例を示す。
【００２７】
転送テーブルは、区切り文字数が先頭に記載され、その後、それぞれの統合初期値に対して、型のサイズ、転送元アドレス、複数の転送先アドレス、区切り文字が順次記載される。区切り文字は、統合初期値間の情報の区切りを示す。
【００２８】
図４に、本実施例のリンカ１で作成した実行形式ファイル２０の構造の例を示す。ここでは、図４（ａ）に示す３つのオブジェクトファイル３００Ａ〜Ｃをリンカ１でリンクして作成した実行形式ファイル２０の構造を図４（ｂ）に示す。
【００２９】
いま、図４（ａ）に示すオブジェクトファイル３００Ａでは初期値ｓ１をとる変数Ａ１、初期値ｓ２をとる変数Ａ２が使用され、オブジェクトファイル３００Ｂでは初期値ｓ１をとる変数Ｂ１、初期値ｓ２をとる変数Ｂ２が使用され、オブジェクトファイル３００Ｃでは初期値ｓ１をとる変数Ｃ１、初期値ｓ２をとる変数Ｃ２が使用されているものとする。
【００３０】
すなわち、オブジェクトファイル３００Ａ〜Ｃを通して、変数Ａ１、Ｂ１、Ｃ１は共通の初期値ｓ１をとり、変数Ａ２、Ｂ２、Ｃ２は共通の初期値ｓ２をとっているものとする。
【００３１】
このようなオブジェクトファイル３００Ａ〜Ｃを本実施例のリンカ１へ入力すると、図４（ｂ）に示すような構造の実行形式ファイル２０が出力される。
【００３２】
図４（ｂ）に示す実行形式ファイル２０では、変数データ格納領域に変数Ａ１〜Ｃ２が格納され、初期値格納領域に変数Ａ１〜Ｃ１の共通の初期値であるｓ１が統合初期値ｓ１として格納され、変数Ａ２〜Ｃ２の共通の初期値であるｓ２が統合初期値ｓ２として格納される。また、実行形式ファイル２０には、転送テーブル２１および転送ルーチン２２が格納される。
【００３３】
図４（ｃ）には、参考として、従来のリンカで生成された実行形式ファイルの例を示す。従来の実行形式ファイルでは、変数Ａ１〜Ｃ２に対する初期値がそれぞれ初期値格納領域に格納される。したがって、初期値ｓ１と初期値ｓ２が、それぞれ重複して３つずつ格納されている。すなわち、従来のリンカで生成された実行形式ファイルでは、本実施例のリンカ１で作成した実行形式ファイル２０に比べて、初期値の格納に３倍の格納領域を必要とする。
【００３４】
さらに具体的な例を図５および図６を用いて説明する。なお、ここでは、Ｃ言語で記述されたソースファイルを例にとって説明する。
【００３５】
図５は、変数として構造体を使用するソースファイル１００Ａ〜Ｃの例を示す。いま、５つのメンバｍｅｍ１〜ｍｅｍ５からなる構造体ＡＡＡが宣言され、ソースファイル１００Ａでは変数ｄａｔａＡ［３］、ソースファイル１００Ｂでは変数ｄａｔａＢ［３］、ソースファイル１００Ｃでは変数ｄａｔａＣ［３］がこの構造体ＡＡＡを使用し、各変数は共通の初期値をとることが記述されているものとする。
【００３６】
ここで、変数ｄａｔａＡ［３］、ｄａｔａＢ［３］、ｄａｔａＣ［３］は、それぞれ３つの要素からなる配列を示し、ソースファイル１００Ａ〜Ｃには、それぞれの要素が初期値（１００，０，０，０，０）をとることが記述されている。
【００３７】
このソースファイル１００Ａ〜Ｃをコンパイラ２００でコンパイルすると、図６（ａ）に示すオブジェクトファイル３００Ａ〜Ｃが生成される。このオブジェクトファイル３００Ａ〜Ｃでは、変数ｄａｔａＡ［３］、ｄａｔａＢ［３］、ｄａｔａＣ［３］の各３要素に対する初期値（１００，０，０，０，０）がそれぞれ羅列されている。従って、オブジェクトファイル３００Ａ〜Ｃ全体で見ると、初期値（１００，０，０，０，０）が９箇所に格納されている。
【００３８】
図６（ｂ）は、図６（ａ）に示したオブジェクトファイル３００Ａ〜Ｃを本実施例のリンカ１でリンクして生成した実行形式ファイル２０の例を示す。
【００３９】
この実行形式ファイル２０では、変数ｄａｔａＡ［３］、ｄａｔａＢ［３］、ｄａｔａＣ［３］の各要素に対する初期値（１００，０，０，０，０）は１つに統合され、統合初期値として初期値格納領域に格納される。その結果、従来に比べ、初期値格納領域の使用量は１／９に減少する。
【００４０】
このようにしてリンカ１で生成された実行形式ファイルは、マイクロコンピュータなどの情報処理装置のメモリにロードされ、命令内容の処理が実行される。このとき、情報処理装置は、メイン処理に移行する前に、実行形式ファイル形式に記載されている転送ルーチン２２を実行し、転送テーブル２１の転送元アドレスに格納されている統合初期値を転送先アドレスに記載されている各変数へ転送する。
【００４１】
図７は、情報処理装置における転送ルーチン２２の処理の流れを示すフロー図である。
【００４２】
転送ルーチンの処理を開始すると、転送テーブル２１の先頭アドレスを取得し（ステップＳ２１）、区切り文字数のデータを取得し（ステップＳ２２）、区切り文字数の値が０であるかどうかを判定する（ステップＳ２３）。
【００４３】
区切り文字数の値が０でなければ（ＮＯ）、続いて、型のサイズと転送元アドレスを読み取り（ステップＳ２４）、転送元アドレスから統合初期値を取得する（ステップＳ２５）。
【００４４】
引き続き、転送テーブル２１に記載されている次のデータを読み取り（ステップＳ２６）、そのデータが予め定めた区切り文字と一致するかどうかを判定する（ステップＳ２７）。
【００４５】
転送テーブル２１から読み取ったデータが区切り文字と一致しないときは、そのデータを転送先アドレスと判断し（ステップＳ２８）、その転送先アドレスへ先に取得しておいた統合初期値を転送する（ステップＳ２９）。
【００４６】
その後、ステップＳ２６の処理へ戻り、以降の処理を繰り返す。
【００４７】
一方、ステップＳ２７のチェックで転送テーブル２１から読み取ったデータが区切り文字と一致したときは、取得しておいた区切り文字数のデータの値を１減らし（ステップＳ３０）、ステップＳ２３の判定処理へ戻る。このステップ２３の処理において、区切り文字数の値が０であると判定できたときに（ＹＥＳ）、本転送ルーチンの処理を終了する。
【００４８】
このような本実施例によれば、複数のオブジェクトファイルをリンクするときに、総てのファイルを通じて、複数の変数が同じ初期値をとるときは、その初期値を１つに統合した実行形式ファイルを生成することができるので、初期値を格納する領域の容量を少なくすることができる。
【実施例２】
【００４９】
図８は、本発明の実施例２に係る情報処理装置の構成の例を示すブロック図である。本実施例の情報処理装置５０は、実施例１のリンカ１で生成された実行形式ファイル２０のロードに適した情報処理装置である。
【００５０】
本実施例の情報処理装置５０は、リセット信号入力直後に、実行形式ファイル２０の転送テーブルおよび転送ルーチンをＲＡＭ５２へ書き込むデータ書き込み部５１を有する。
【００５１】
情報処理装置５０は、このＲＡＭ５２に書き込まれた転送テーブルおよび転送ルーチンを用いて、図７に示した転送ルーチンの処理を実行する。
【００５２】
転送ルーチンの処理は、メイン処理の実行前に１度実行すればよいので、転送ルーチンの処理後は、ＲＡＭ５２に書き込んだ転送テーブルおよび転送ルーチンは消去してもよい。そこで、メイン処理の実行中は、転送テーブルおよび転送ルーチンを書き込んだＲＡＭ５２の領域を実行中のデータの書き込みに利用する。
【００５３】
このような本実施例によれば、実行形式ファイルに記載されている転送テーブルおよび転送ルーチンをリセット直後だけＲＡＭに書き込んで転送ルーチンを実行するので、情報処理装置のメモリ領域を有効に活用することができる。
【図面の簡単な説明】
【００５４】
【図１】本発明の実施例１に係るリンカの構成の例を示すブロック図。
【図２】本発明の実施例１に係るリンカにおける転送テーブル作成手順を示すフロー図。
【図３】本発明の実施例１に係るリンカで作成した転送テーブルの例を示す図。
【図４】本発明の実施例１に係るリンカで作成した実行形式ファイルの構造の例を示す図。
【図５】ソースファイルの例を示す図。
【図６】図５に示したソースファイルに対して本発明の実施例１に係るリンカで作成した実行形式ファイルの例を示す図。
【図７】本発明の実施例１に係るリンカで作成した転送ルーチンの処理の流れを示すフロー図。
【図８】本発明の実施例２に係る情報処理装置の構成の例を示すブロック図。
【符号の説明】
【００５５】
１  リンカ
１１  変数検出部
１２  初期値統合部
１３  転送テーブル生成部
１４  転送ルーチン生成部
２０  実行形式ファイル
５０  情報処理装置
５１  データ書き込み部
５２  ＲＡＭ
【図１】
2007310667.tif 000003
【図２】
2007310667.tif 000004
【図３】
2007310667.tif 000005
【図４】
2007310667.tif 000006
【図５】
2007310667.tif 000007
【図６】
2007310667.tif 000008
【図７】
2007310667.tif 000009
【図８】
2007310667.tif 000010