JP2007310667A - リンカおよび情報処理装置 - Google Patents

リンカおよび情報処理装置 Download PDF

Info

Publication number
JP2007310667A
JP2007310667A JP2006139233A JP2006139233A JP2007310667A JP 2007310667 A JP2007310667 A JP 2007310667A JP 2006139233 A JP2006139233 A JP 2006139233A JP 2006139233 A JP2006139233 A JP 2006139233A JP 2007310667 A JP2007310667 A JP 2007310667A
Authority
JP
Japan
Prior art keywords
initial value
transfer
variable
transfer table
linker
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.)
Withdrawn
Application number
JP2006139233A
Other languages
English (en)
Inventor
Yohei Nagao
洋平 長尾
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Toshiba Corp
Kioxia Systems Co Ltd
Original Assignee
Toshiba Corp
Toshiba Memory Systems Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Toshiba Corp, Toshiba Memory Systems Co Ltd filed Critical Toshiba Corp
Priority to JP2006139233A priority Critical patent/JP2007310667A/ja
Publication of JP2007310667A publication Critical patent/JP2007310667A/ja
Withdrawn legal-status Critical Current

Links

Images

Abstract

【課題】 同じ値をとる初期値を1箇所にまとめた実行形式ファイルを生成することのできるリンカ、およびその実行形式ファイルのロードに適した情報処理装置を提供する。
【解決手段】 リンカ1は、リンク対象のオブジェクトファイル300を検索して、型が同じで初期値が同じ変数を検出する変数検出部11と、変数検出部11で検出された変数の初期値を1つに統合した統合初期値を実行形式ファイル20の初期値格納領域に格納する初期値統合部12と、統合初期値の格納アドレスを転送元アドレスとし、統合初期値を使用する変数の格納アドレスを転送先アドレスとする転送テーブル21を実行形式ファイル20中に作成する転送テーブル生成部13と、転送テーブル21に記載された転送元アドレスおよび転送先アドレスを参照して統合初期値を変数へ転送する転送ルーチン22を実行形式ファイル20中に生成する転送ルーチン生成部14と、を有する。
【選択図】 図1

Description

