(57)【要約】【課題】命令の内容を変更せずに定数領域のサイズをより抑えた実行可能プログラム生成方法、実行可能プログラムの生成プログラム、及び実行可能プログラムを提供することにある。【解決手段】ソースプログラムをコンパイルして機械語に変換された命令と定数とを有するオブジェクトファイルについて、実行可能プログラムの命令領域に命令をアドレスに対応して配置する命令配置工程と、実行可能プログラムの定数領域に定数をアドレスに対応して配置し、配置したアドレスを命令領域における当該定数の参照部分に配置する定数配置工程とを有し、定数配置工程は、命令領域または定数領域の配置済み領域に定数の値と一致する部分がある場合は、当該定数を定数領域に配置せずに一致する部分のアドレスを参照部分に配置する。【選択図】図７
2012084017.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムをコンパイルして機械語に変換された命令と定数とを有するオブジェクトファイルについて、実行可能プログラムの命令領域に前記命令をアドレスに対応して配置する命令配置工程と、
前記実行可能プログラムの定数領域に前記定数をアドレスに対応して配置し、配置したアドレスを前記命令領域における当該定数の参照部分に配置する定数配置工程と、
を有し、
前記定数配置工程は、前記命令領域または前記定数領域の配置済み領域に前記定数の値と一致する部分がある場合は、当該定数を前記定数領域に配置せずに前記一致する部分のアドレスを前記参照部分に配置することを特徴とする実行可能プログラム生成方法。
【請求項２】
請求項１において、
前記一致する部分は、前記定数領域の配置済み領域におけるひとつまたは複数の前記定数の一部または全部であることを特徴とする実行可能プログラム生成方法。
【請求項３】
請求項１または２において、
前記一致する部分は、前記命令領域の配置済み領域におけるひとつまたは複数の前記命令の一部または全部であることを特徴とする実行可能プログラム生成方法。
【請求項４】
ソースプログラムをコンパイルして機械語に変換された命令と定数とを有するオブジェクトファイルについて、実行可能プログラムの命令領域に前記命令をアドレスに対応して配置する命令配置工程と、
前記実行可能プログラムの定数領域に前記定数をアドレスに対応して配置し、配置したアドレスを前記命令領域における当該定数の参照部分に配置する定数配置工程と、
をコンピュータに実行させ、
前記定数配置工程は、前記命令領域または前記定数領域の配置済み領域に前記定数の値と一致する部分がある場合は、当該定数を前記定数領域に配置せずに前記一致する部分のアドレスを前記参照部分に配置することを特徴とするコンピュータ読み取り可能な実行可能プログラムの生成プログラム。
【請求項５】
ソースプログラムをコンパイルして機械語に変換された命令と当該命令において参照される定数の参照アドレスとが配置された命令領域と、
前記定数が配置された定数領域と、
を有し、
前記参照アドレスは、前記命令領域のアドレス、または、前記定数領域における当該参照アドレスの示す前記定数とは異なる前記定数のアドレスを有することを特徴とする実行可能プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、実行可能プログラム生成方法、実行可能プログラムの生成プログラム、及び実行可能プログラムに関する。
【背景技術】
【０００２】
アセンブリ言語、Ｃ言語等のプログラミング言語で記述されたソースプログラムは、コンパイル及びリンカによって実行可能プログラムに変換される。コンパイラは、ソースプログラムをコンパイルしてオブジェクトファイルを生成し、リンカはひとつまたは複数のオブジェクトファイルを結合して実行可能プログラムを生成する。
【０００３】
このようにして生成された実行可能プログラムは、例えば、マイクロコンピュータ組込み機器等のＲＯＭ（Read Only Memory）に格納される。そこで、機器のコストを抑えるために、ＲＯＭに格納する実行可能プログラムのサイズをより小さく抑えること、または一定サイズ以下に収めることが求められる。実行可能プログラムのサイズを抑えるために、例えば、コンパイラの最適化機能が用いられる。
【０００４】
しかしながら、コンパイルによる最適化を行うと、最適化前の実行可能プログラムと、最適化後の実行可能プログラムとでその命令の内容が異なってしまう。そのため、既に動作検証済みの実行可能プログラムのソースプログラムを、最適化機能を適用してコンパイル、リンクして実行可能プログラムを再生成した場合、再生成した実行可能プログラムに対して再度、動作検証が必要となってしまう。
【０００５】
そこで、例えば、特許文献１のようなリンカにおける定数最適割り付け方法が提案されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平５−２４１８５１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、従来は、実行可能プログラムの定数を割りつけた定数領域のサイズを、リンク対象のオブジェクトファイルの有する定数の値の総サイズよりも小さく抑えることはできなかった。
【０００８】
そこで、本発明は、命令の内容を変更せずに定数領域のサイズをより抑えた実行可能プログラム生成方法、実行可能プログラムの生成プログラム、及び実行可能プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
第１の側面は、ソースプログラムをコンパイルして機械語に変換された命令と定数とを有するオブジェクトファイルについて、実行可能プログラムの命令領域に前記命令をアドレスに対応して配置する命令配置工程と、
前記実行可能プログラムの定数領域に前記定数をアドレスに対応して配置し、配置したアドレスを前記命令領域における当該定数の参照部分に配置する定数配置工程と、
を有し、
前記定数配置工程は、前記命令領域または前記定数領域の配置済み領域に前記定数の値と一致する部分がある場合は、当該定数を前記定数領域に配置せずに前記一致する部分のアドレスを前記参照部分に配置する。
【発明の効果】
【００１０】
第１の側面によれば、命令の内容を変更せずに定数領域のサイズをより抑えることができる。
【図面の簡単な説明】
【００１１】
【図１】本実施の形態例における実行可能プログラム生成装置の構成の一例を表す図である。
【図２】本実施の形態例における実行可能プログラム生成装置のブロック図である。
【図３】ソースプログラムとオブジェクトファイルの一例を表す図である。
【図４】具体例におけるソースプログラムを表す図である。
【図５】具体例におけるオブジェクトファイルを表す図である。
【図６】一般的なリンカの定数配置アドレス決定処理を説明する図である。
【図７】定数配置アドレス決定部の処理を説明するフローチャート図である。
【図８】定数配置アドレス決定部における探索処理を説明するフローチャート図である。
【図９】本実施の形態例のリンカの命令及び変数の配置処理を説明する図である。
【図１０】定数サイズ降順ソート情報を表す図である。
【図１１】本実施の形態例のリンカの定数配置アドレス決定処理を表す第１の図である。
【図１２】本実施の形態例のリンカの定数配置アドレス決定処理を表す第２の図である。
【図１３】本実施の形態例のリンカの定数配置アドレス決定処理を表す第３の図である。
【発明を実施するための形態】
【００１２】
以下、図面にしたがって本発明の実施の形態について説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
【００１３】
本実施の形態例における実行可能プログラム生成方法は、機械語に変換された命令と定数とを有するオブジェクトファイルについて、実行可能プログラムの命令領域に命令をアドレスに対応して配置する命令配置工程と、実行可能プログラムの定数領域に定数をアドレスに対応して配置し、配置したアドレスを命令領域における当該定数の参照部分に配置する定数配置工程とを有する。そして、定数配置工程は、命令領域または定数領域の配置済み領域に前記定数の値と一致する部分がある場合は、当該定数を定数領域に配置せずに一致する部分のアドレスを参照部分に配置する。
【００１４】
図１は、本実施の形態例における実行可能プログラム生成装置１の構成の一例を表す図である。実行可能プログラム生成装置１は、例えば、ＣＰＵ１１、メモリ１２、入出力インターフェイス１３等を有するコンピュータであり、メモリ１２はコンパイラプログラム２１とリンカプログラム２２とを格納する。各プログラム２１、２２はＣＰＵ１１と協働することによって、それぞれコンパイラ２１、リンカ２２として稼働する。
【００１５】
コンパイラ２１は、ソースプログラムＳＰを入力しオブジェクトファイルＯＢを生成し、リンカ２２はひとつまたは複数のオブジェクトファイルＯＢを入力し実行可能プログラムＥＸを生成する。リンカ２２によって生成された実行可能プログラムＥＸは、実行可能プログラム生成装置１から入出力インターフェイス１３を介して、例えば、マイクロコンピュータ組込み機器３のＲＯＭ等のメモリ３４に格納され、当該機器のマイクロプロセッサ３１によって実行される。
【００１６】
なお、リンカ２２は、入出力インターフェイス１３を介して、ネットワーク上のサーバ（図示せず）からオブジェクトファイルＯＢを入力してもよいし、生成した実行可能プログラムＥＸをサーバに出力してもよい。コンパイラ２１についても同様である。
【００１７】
図２は、図１の実行可能プログラム生成装置１におけるコンパイラ２１及びリンカ２２の機能を説明する図である。コンパイラ２１は、１つのソースプログラムＳＰを入力し、命令情報Ｔａ、変数情報Ｔｂ、及び定数情報Ｔｃを有する１つのオブジェクトファイルＯＢを生成する。コンパイラ２１は、言語解析部２１０、命令情報出力部２１１、変数情報出力部２１２、定数情報出力部２１３を有する。具体的に、言語解析部２１０は、ソースプログラムＳＰに記述された字句及び構文を解析して中間コードを生成し、必要に応じて最適化して機械語に変換する。そして、命令情報出力部２１１は機械語のうち命令情報を、変数情報出力部２１２は変数情報を、定数情報出力部２１３は定数情報を、所定の形式に基づいて配置しオブジェクトファイルＯＢを生成する。
【００１８】
変数情報Ｔｂは、ソースプログラムＳＰ上にて変化する値を格納する変数の名前（ラベル名）とその長さ情報を有し、定数情報Ｔｃは、ソースプログラムＳＰ上にて固定値を格納する定数の名前（ラベル名）とその値、及び値の長さ情報を有する。また、命令情報Ｔａは、ひとつまたは複数の命令を有する関数等の命令群に対応する名前（ラベル名）と、当該命令群が機械語に変換された値（命令値）と、当該命令値における参照部分情報を有する。参照部分情報は、命令値における各命令の変数及び定数の参照位置を検知するための情報である。
【００１９】
命令値は、ひとつまたは複数の命令を有しプロセッサが直接理解し実行可能な値である。命令値の有する各命令は、プロセッサに処理させる命令のコードを表す命令部と、命令に応じてさらにひとつまたは複数のアドレス部及びデータ部をそれぞれ有する。具体的に、アドレス部は、例えば、命令の処理対象の情報や定数が格納されるアドレス、演算命令の場合の演算結果を記録するアドレス、ジャンプ命令の場合のジャンプ先アドレス等を有し、データ部は命令が利用するデータを有する。また、参照部分情報は、命令値の各命令において変数及び定数が参照される部分（アドレス部）の、命令値の先頭からの位置（オフセット値）を有する。命令情報Ｔａは、命令値毎に参照部分情報を有する。
【００２０】
図３は、ソースプログラムＳＰ１と当該ソースプログラムＳＰ１に対応するオブジェクトファイルＯＢ１の一例を表す図である。同図のソースプログラムＳＰ１はＣ言語によって記述され、記述ＤＳ１「const char* str1=”cdef”;」では文字列の値「”cdef”」を保持する定数str1が、「const unsigned short num1=0x0077;」では数値「0x0077」を保持する定数num1が定義される。また、記述ＤＳ２「unsigned short num10;」では変数num10が定義され、記述ＤＳ３では命令１、命令２等の命令を有する関数mainが記述されている。なお、同図のソースプログラムＳＰ１には図示していないが、例えば、関数mainの命令１、命令２において定数str1、定数num1、変数num10が参照される。
【００２１】
図３のオブジェクトファイルＯＢ１は、ソースプログラムＳＰ１をコンパイルして生成したオブジェクトファイルである。オブジェクトファイルＯＢ１は、命令情報Ｔａ１として、記述ＤＳ３内のmain関数の有する命令（命令１、命令２）が機械語変換された命令値「0x9FB09E8Fxxxxxxxx9F8E…」と、当該命令値の参照部分情報１Ｔｄ１を有する。参照部分情報１Ｔｄ１は、命令値「0x9FB09E8Fxxxxxxxx9F8E…」の各命令（命令１、命令２）において、定数num1、定数str1、変数num10が参照される部分（アドレス部）の、命令値の先頭からの位置情報（参照部分オフセット）を有する。具体的に、参照部分情報１Ｔｄ１は、例えば、命令値「0x9FB09E8Fxxxxxxxx9F8E…」の先頭から「0x00000004」の位置（この命令値の場合xxxxxxxx部分）で定数num1が参照される旨の情報を有する。
【００２２】
また、図３のソースプログラムＳＰ１において、変数num10は、unsigned short型の値として記述されており、当該型の長さは２バイトである。また、定数str1の値「”cdef”」は１６進数で「0x6364656600」のように表記され、その長さは５バイト、定数num1はunsigned short型の値として記述され、当該型の長さは２バイトである。従って、オブジェクトファイルＯＢ１は、変数情報Ｔｂ１として変数num10の値の長さ情報（２バイト）、及び、定数情報Ｔｃ１として、定数str1の値「0x6364656600」とその長さ情報（５バイト）、定数num1の値「0x0077」とその長さ情報（２バイト）を有する。このように、オブジェクトファイルＯＢ１は、ソースプログラムＳＰ１の記述に対応して、命令情報Ｔａ１、変数情報Ｔｂ１、及び定数情報Ｔｃ１を有する。
【００２３】
図２に戻り、リンカ２２は、ひとつまたは複数のオブジェクトファイルＯＢを結合して、プロセッサが実行可能なプログラム（実行可能プログラムＥＸ）を生成する。具体的に、リンカ２２は、リンク対象の各オブジェクトファイルＯＢの有する各情報をアドレス配置処理情報ＭＬの所定領域に配置して、実行時のメモリ空間の配置を決定し、当該アドレス配置処理情報ＭＬを実行可能プログラムＥＸとして出力する。なお、リンカ２２は、必要に応じて、さらにライブラリ（図示せず）を結合して、実行可能プログラムＥＸを生成してもよい。
【００２４】
リンカ２２は、命令配置アドレス決定部２２１、変数配置アドレス決定部２２２、変数参照アドレス解決部２２３、定数サイズ降順ソート情報ＴＳ、アドレス配置処理情報ＭＬと、定数配置アドレス決定部２３を有する。また、定数配置アドレス決定部２３は、命令領域探索部２３１、定数領域探索部２３２、定数参照アドレス解決部２３３を有する。
【００２５】
具体的に、アドレス配置処理情報ＭＬは命令領域と定数領域とを有し、命令配置アドレス決定部２２１は、リンク対象のオブジェクトファイルＯＢの有する命令情報Ｔａの命令値を、変数及び定数の参照部分を空白にしてアドレス配置処理情報ＭＬの命令領域に配置する。そして、変数配置アドレス決定部２２２は、リンク対象のオブジェクトファイルＯＢの有する変数情報Ｔｂの各変数について、ＲＡＭ（Random Access Memory）に割り当てるアドレスを決定する。続いて、変数参照アドレス解決部２２３は、命令領域に配置された命令値における各変数の参照部分に決定したアドレスを配置する。
【００２６】
そして、定数配置アドレス決定部２３は、リンク対象のオブジェクトファイルＯＢの有する定数情報Ｔｃの各定数について、当該定数の値を定数領域に配置して各定数の配置アドレスを決定し、その配置アドレスを命令領域に配置された命令値における各定数の参照部分に配置する。ただし、本実施の形態例における定数配置アドレス決定部２３は、定数領域に定数を配置する前に、命令領域及び定数領域における配置済み領域に、配置対象の定数の値と一致する部分があるか否かを判別する。そして、一致する部分がある場合、定数配置アドレス決定部２３は当該定数を定数領域に配置せずに、一致する部分のアドレスを配置アドレスとして当該定数の参照部分に配置する。
【００２７】
ここで、まず、一般的なリンカの生成する実行可能プログラムＥＸを具体例に基づいて説明する。具体例において、リンカは、図３のソースプログラムＳＰ１、及び、図４のソースプログラムＳＰ２〜４をコンパイルして生成した図３のオブジェクトファイルＯＢ１、及び、図５のオブジェクトファイルＯＢ２〜４を入力して実行可能プログラムＥＸを生成する。
【００２８】
図４は、ソースプログラムＳＰ２〜４を表す図である。ソースプログラムＳＰ２、ＳＰ３は、図３のソースプログラムＳＰ１と同様にＣ言語で記述され、ソースプログラムＳＰ２では文字列の値「”abcdef”」を保持する定数str2、及び、数値「0x02」を保持する定数num2が、ソースプログラムＳＰ３では文字列の値「”wxyz”」を保持する定数str3が定義されている。
【００２９】
一方、図４のソースプログラムＳＰ４は、アセンブリ言語で記述されたプログラムである。記述ＤＳ４「.import  _str1」は、別のソースプログラムＳＰ（この場合はソースプログラムＳＰ１）で定義された定数及び変数（この場合は定数str1）を使用することを表す。記述ＤＳ４内の他の記述（.import  …）についても同様である。そして、記述ＤＳ５の「nop」はその後に命令が記述されることを表し、記述ＤＳ６の命令「ldi:32  #_num2,R0」は定数num2の値のレジスタＲ０への書き込み指示、命令「ldi:32  #_str1,R1」は定数str1の値のレジスタＲ１への書き込み指示である。また、記述ＤＳ６において、命令「ldi:32  #_str1,R1」の後に、命令３、命令４及びその他の複数の命令が記述されている。
【００３０】
図５は、図４のソースプログラムＳＰ２〜４がそれぞれコンパイルされ生成されたオブジェクトファイルＯＢ２〜４の一例を表す図である。オブジェクトファイルＯＢ２はソースプログラムＳＰ２に、オブジェクトファイルＯＢ３はソースプログラムＳＰ３に、オブジェクトファイルＯＢ４はソースプログラムＳＰ４にそれぞれ対応する。この例において、オブジェクトファイルＯＢ２は定数情報Ｔｃ２、オブジェクトファイルＯＢ３は定数情報Ｔｃ３、オブジェクトファイルＯＢ４は命令情報Ｔａ４及びその参照部分情報１Ｔｄ４を有する。
【００３１】
図４のソースプログラムＳＰ２において、定数str2の値「”abcdef”」は１６進数表記では「0x61626364656600」であり、７バイトの値である。また、定数num2はunsigned char型の値として記述されており、当該型の長さは１バイトである。従って、図５のオブジェクトファイルＯＢ２は、定数情報Ｔｃ２として、定数num2の値「0x02」とその長さ情報（１バイト）、定数str2の値「0x61626364656600」とその長さ情報（７バイト）を有する。同様にして、オブジェクトファイルＯＢ３は、定数情報Ｔｃ３として、定数str3の値「0x7778797A00」とその長さ情報（５バイト）を有する。
【００３２】
また、図５のオブジェクトファイルＯＢ４は、命令情報Ｔａ４として、図４のソースプログラムＳＰ４の記述ＤＳ５、ＤＳ６の命令群「nop／ldi:32  #_num2,R0／ldi:32  #_str1,R1／命令３／命令４／〜」が機械語変換された命令値「0x9FA09F80xxxxxxxx9F81…」と、当該命令値の参照部分情報１Ｔｄ４とを有する。具体的に、記述ＤＳ５の命令「nop」は命令値における値「9FA0」に、記述ＤＳ６の命令「ldi:32  #_num2,R0」は値「9F80xxxxxxxx」に、命令「ldi:32  #_str1,R1」は値「9F81…」に対応する。また、命令値「0x9FA09F80xxxxxxxx9F81…」は、記述ＤＳ６内の命令３、命令４、及びその後に記述された他の命令の値も有するが、当該命令の値は命令値「0x9FA09F80xxxxxxxx9F81…」における「…」部分に含まれる。参照部分情報１Ｔｄ４は、例えば、命令値「0x9FA09F80xxxxxxxx9F81…」の先頭から「0x00000004」の位置で定数num2が参照される旨の情報を有する。定数str1についても同様である。
【００３３】
図６は、一般的なリンカによるアドレス配置処理情報ＭＬ１を表す図である。同図のアドレス配置処理情報ＭＬ１における各セルは1バイトの領域を表し、アドレス配置処理情報ＭＬ１の左端の列のアドレス（0x0006000、0x0006001、…、0x0008000、0x0008001、…）はアドレスの上位７桁を、上端の行のアドレス（０、１、…、Ｆ）はアドレスの下位１桁を表す。また、配置処理情報ＭＬ１のアドレス0x00060000以降は命令領域Ｅ１であり、アドレス0x00080000以降は定数領域Ｅ２である。
【００３４】
アドレス配置処理情報ＭＬ１の命令領域Ｅ１には、リンク対象のオブジェクトファイルＯＢ１〜４の有する２つの命令情報（図３のＴａ１、図５のＴａ４）の命令値が配置される。図６のアドレス配置処理情報ＭＬ１において、命令領域Ｅ１の先頭（0x00060000）からアドレス0x0006003Bまで図５の命令情報Ｔａ４の命令値「0x9FA09F80xxxxxxxx9F81…」が、その後続のアドレス0x0006003Cから図３の命令情報Ｔａ１の命令値「0x9FB09E8Fxxxxxxxx9F8E…」が配置される。
【００３５】
図６のアドレス配置処理情報ＭＬ１の命令領域Ｅ１における、上記図５の命令情報Ｔａ４の命令「nop／ldi:32  #_num2,R0／ldi:32  #_str1,R1／命令３／命令４／〜」に対応する命令値「0x9FA09F80xxxxxxxx9F81…」の配置は、具体的に以下の通りである。命令領域Ｅ１のアドレス0x00060000に配置された２バイトの値「9FA0」Ｃ１は、図４のソースプログラムＳＰ４における記述ＤＳ５の命令「nop」に対応する。そして、アドレス0x00060002に配置された２バイトの値「9F80」Ｃ２は、記述ＤＳ６の命令「ldi:32  #_num2,R0」の命令ldi:32に、アドレス0x00060008に配置された２バイトの値「9F81」Ｃ３は、命令「ldi:32  #_str1,R1」の命令ldi:32に対応する。同様にして、アドレス0x0006000Eに配置された２バイトの値「9F82」Ｃ４は命令３に、アドレス0x00060014に配置された２バイトの値「9F83」Ｃ５は命令４に対応し、アドレス0x0006001Aに配置された２バイトの値「9F84」Ｃ６、及び、アドレス0x00060020に配置された２バイトの値「9F85」Ｃ７は、命令４の後に記述されたその他の命令にそれぞれ対応する。
【００３６】
また、図５の参照部分情報１Ｔｄ４の示す通り、命令値の先頭（0x00060000）からオフセット「0x00000004」部分の領域Ａ２は、定数num2の参照部分である。同様にして、命令値の先頭（0x00060000）からオフセット「0x0000000A」部分の領域Ａ３は、定数str1の参照部分である。図６のアドレス配置処理情報ＭＬ１の領域Ｃ１〜Ｃ７は命令部分を示し、領域Ａ１〜Ａ７は変数及び定数の参照部分を示す。この例において、Ａ２は定数num2、Ａ３は定数str1、Ａ４は定数str2、Ａ５は定数num1、Ａ６は定数str3の参照部分であり、Ａ７は変数num10の参照部分であるものとする。なお、各参照部分Ａ２〜Ａ７は、初め、命令値が配置された時点では空白状態である。
【００３７】
一方、アドレス配置処理情報ＭＬ１の定数領域Ｅ２には、リンク対象のオブジェクトファイルＯＢ１〜４の有する定数情報Ｔｃ１、Ｔｃ２、Ｔｃ３の各定数の値が配置される。図６のアドレス配置処理情報ＭＬ１の定数領域Ｅ２において、その先頭（0x00080000）から、例えば、定数num2の値「0x02」（ｎ２）、定数str1の値「0x6364656600」（ｓ１）、定数str2の値「0x61626364656600」（ｓ２）が配置されている。その他の定数についても、同様に配置される。
【００３８】
そして、命令領域Ｅ１の定数の参照部分Ａ２〜Ａ６には、当該参照部分が参照する定数の定数領域Ｅ２における配置アドレスが配置される。具体的に、例えば、定数num2の値「0x02」の定数領域Ｅ２における配置アドレスは0x00080000である。そのため、命令領域Ｅ１における定数num2の参照部分Ａ２には、当該配置アドレス0x00080000が配置される。同様にして、定数str1の値「0x6364656600」の定数領域Ｅ２における配置アドレスは0x00080001であるため、命令領域Ｅ１における定数str1の参照部分Ａ３には、当該配置アドレス0x00080001が配置される。その他の定数の参照部分Ａ４〜Ａ６についても同様である。
【００３９】
また、命令領域Ｅ１の変数の参照部分Ａ７は、当該参照部分が参照する変数のＲＡＭ上のアドレスが配置される。リンカは、各変数のＲＡＭ上のアドレスをリンカ独自の規定に従って決定する。具体的に、決定された変数num10のアドレスが例えば0x000000xxである場合、命令領域Ｅ１における変数num10の参照部分Ａ７には0x000000xxが配置される。これにより、アドレス配置処理情報ＭＬ１に各情報が配置され、実行可能プログラムＥＸとして出力される。
【００４０】
このように、一般的なリンカによると、リンク対象のオブジェクトファイルＯＢ１〜４の有する定数情報の全定数についてアドレス配置処理情報ＭＬ１の定数領域Ｅ２に配置され、その配置アドレスが命令領域Ｅ１における各定数の参照部分に割り当てられる。このため、一般的なリンカの生成する実行可能プログラムＥＸの定数領域は、少なくともリンク対象のオブジェクトファイルＯＢ１〜４の有する定数の値分のサイズを必要とする。
【００４１】
具体的に、図６のアドレス配置処理情報ＭＬ１では、配置済みの定数領域ＣＥ１のサイズは、リンク対象のオブジェクトファイルＯＢ１〜４の有する定数num2（１バイト）、定数str2（７バイト）、定数str1（５バイト）、定数num1（２バイト）、定数str3（５バイト）の値の長さの合計値「２０（＝１＋７＋５＋２＋５）」バイトである。そこで、実行可能プログラムＥＸのサイズを小さくするために、配置済みの定数領域ＣＥ１のサイズをさらに小さく抑えることが求められる。
【００４２】
続いて、本実施の形態例におけるリンカ２２の定数配置アドレス決定部２３の処理について説明する。まず、定数配置アドレス決定部２３の処理の詳細をフローチャートに基づいて説明する。
【００４３】
図７は、本実施の形態例におけるリンカ２２の定数配置アドレス決定部２３の処理を説明するフローチャート図である。定数配置アドレス決定部２３は、まず、リンク対象のオブジェクトファイルＯＢの有する定数情報の各定数を値の長いものから順に並び変えた定数サイズ降順ソート情報ＴＳを生成する（Ｓ１０）。続いて、定数配置アドレス決定部２３は、定数サイズ降順ソート情報ＴＳに基づいて、値の長い定数から順に定数の探索処理を行う（Ｓ１１）。
【００４４】
図８は、定数配置アドレス決定部２３における探索処理（Ｓ１１）を説明するフローチャート図である。まず、図２の定数配置アドレス決定部２３の命令領域探索部２３１は、アドレス配置処理情報ＭＬにおける命令領域の配置済み領域、即ち、命令領域の命令部とデータ部、及びアドレスが配置された参照部分（アドレス部）に、定数の値と一致する部分があるか否かを判定する（Ｓ２１）。このように、命令領域における探索対象領域には、アドレス配置済みの参照部分も含まれる。
【００４５】
一致する部分がある場合（Ｓ２２のＹＥＳ）、図２の定数配置アドレス決定部２３は、一致部分ありとして探索処理を終了する。一方、一致する部分がない場合（Ｓ２２のＮＯ）、続いて、図２の定数領域探索部２３２は、アドレス配置処理情報ＭＬにおける定数領域の配置済み領域に定数の値と一致する部分があるか否かを判定する（Ｓ２３）。一致する部分がある場合（Ｓ２４のＹＥＳ）、定数配置アドレス決定部２３は、一致部分ありとして探索処理を終了する。一方、定数領域にも一致する部分がない場合（Ｓ２４のＮＯ）、定数配置アドレス決定部２３は、一致部分なしとして探索処理を終了する。
【００４６】
図７のフローチャート図に戻り、探索処理（Ｓ１１）の結果、定数の値と一致する部分があった場合（Ｓ１２のＹＥＳ）、定数配置アドレス決定部２３は、一致した部分のアドレスを定数の配置アドレスとする（Ｓ１３）。一方、定数の値と一致する部分がない場合（Ｓ１２のＮＯ）、定数配置アドレス決定部２３は、当該定数の値を定数領域に配置し、その配置アドレスを定数の配置アドレスとする（Ｓ１４）。続いて、図２の定数参照アドレス解決部２３３は、命令領域における当該定数の参照部分に配置アドレスを配置し割り当てる（Ｓ１５）。定数配置アドレス決定部２３は、定数サイズ降順ソート情報ＴＳの全ての定数について、Ｓ１１〜Ｓ１５の処理を行う。
【００４７】
このように、定数配置アドレス決定部２３は、命令領域及び定数領域の配置済みの領域に配置対象の定数の値と一致する部分がある場合は、定数領域に定数を配置せずに、一致する部分のアドレスを命令領域における当該定数の参照部分に配置する。定数配置アドレス決定部２３は、当該一致する部分があった定数の値を定数領域に配置しないため、実行可能プログラムＥＸの定数領域を小さく抑えることができる。また、定数配置アドレス決定部２３は、実行可能プログラムＥＸの命令領域における各命令の定数参照部分のアドレスのみを変更し命令の内容については変更しないため、生成した実行可能プログラムＥＸに対しての既に検証済みの命令の再検証が不要となる。
【００４８】
続いて、本実施の形態例のリンカ２２による実行可能プログラムＥＸの生成処理について、具体例に基づいて説明する。具体例におけるリンク対象のオブジェクトファイルＯＢ１〜４は、一般的なリンカの例（図６）と同様である。
【００４９】
図９は、本実施の形態例のリンカ２２における図２の命令配置アドレス決定部２２１、変数配置アドレス決定部２２２、及び、変数参照アドレス解決部２２３の処理を説明する図である。同図のアドレス配置処理情報ＭＬ１０の構成は、図６のアドレス配置処理情報ＭＬ１と同様である。まず、命令配置アドレス決定部２２１は、アドレス配置処理情報ＭＬ１（図６）と同様にして、命令領域Ｅ１の先頭（0x00060000）からアドレス0x0006003Bまで命令情報Ｔａ４（図５）の命令値「0x9FA09F80xxxxxxxx9F81…」を、その後続のアドレス0x0006003Cから命令情報Ｔａ１（図３）の命令値「0x9FB09E8Fxxxxxxxx9F8E…」を配置する。
【００５０】
続いて、変数配置アドレス決定部２２２は、リンク対象のオブジェクトファイルＯＢ１〜４の有する変数情報Ｔｂ１の変数num10のアドレスを例えば、0x000000xxとして決定する。そして、変数参照アドレス解決部２２３は、決定したアドレス0x000000xxを命令領域Ｅ１における変数num10の参照部分Ａ７に配置する。従って、図９のアドレス配置処理情報ＭＬ１０の命令領域Ｅ１において、変数num10の参照部分Ａ７に変数num10のアドレス0x000000xxが配置されている。
【００５１】
そして、本実施の形態例におけるリンカ２２は、全ての変数の参照アドレス解決処理の後、リンク対象のオブジェクトファイルＯＢ１〜４の有する定数情報Ｔｃ１、Ｔｃ２、Ｔｃ３の全ての定数について定数配置アドレス決定処理（図７、図８）を行う。続いて、図７、８のフローチャート図で説明した定数配置アドレス決定部２３の処理を具体例に基づいて説明する。まず、定数配置アドレス決定部２３は、定数情報Ｔｃ１、Ｔｃ２、Ｔｃ３の各定数を値の長い定数から順番に並び変える（Ｓ１０）。
【００５２】
図１０は、本実施の形態例における定数サイズ降順ソート情報ＴＳを表す図である。定数配置アドレス決定部２３は、オブジェクトファイルＯＢ１〜４の全定数を値の長い定数から順に並び変えて、定数サイズ降順ソート情報ＴＳを生成する。同図の定数サイズ降順ソート情報ＴＳにおいて、定数str2、定数str1、定数str3、定数num1、定数num2の順にその値が長い。
【００５３】
続いて、定数配置アドレス決定部２３は、定数サイズ降順ソート情報ＴＳに基づいて最も値の長い定数から探索処理を行う。そこで、定数配置アドレス決定部２３は、まず、定数str2の値「0x61626364656600」と一致する部分を、命令領域Ｅ１及び定数領域Ｅ２の配置済み領域から探索する（Ｓ１１）。
【００５４】
図１１〜図１３は、本実施の形態例のリンカ２２による定数配置アドレス決定処理を説明する図である。同図のアドレス配置処理情報ＭＬ１１〜ＭＬ１６は、図９のアドレス配置処理情報ＭＬ１０と同様の構成を有し、アドレス配置処理情報ＭＬ１０（図９）からアドレス配置処理情報ＭＬ１６まで時系列に変化する様を表す。
【００５５】
［アドレス配置処理情報ＭＬ１１（図１１）］
探索処理の結果（Ｓ１１）、図９のアドレス配置処理情報ＭＬ１０において、命令領域Ｅ１及び定数領域Ｅ２に定数str2の値「0x61626364656600」と一致する部分がないため（Ｓ１２のＮＯ）、定数配置アドレス決定部２３は、図１１のアドレス配置処理情報ＭＬ１１の定数領域Ｅ２に定数str2の値を配置（ｓ２）する（Ｓ１４）。そして、定数参照アドレス解決部２３３は、参照部分情報Ｔｄ１（図３）、Ｔｄ４（図５）を参照して命令領域Ｅ１における定数str2の参照部分Ａ４を検知し、定数領域Ｅ２における定数str2の配置アドレス0x00080000を配置し割り当てる（Ｓ１５）。従って、図１１のアドレス配置処理情報ＭＬ１１において、定数領域Ｅ２に定数str2の値「0x61626364656600」が、命令領域Ｅ１における定数str2の参照部分Ａ２に定数str2の配置アドレス0x00080000が配置される。
【００５６】
［アドレス配置処理情報ＭＬ１２（図１１）］
続いて、定数配置アドレス決定部２３は、次に値の長い定数str1の値「0x6364656600」と一致する部分を、アドレス配置処理情報ＭＬ１１の命令領域Ｅ１及び定数領域Ｅ２の配置済み領域から探索する（Ｓ１１）。この場合、定数str1の値「0x6364656600」は、アドレス配置処理情報ＭＬ１１の定数領域Ｅ２に配置された定数str2の一部ｓ１の値と一致する（Ｓ１２のＹＥＳ）。そこで、定数配置アドレス決定部２３は、一致する部分のアドレス0x00080002を定数str1の配置アドレスとし（Ｓ１３）、定数参照アドレス解決部２３３は、参照部分情報Ｔｄ１、Ｔｄ４を参照して命令領域Ｅ１における定数str1の参照部分Ａ３を検知し、当該配置アドレス0x00080002を配置し割り当てる（Ｓ１５）。従って、図１１のアドレス配置処理情報ＭＬ１２において、定数str1の値「0x6364656600」は新たに定数領域Ｅ２に配置されず、命令領域Ｅ１における定数str1の参照部分ｓ１に一致部分のアドレス0x00080002が配置される。
【００５７】
このように、本実施の形態例における定数配置アドレス決定部２３は、定数の値が配置済みの定数領域Ｅ２の値の一部または全部と一致する場合、新たに定数を定数領域Ｅ２に配置することなく、当該一致するアドレスを配置アドレスとする。これにより、新たに定数領域Ｅ２に定数の値が配置されず定数領域Ｅ２のサイズが抑えられる。また、定数配置アドレス決定部２３は、値の長い定数から順に配置アドレスを決定することにより、後続の定数配置アドレス決定処理において、探索対象領域である定数領域Ｅ２の配置済み領域がより大きくなる可能性があり、定数の値の一致率を高くすることができる。
【００５８】
［アドレス配置処理情報ＭＬ１３（図１２）］
続いて、定数配置アドレス決定部２３は、次に値の長い定数str3の値「0x7778797A00」と一致する部分を、図１１のアドレス配置処理情報ＭＬ１２の命令領域Ｅ１及び定数領域Ｅ２の配置済み領域から探索するが（Ｓ１１）、一致する部分がないため（Ｓ１２のＮＯ）、定数領域Ｅ２に定数str3の値を配置（ｓ３）する（Ｓ１４）。そして、定数参照アドレス解決部２３３は、当該配置アドレス0x00080007を定数str3の参照部分Ａ６に配置し割り当てる（Ｓ１５）。従って、図１２のアドレス配置処理情報ＭＬ１３において、定数領域Ｅ２に定数str3の値「0x7778797A00」が、定数str3の参照部分Ａ６に定数str3の配置アドレス0x00080007が配置される。
【００５９】
［アドレス配置処理情報ＭＬ１４（図１２）］
続いて、次に値の長い定数num1の値「0x0077」と一致する部分を、アドレス配置処理情報ＭＬ１３の命令領域Ｅ１及び定数領域Ｅ２の配置済み領域から探索するが（Ｓ１１）、この場合、定数num1の値「0x0077」は定数領域Ｅ２に配置された定数str2及び定数str3の一部ｎ１の値と一致する（Ｓ１２のＹＥＳ）。そこで、定数配置アドレス決定部２３は、当該一致する部分のアドレス0x00080006を定数num1の配置アドレスとし（Ｓ１３）、定数参照アドレス解決部２３３は、当該配置アドレスを定数num1の参照部分Ａ５に配置し割り当てる（Ｓ１５）。従って、図１２のアドレス配置処理情報ＭＬ１４において、定数num1の値「0x0077」は新たに定数領域Ｅ２に配置されず、命令領域Ｅ１における定数num1の参照部分Ａ５に一致部分のアドレス0x00080006が配置されている。
【００６０】
このように、定数配置アドレス決定部２３は、定数の値が、定数領域Ｅ２に配置済みの複数の定数の一部と一致する場合についても、新たに定数領域Ｅ２に定数の値を配置することなく、当該一致する部分のアドレスを配置アドレスとする。これにより、定数の値が新たに定数領域Ｅ２に配置されず、定数領域Ｅ２のサイズが抑えられる。また、定数配置アドレス決定部２３は、定数の値が定数領域Ｅ２に配置済みの複数の定数の全部と一致する場合についても同様に、当該一致する部分を配置アドレスとすることができる。
【００６１】
［アドレス配置処理情報ＭＬ１５（図１３）］
続いて、次に値の長い定数num2の値「0x02」と一致する部分を、図１２のアドレス配置処理情報ＭＬ１４の配置済みの命令領域Ｅ１及び定数領域Ｅ２から探索するが（Ｓ１１）、この場合、定数num2の値「0x02」は命令領域Ｅ１の参照部分に配置済みのアドレスの一部ｎ２の値と一致する（Ｓ１２のＹＥＳ）。そこで、定数配置アドレス決定部２３は、当該一致する部分のアドレス0x0006000Dを定数num2の配置アドレスとし（Ｓ１３）、定数参照アドレス解決部２３３は、当該配置アドレスを命令領域Ｅ１における定数num2の参照部分Ａ２に配置し割り当てる（Ｓ１５）。従って、図１３のアドレス配置処理情報ＭＬ１５において、定数num2の値「0x02」は新たに定数領域Ｅ２に配置されず、参照部分Ａ２に命令領域Ｅ１における一致部分のアドレス0x0006000Dが配置されている。
【００６２】
このように、定数配置アドレス決定部２３は、定数の値が、命令領域Ｅ１に配置済みの値と一致する場合についても、新たに定数領域Ｅ１に定数の値を配置することなく、当該一致する命令領域Ｅ１のアドレスを配置アドレスとする。これにより、定数の値が新たに定数領域Ｅ２に配置されず、定数領域Ｅ２のサイズが抑えられる。また、定数配置アドレス決定部２３は、定数の値が命令領域Ｅ１に配置済みの複数の命令の全部または一部と一致する場合についても同様に、当該一致する部分を配置アドレスとすることができる。
【００６３】
そして、リンカ２２は、リンク対象のオブジェクトファイルＯＢ１〜４の全ての定数について定数配置処理を行うと、アドレス配置処理情報ＭＬ１５を実行可能プログラムＥＸとして出力する。従って、本実施の形態例におけるリンカ２２によって生成される実行可能プログラムＥＸは、命令領域Ｅ１における定数の参照部分に、命令領域Ｅ１のアドレス、または定数領域Ｅ２における当該定数とは別の定数の配置アドレスを有する。そして、図１の通り、生成された実行可能プログラムＥＸは、マイクロコンピュータ組込み機器３のＲＯＭ等のメモリ３４に格納される。
【００６４】
このように、本実施の形態例のリンカ２２は、配置済みの命令領域Ｅ１及び定数領域Ｅ２に定数の値と一致する値がある場合は、新たに定数の値を定数領域Ｅ２に配置せずに、当該一致した値のアドレスを配置アドレスとする。この結果、図１３のアドレス配置処理情報ＭＬ１５の配置済みの定数領域ＣＥ２は、リンク対象のオブジェクトモジュールＯＢの有する定数の値の総バイト数（２０バイト）より小さい１２バイトに抑えられている。
【００６５】
また、本実施の形態例のリンカ２２の生成する実行可能プログラムＥＸは、本実施の形態例のリンカ２２に依らない実行可能プログラムＥＸに対して、命令領域Ｅ１の定数参照部分の値は異なるもののその命令内容については同一である。従って、ユーザは、実行可能プログラムＥＸにおける既に検証済みの命令について再検証を行わなくともよい。このようにして、本実施の形態例のリンカ２２は、実行可能プログラムＥＸにおける検証済みの命令の再検証を不要にしながら、実行可能プログラムＥＸのサイズを小さくすることができる。
【００６６】
また、本実施の形態例のリンカ２２は、先に、リンク対象のオブジェクトファイルＯＢの有する変数について配置アドレス決定処理及び参照アドレス解決処理を行うことにより、後続の定数の定数配置アドレス決定処理において、探索対象領域である配置済みの命令領域Ｅ１の配置済み領域及び情報がより大きく及び多くなり、定数の値の一致率を高くすることができる。
【００６７】
また、本実施の形態例における定数参照アドレス解決部２３３は、各定数の配置アドレスが決定される度に（図７のＳ１３、Ｓ１４）、命令領域Ｅ１における当該定数の参照部分に配置アドレスを配置する（Ｓ１５）。これは、後続の定数配置アドレス決定処理において、探索対象領域である配置済みの命令領域Ｅ１の情報をより多くし、定数の値の一致率を高くする。ただし、定数参照アドレス解決部２３３は、全ての定数について配置アドレスを決定した後に（Ｓ１３、Ｓ１４）、命令領域Ｅ１における各定数の参照部分に配置アドレスをまとめて配置してもよい（Ｓ１５）。
【００６８】
ところで、本実施の形態例における定数配置アドレス決定部２３は、配置対象の定数の値の前部分が配置済みの定数領域Ｅ２の末尾と一致する場合、当該定数の値の一部のみを定数領域Ｅ２に配置してもよい。例えば、図１３のアドレス配置処理情報ＭＬ１５に、数値「0x0005」を保持する定数num3の配置アドレスを決定する場合、配置済みの命令領域Ｅ１及び定数領域Ｅ２に一致する部分はないものの、定数numの先頭の一部「0x00」が定数領域Ｅ２の末尾の一部の値と一致する。そこで、定数配置アドレス決定部２３は、定数領域Ｅ２の配置済み領域の後続に「0x05」のみを配置し、当該配置によって一致した部分ｎ３のアドレス0x0008000Bを配置アドレスとしてもよい。例えば、図１３のアドレス配置処理情報ＭＬ１６において、定数num3の値「0x0005」の一部「0x05」が新たに定数領域Ｅ２に配置されている。これにより、実行可能プログラムＥＸの定数領域を小さく抑えることができる。
【００６９】
上記のような定数配置アドレス決定処理は、例えば、リンカ実行時に実行可能プログラムのサイズ最適化オプションが指定されることによって行われる。
【００７０】
以上の実施の形態をまとめると、次の付記のとおりである。
【００７１】
（付記１）
ソースプログラムをコンパイルして機械語に変換された命令と定数とを有するオブジェクトファイルについて、実行可能プログラムの命令領域に前記命令をアドレスに対応して配置する命令配置工程と、
前記実行可能プログラムの定数領域に前記定数をアドレスに対応して配置し、配置したアドレスを前記命令領域における当該定数の参照部分に配置する定数配置工程と、
を有し、
前記定数配置工程は、前記命令領域または前記定数領域の配置済み領域に前記定数の値と一致する部分がある場合は、当該定数を前記定数領域に配置せずに前記一致する部分のアドレスを前記参照部分に配置することを特徴とする実行可能プログラム生成方法。
【００７２】
（付記２）
付記１において、
前記一致する部分は、前記定数領域の配置済み領域におけるひとつまたは複数の前記定数の一部または全部であることを特徴とする実行可能プログラム生成方法。
【００７３】
（付記３）
付記１または２において、
前記一致する部分は、前記命令領域の配置済み領域におけるひとつまたは複数の前記命令の一部または全部であることを特徴とする実行可能プログラム生成方法。
【００７４】
（付記４）
付記１乃至３のいずれかにおいて、
前記定数配置工程が値の長い前記定数から順に行われることを特徴とする実行可能プログラム生成方法。
【００７５】
（付記５）
付記１乃至４のいずれかにおいて、
複数の前記オブジェクトファイルの有する前記命令と前記定数について、前記命令配置工程及び前記定数配置工程とを行うことを特徴とする実行可能プログラム生成方法。
【００７６】
（付記６）
付記１乃至５のいずれかにおいて、
前記オブジェクトファイルはさらに機械語に変換された変数を有し、
前記変数のアドレスを決定し、前記命令領域における当該変数の参照部分に当該変数のアドレスを配置する変数配置工程を有し、
前記定数配置工程は、前記変数配置工程後の前記命令領域または前記定数領域の配置済み領域に前記定数の値と一致する部分がある場合は、前記一致する部分のアドレスを前記参照部分に配置することを特徴とする実行可能プログラム生成方法。
【００７７】
（付記７）
ソースプログラムをコンパイルして機械語に変換された命令と定数とを有するオブジェクトファイルについて、実行可能プログラムの命令領域に前記命令をアドレスに対応して配置する命令配置工程と、
前記実行可能プログラムの定数領域に前記定数をアドレスに対応して配置し、配置したアドレスを前記命令領域における当該定数の参照部分に配置する定数配置工程と、
をコンピュータに実行させ、
前記定数配置工程は、前記命令領域または前記定数領域の配置済み領域に前記定数の値と一致する部分がある場合は、当該定数を前記定数領域に配置せずに前記一致する部分のアドレスを前記参照部分に配置することを特徴とするコンピュータ読み取り可能な実行可能プログラムの生成プログラム。
【００７８】
（付記８）
付記７において、
前記一致する部分は、前記定数領域の配置済み領域におけるひとつまたは複数の前記定数の一部または全部であることを特徴とする実行可能プログラムの生成プログラム。
【００７９】
（付記９）
付記７または８において、
前記一致する部分は、前記命令領域の配置済み領域におけるひとつまたは複数の前記命令の一部または全部であることを特徴とする実行可能プログラムの生成プログラム。
【００８０】
（付記１０）
ソースプログラムをコンパイルして機械語に変換された命令と当該命令において参照される定数の参照アドレスとが配置された命令領域と、
前記定数が配置された定数領域と、
を有し、
前記参照アドレスは、前記命令領域のアドレス、または、前記定数領域における当該参照アドレスの示す前記定数とは異なる前記定数のアドレスを有することを特徴とする実行可能プログラム。
【符号の説明】
【００８１】
１：実行可能プログラム生成装置、１１：ＣＰＵ、１２：メモリ、２１：コンパイラプログラム、２２：リンカプログラム、１３：入出力インターフェイス、ＳＰ：ソースプログラム、ＯＢ：オブジェクトファイル、ＥＸ：実行可能プログラム、３：マイクロコンピュータ組み込み機器
【図１】
2012084017.tif 000003
【図２】
2012084017.tif 000004
【図３】
2012084017.tif 000005
【図４】
2012084017.tif 000006
【図５】
2012084017.tif 000007
【図６】
2012084017.tif 000008
【図７】
2012084017.tif 000009
【図８】
2012084017.tif 000010
【図９】
2012084017.tif 000011
【図１０】
2012084017.tif 000012
【図１１】
2012084017.tif 000013
【図１２】
2012084017.tif 000014
【図１３】
2012084017.tif 000015