本発明は、リンカおよび情報処理装置に関し、特に複数のオブジェクトファイルをリンクして実行形式ファイルを生成するリンカ、およびその生成された実行形式ファイルのプログラムを実行する情報処理装置に関する。
C言語などの高級言語で記述されたソースプログラムは、コンパイラおよびアセンブラでオブジェクトプログラムにコンパイルされる。このとき、ソースプログラムが複数のファイルに分かれている場合、それぞれのファイルがコンパイルおよびアセンブルされて、複数のオブジェクトファイルが生成される。この複数のオブジェクトファイルは、リンカでリンクされて、1つの実行形式ファイルに変換される。
C言語では、プログラム実行中のデータの格納領域を変数と呼び、変数宣言することにより任意に変数を使用することができる。この変数宣言では、それぞれの変数に変数名を付し、変数の種類を示す型を指定する必要がある。また、変数に対して初期値を設定することができる。
このような初期値付きの変数が用いられたソースファイルをコンパイルおよびアセンブルすると、オブジェクトファイル上では、各変数は、CPUからアクセスされる領域と初期値を格納する領域とに分けられて配置される。このようなオブジェクトファイルをリンクすると、実行形式ファイル上でも、変数は、CPUからアクセスされる領域と初期値を格納する領域とに分けられて配置される。
このとき、異なる変数が同じ初期値をとる場合でも、初期値を格納する領域には、従来、同じ初期値が重複して格納されていた。そのため、実行形式ファイルをコンピュータのメモリにロードしたときに、この初期値を格納する領域をROMに割り当てると、ROMの容量が増大するという問題があった。
そこで、同じ型で同じ初期値を有する読み出し専用変数に対しては、初期値の領域を1個だけ割り当て、各変数はこの初期値を引用することで使用するメモリ容量の低減を図る「実行プログラム最適化装置」が提案されている(特許文献1)。
しかし、上述の「実行プログラム最適化装置」では、その対象が読み出し専用変数に限られているため、メモリ容量の低減効果が少ないという問題があった。
例えば、C言語では、初期値を設定できるものとして、1つのデータを格納する上述の変数のほかに、同じ型の複数のデータを格納する配列や、異なる型の複数のデータを格納する構造体がある。このような配列や構造体おいて、複数の配列あるいは複数の構造体が、それぞれ同じ初期値をとる場合、従来同様、実行形式ファイルの初期値を格納する領域に同じ初期値が重複して格納されることになる。
特に、配列や構造体が多数のデータを格納する場合、その初期値データも多数となり、メモリ領域をより多く使用するという問題があった。
特開平11−338707号公報 (第3ページ、図1)
そこで、本発明の目的は、複数のオブジェクトファイルをリンクするときに、同じ値をとる初期値を1箇所にまとめた実行形式ファイルを生成することのできるリンカ、およびその実行形式ファイルのロードに適した情報処理装置を提供することにある。
本発明の一態様によれば、リンク対象のオブジェクトファイルに記述されている変数の中で、同じ型で初期値が同じ変数は前記初期値を1つに統合して初期値格納領域に格納し、その初期値とその初期値を使用する変数との対応を記載した転送テーブルを作成するとともに、前記転送テーブルを参照して前記初期値を前記初期値格納領域から前記変数へ転送する転送ルーチンを生成し、前記オブジェクトファイルをリンクして生成する実行ファイル中に前記転送テーブルおよび前記転送ルーチンを記載することを特徴とするリンカが提供される。
また、本発明の別の一態様によれば、複数のオブジェクトファイルをリンクして実行形式ファイルを生成するときに前記複数のオブジェクトファイルを検索して、型が同じで初期値が同じ変数を検出する変数検出手段と、前記変数検出部で検出された変数の初期値を1つに統合した統合初期値を前記実行形式ファイルの初期値格納領域に格納する初期値統合手段と、前記統合初期値の格納アドレスを転送元アドレスとし、前記統合初期値を使用する変数の格納アドレスを転送先アドレスとする転送テーブルを前記実行形式ファイル中に作成する転送テーブル生成手段と、前記転送テーブルを参照して前記統合初期値を前記変数へ転送する転送ルーチンを前記実行形式ファイル中に生成する転送ルーチン生成手段とを有することを特徴とするリンカが提供される。
本発明によれば、実行形式ファイル上で同じ値をとる初期値を1箇所にまとめることのできるので、実行形式ファイルを情報処理装置のメモリにロードしたときに、初期値を格納するメモリの容量を削減することができる。
以下、本発明の実施例を図面を参照して説明する。
図1は、本発明の実施例1に係るリンカの構成の例を示すブロック図である。本実施例のリンカ1は、複数のソーファイル100をそれぞれコンパイラ200でコンパイルした、複数のオブジェクトファイル300をリンクして、実行形式ファイル20を生成する。
リンカ1は、リンク対象のオブジェクトファイル300を検索して、型が同じで初期値が同じ変数を検出する変数検出部11と、変数検出部11で検出された変数の初期値を1つに統合した統合初期値を実行形式ファイル20の初期値格納領域に格納する初期値統合部12と、統合初期値の格納アドレスを転送元アドレスとし、統合初期値を使用する変数の格納アドレスを転送先アドレスとする転送テーブル21を実行形式ファイル20中に作成する転送テーブル生成部13と、転送テーブル21に記載された転送元アドレスおよび転送先アドレスを参照して統合初期値を変数へ転送する転送ルーチン22を実行形式ファイル20中に生成する転送ルーチン生成部14と、を有する。
図2は、リンカ1における転送テーブル21の作成手順を示すフロー図である。なお、転送テーブル21は、記載事項の増加とともに、所定の記載形式に従って、その内容が追加されるものとする。また、転送テーブル21のアドレスは、リンク過程においてリンカ1が決定する。
転送テーブル21の作成の開始にあたっては、まず、使用されている変数の型の中から1つの型を選択する。C言語の場合、変数の型としては、整数型、倍長整数型、単精度浮動小数点型、倍精度浮動小数点型、文字型が予め定義されている。その他に、これらの型を複数合わせた新しい型として、ユーザが定義した構造体も型として使用される。そこで、ここでは、この構造体も含めて変数の型を選択する(ステップS01)。
このとき、型のサイズは型によって異なるので、選択した型のサイズを転送テーブル21に出力する(ステップS02)。
続いて、リンク対象の総てのオブジェクトファイル300を検索し(ステップS03)、初期値が同じ変数を2つ以上検出したか、チェックする(ステップS04)。
初期値が同じ変数を2つ以上検出したときは(YES)、その初期値を1つに統合し、統合初期値として実行形式ファイル20の初期値格納領域に格納し(ステップS05)、その格納アドレスを転送元アドレスとして転送テーブル21に記載する(ステップS06)。
さらに、同じ初期値をとる各変数が格納されている変数データ格納領域のアドレスを転送先アドレスとして転送テーブル21に記載し(ステップS07)、その後に、予め定めた区切り文字を転送テーブル21に記載する(ステップS08)。
区切り文字の記載後、あるいは、ステップS04のチェックで初期値が同じ変数を2つ以上検出しなかったときは(NO)、総ての型を検索し終わっているかどうかチェックする(ステップS09)。
総ての型を検索し終わっていないときは(NO)、ステップS01に戻って、以降のフローを繰り返す。
総ての型を検索し終わっているときは(YES)、転送テーブル21に記載した区切り文字の個数を転送テーブル21に記載して(ステップS10)、転送テーブル21の作成を終了する。
図3に、上述のフローで作成した転送テーブルの例を示す。
転送テーブルは、区切り文字数が先頭に記載され、その後、それぞれの統合初期値に対して、型のサイズ、転送元アドレス、複数の転送先アドレス、区切り文字が順次記載される。区切り文字は、統合初期値間の情報の区切りを示す。
図4に、本実施例のリンカ1で作成した実行形式ファイル20の構造の例を示す。ここでは、図4(a)に示す3つのオブジェクトファイル300A〜Cをリンカ1でリンクして作成した実行形式ファイル20の構造を図4(b)に示す。
いま、図4(a)に示すオブジェクトファイル300Aでは初期値s1をとる変数A1、初期値s2をとる変数A2が使用され、オブジェクトファイル300Bでは初期値s1をとる変数B1、初期値s2をとる変数B2が使用され、オブジェクトファイル300Cでは初期値s1をとる変数C1、初期値s2をとる変数C2が使用されているものとする。
すなわち、オブジェクトファイル300A〜Cを通して、変数A1、B1、C1は共通の初期値s1をとり、変数A2、B2、C2は共通の初期値s2をとっているものとする。
このようなオブジェクトファイル300A〜Cを本実施例のリンカ1へ入力すると、図4(b)に示すような構造の実行形式ファイル20が出力される。
図4(b)に示す実行形式ファイル20では、変数データ格納領域に変数A1〜C2が格納され、初期値格納領域に変数A1〜C1の共通の初期値であるs1が統合初期値s1として格納され、変数A2〜C2の共通の初期値であるs2が統合初期値s2として格納される。また、実行形式ファイル20には、転送テーブル21および転送ルーチン22が格納される。
図4(c)には、参考として、従来のリンカで生成された実行形式ファイルの例を示す。従来の実行形式ファイルでは、変数A1〜C2に対する初期値がそれぞれ初期値格納領域に格納される。したがって、初期値s1と初期値s2が、それぞれ重複して3つずつ格納されている。すなわち、従来のリンカで生成された実行形式ファイルでは、本実施例のリンカ1で作成した実行形式ファイル20に比べて、初期値の格納に3倍の格納領域を必要とする。
さらに具体的な例を図5および図6を用いて説明する。なお、ここでは、C言語で記述されたソースファイルを例にとって説明する。
図5は、変数として構造体を使用するソースファイル100A〜Cの例を示す。いま、5つのメンバmem1〜mem5からなる構造体AAAが宣言され、ソースファイル100Aでは変数dataA[3]、ソースファイル100Bでは変数dataB[3]、ソースファイル100Cでは変数dataC[3]がこの構造体AAAを使用し、各変数は共通の初期値をとることが記述されているものとする。
ここで、変数dataA[3]、dataB[3]、dataC[3]は、それぞれ3つの要素からなる配列を示し、ソースファイル100A〜Cには、それぞれの要素が初期値(100,0,0,0,0)をとることが記述されている。
このソースファイル100A〜Cをコンパイラ200でコンパイルすると、図6(a)に示すオブジェクトファイル300A〜Cが生成される。このオブジェクトファイル300A〜Cでは、変数dataA[3]、dataB[3]、dataC[3]の各3要素に対する初期値(100,0,0,0,0)がそれぞれ羅列されている。従って、オブジェクトファイル300A〜C全体で見ると、初期値(100,0,0,0,0)が9箇所に格納されている。
図6(b)は、図6(a)に示したオブジェクトファイル300A〜Cを本実施例のリンカ1でリンクして生成した実行形式ファイル20の例を示す。
この実行形式ファイル20では、変数dataA[3]、dataB[3]、dataC[3]の各要素に対する初期値(100,0,0,0,0)は1つに統合され、統合初期値として初期値格納領域に格納される。その結果、従来に比べ、初期値格納領域の使用量は1/9に減少する。
このようにしてリンカ1で生成された実行形式ファイルは、マイクロコンピュータなどの情報処理装置のメモリにロードされ、命令内容の処理が実行される。このとき、情報処理装置は、メイン処理に移行する前に、実行形式ファイル形式に記載されている転送ルーチン22を実行し、転送テーブル21の転送元アドレスに格納されている統合初期値を転送先アドレスに記載されている各変数へ転送する。
図7は、情報処理装置における転送ルーチン22の処理の流れを示すフロー図である。
転送ルーチンの処理を開始すると、転送テーブル21の先頭アドレスを取得し(ステップS21)、区切り文字数のデータを取得し(ステップS22)、区切り文字数の値が0であるかどうかを判定する(ステップS23)。
区切り文字数の値が0でなければ(NO)、続いて、型のサイズと転送元アドレスを読み取り(ステップS24)、転送元アドレスから統合初期値を取得する(ステップS25)。
引き続き、転送テーブル21に記載されている次のデータを読み取り(ステップS26)、そのデータが予め定めた区切り文字と一致するかどうかを判定する(ステップS27)。
転送テーブル21から読み取ったデータが区切り文字と一致しないときは、そのデータを転送先アドレスと判断し(ステップS28)、その転送先アドレスへ先に取得しておいた統合初期値を転送する(ステップS29)。
その後、ステップS26の処理へ戻り、以降の処理を繰り返す。
一方、ステップS27のチェックで転送テーブル21から読み取ったデータが区切り文字と一致したときは、取得しておいた区切り文字数のデータの値を1減らし(ステップS30)、ステップS23の判定処理へ戻る。このステップ23の処理において、区切り文字数の値が0であると判定できたときに(YES)、本転送ルーチンの処理を終了する。
このような本実施例によれば、複数のオブジェクトファイルをリンクするときに、総てのファイルを通じて、複数の変数が同じ初期値をとるときは、その初期値を1つに統合した実行形式ファイルを生成することができるので、初期値を格納する領域の容量を少なくすることができる。
図8は、本発明の実施例2に係る情報処理装置の構成の例を示すブロック図である。本実施例の情報処理装置50は、実施例1のリンカ1で生成された実行形式ファイル20のロードに適した情報処理装置である。
本実施例の情報処理装置50は、リセット信号入力直後に、実行形式ファイル20の転送テーブルおよび転送ルーチンをRAM52へ書き込むデータ書き込み部51を有する。
情報処理装置50は、このRAM52に書き込まれた転送テーブルおよび転送ルーチンを用いて、図7に示した転送ルーチンの処理を実行する。
転送ルーチンの処理は、メイン処理の実行前に1度実行すればよいので、転送ルーチンの処理後は、RAM52に書き込んだ転送テーブルおよび転送ルーチンは消去してもよい。そこで、メイン処理の実行中は、転送テーブルおよび転送ルーチンを書き込んだRAM52の領域を実行中のデータの書き込みに利用する。
このような本実施例によれば、実行形式ファイルに記載されている転送テーブルおよび転送ルーチンをリセット直後だけRAMに書き込んで転送ルーチンを実行するので、情報処理装置のメモリ領域を有効に活用することができる。
本発明の実施例1に係るリンカの構成の例を示すブロック図。 本発明の実施例1に係るリンカにおける転送テーブル作成手順を示すフロー図。 本発明の実施例1に係るリンカで作成した転送テーブルの例を示す図。 本発明の実施例1に係るリンカで作成した実行形式ファイルの構造の例を示す図。 ソースファイルの例を示す図。 図5に示したソースファイルに対して本発明の実施例1に係るリンカで作成した実行形式ファイルの例を示す図。 本発明の実施例1に係るリンカで作成した転送ルーチンの処理の流れを示すフロー図。 本発明の実施例2に係る情報処理装置の構成の例を示すブロック図。
符号の説明
1 リンカ
11 変数検出部
12 初期値統合部
13 転送テーブル生成部
14 転送ルーチン生成部
20 実行形式ファイル
50 情報処理装置
51 データ書き込み部
52 RAM

Claims (5)

  1. リンク対象のオブジェクトファイルに記述されている変数の中で、同じ型で初期値が同じ変数は前記初期値を1つに統合して初期値格納領域に格納し、その初期値とその初期値を使用する変数との対応を記載した転送テーブルを作成するとともに、前記転送テーブルを参照して前記初期値を前記初期値格納領域から前記変数へ転送する転送ルーチンを生成し、前記オブジェクトファイルをリンクして生成する実行ファイル中に前記転送テーブルおよび前記転送ルーチンを記載することを特徴とするリンカ。
  2. 複数のオブジェクトファイルをリンクして実行形式ファイルを生成するときに前記複数のオブジェクトファイルを検索して、型が同じで初期値が同じ変数を検出する変数検出手段と、
    前記変数検出部で検出された変数の初期値を1つに統合した統合初期値を前記実行形式ファイルの初期値格納領域に格納する初期値統合手段と、
    前記統合初期値の格納アドレスを転送元アドレスとし、前記統合初期値を使用する変数の格納アドレスを転送先アドレスとする転送テーブルを前記実行形式ファイル中に作成する転送テーブル生成手段と、
    前記転送テーブルを参照して前記統合初期値を前記変数へ転送する転送ルーチンを前記実行形式ファイル中に生成する転送ルーチン生成手段と
    を有することを特徴とするリンカ。
  3. 前記転送テーブルは、1つに統合された初期値ごとに区切り文字で区切られて、前記転送元アドレスと前記転送先アドレスが記載されていることを特徴とする請求項2に記載されたことを特徴とするリンカ。
  4. 請求項1乃至3のいずれか1項に記載のリンカによって生成された実行形式ファイルがロードされる情報処理装置であって、ロードされた前記実行形式ファイルのメイン処理に移行する前に、前記実行形式ファイル形式に記載されている前記転送ルーチンを実行し、前記転送テーブルに記載されている前記転送元アドレスに格納されている値を前記転送テーブルに記載されている前記転送先アドレスに転送することを特徴とする情報処理装置。
  5. リセット直後に、前記転送テーブルおよび前記転送ルーチンをRAM領域に書き込むことを特徴とする請求項4に記載の情報処理装置。
JP2006139233A 2006-05-18 2006-05-18 リンカおよび情報処理装置 Withdrawn JP2007310667A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2006139233A JP2007310667A (ja) 2006-05-18 2006-05-18 リンカおよび情報処理装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2006139233A JP2007310667A (ja) 2006-05-18 2006-05-18 リンカおよび情報処理装置

Publications (1)

Publication Number Publication Date
JP2007310667A true JP2007310667A (ja) 2007-11-29

Family

ID=38843455

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006139233A Withdrawn JP2007310667A (ja) 2006-05-18 2006-05-18 リンカおよび情報処理装置

Country Status (1)

Country Link
JP (1) JP2007310667A (ja)

Similar Documents

Publication Publication Date Title
JP5118745B2 (ja) メモリアクセス命令のベクトル化
TWI291098B (en) Method and system for data optimization and protection in DSP firmware
CN107544811B (zh) IOS平台隐藏dylib文件的方法、存储介质、电子设备及系统
JP2005215884A (ja) コンパイラプログラム、動的コンパイラプログラム、再現コンパイラプログラム、再現コンパイラ、コンパイル方法、及び記録媒体
US8468290B2 (en) Method and program for file information write processing
JP4728563B2 (ja) コード生成装置、コード生成プログラム、機能実行装置、機能実行プログラム、モデル生成装置、およびモデル生成プログラム
JP2009104252A (ja) デバッグ支援装置およびデバッグ支援方法
EP3635561B1 (en) Asynchronous operation query
TWI501152B (zh) 用於簡化具有動態程式庫的介面之方法
JP2007310667A (ja) リンカおよび情報処理装置
US10310871B2 (en) Non-transitory computer-readable recording medium storing control program, control device and control method
JP2009020695A (ja) 情報処理装置及びシステム
JP7059757B2 (ja) Api処理方法、端末、api処理プログラム
CN110045962B (zh) 一种支持多语言脚本执行的方法和装置
CN113407187A (zh) 构建文件系统的方法、装置、设备及计算机存储介质
CN111813416A (zh) 文件打包方法、装置及设备、存储介质
JP3507728B2 (ja) メモリ削減方法および装置
JP6888336B2 (ja) スタブ生成装置、方法、及びプログラム
TWI813269B (zh) 程式碼校驗方法及非暫態電腦可讀記錄媒體裝置
US11734003B2 (en) Non-transitory computer-readable recording medium, compilation method, and compiler device
JPH06214803A (ja) 仮想空間ブロック配置方式
KR101064741B1 (ko) 핫 패스 기반의 자바스크립트 동적 컴파일을 위한 생성 코드 재활용 방법
US8453108B1 (en) Static, configurable kernel interface
EP1306757A2 (en) Transferring data along with code for program overlays
JP6547477B2 (ja) ソースコード最適化装置、ソースコード最適化プログラム及びオブジェクトコード生成方法

Legal Events

Date Code Title Description
A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A712

Effective date: 20081226

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20090210

A300 Withdrawal of application because of no request for examination

Free format text: JAPANESE INTERMEDIATE CODE: A300

Effective date: 20090804