Comments
Description
Transcript
fromELF - ARM Information Center
ARM デベロッパスイート ® バージョン 1.2 リンカ / ユーティリティガイド Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 ARM デベロッパスイート リンカ / ユーティリティガイド Copyright © 2001 ARM Limited. All rights reserved. リリース情報 改訂履歴 日付 発行 変更内容 2001 年 11 月 A ADS リリース 1.2 著作権 または ™ のマークが付いた言葉およびロゴは、ARM 社が所有する登録商標または商標です。本書 に記載されている他の製品名は、各社の所有する商標です。 ® 本書に記載されている情報の全部または一部、ならびに本書で紹介する製品は、著作権所有者の 文書による事前の許可を得ない限り、転用・複製することを禁じます。 本書に記載されている製品は、今後も継続的に開発・改良の対象となります。本書に含まれる製 品およびその利用方法についての情報は、ARM が利用者の利益のために提供するものです。した がって当社では、製品の市販性または利用の適切性を含め、暗示的・明示的に関係なく一切の責 任を負いません。 本書は、本製品の利用者をサポートすることだけを目的としています。本書に記載されている情 報の使用、情報の誤りまたは省略、あるいは本製品の誤使用によって発生したいかなる損失・損 傷についても、ARM 社は一切責任を負いません。 ii Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 目次 ARM デベロッパスイートリンカ / ユーティリティ ガイド 序章 本書について ...................................................................................................vi ご意見・ご質問................................................................................................ix 第1章 はじめに 1.1 第2章 armlink のコマンド構文 2.1 2.2 第3章 イメージ構造の指定...................................................................................... 3-2 セクションの配置 ......................................................................................... 3-8 最適化と修正 .............................................................................................. 3-12 コマンドラインオプションを使用した単純イメージの作成 ...................... 3-14 イメージシンボルへのアクセス 4.1 4.2 4.3 4.4 ARM DUI0151AJ-00 armlink について ........................................................................................... 2-2 armlink のコマンド構文 ................................................................................ 2-8 基本リンカ機能 3.1 3.2 3.3 3.4 第4章 リンカおよびユーティリティについて ......................................................... 1-2 リンカ定義シンボルへのアクセス ................................................................ 4-2 別のイメージに含まれるシンボルへのアクセス .......................................... 4-5 グローバルシンボルの隠蔽と再命名 ............................................................ 4-9 $Super$$ と $Sub$$ を使用したシンボル定義のオーバライド ................. 4-12 Copyright © 2001 ARM Limited. All rights reserved. iii 目次 第5章 分散ローディング記述ファイルの使用 5.1 5.2 5.3 5.4 第6章 分散ローディングについて .......................................................................... 5-2 分散ローディング記述ファイルの形式構文 ................................................. 5-7 例:領域アドレスとセクションアドレスの指定 ........................................ 5-22 等価な分散ローディング記述を使用した単純イメージの生成 .................. 5-28 ライブラリの作成と使用 6.1 6.2 6.3 第7章 ライブラリについて ..................................................................................... 6-2 ライブラリの検索、選択、スキャン ............................................................ 6-3 ARM ライブラリアン ................................................................................... 6-6 fromELF の使用 7.1 7.2 7.3 第8章 fromELF について ........................................................................................ 7-2 fromELF コマンドラインオプション............................................................ 7-3 fromELF の使用例 ...................................................................................... 7-10 ARM プロファイラの使用 8.1 8.2 8.3 ARM プロファイラ ....................................................................................... 8-2 プロファイラのコマンドラインオプション ................................................. 8-3 サンプル出力 ................................................................................................ 8-4 用語集 iv Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 序章 本章では、ARM デベロッパスイート(ADS)に含まれているリンカおよびユーティリ ティの解説書について説明します。本章は以下のセクションから構成されています。 • 本書について:P. vi • ARM DUI0151AJ-00 ご意見・ご質問:P. ix Copyright © 2001 ARM Limited. All rights reserved. v 序章 本書について 本書は ADS の解説書です。本書では、ADS に含まれているリンカへのコマンドライン オプションと他の ARM ツールについて説明しています。 対象読者 本書は、ADS を使用してアプリケーションを作成する全ての開発者を対象としていま す。本書の内容は、ADS の「スタートアップガイド」に記載されている ARM 開発ツー ルに精通した経験豊富なソフトウェア開発者を想定して書かれています。 本書の構成 本書は以下の章と付録から構成されています。 第1章 はじめに ADS バージョン 1.2 に含まれているリンカと関連ユーティリティを概説 します。 第2章 armlink のコマンド構文 リンカに使用することができる全てのコマンドラインオプションについ て説明します。 第3章 基本リンカ機能 単純なイメージの作成方法を具体的に説明します。 第4章 イメージシンボルへのアクセス イメージ内のシンボルへのアクセス方法について詳しく説明します。 第5章 分散ローディング記述ファイルの使用 分散ローディングファイルを使用してメモリ内にコードとデータを格納 する方法を説明します。 第6章 ライブラリの作成と使用 ライブラリオブジェクトを作成し、それにアクセスする際の手順につい て説明します。 第7章 fromELF の使用 fromELF ユーティリティプログラムの概要と、このプログラムを使用し たイメージ形式の変更方法について説明します。 vi Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 序章 第8章 ARM プロファイラの使用 ADS に含まれている ARM プロファイラユーティリティプログラムにつ いて説明します。 表記規則 本書では以下の表記規則を用いています。 monospace コマンド、ファイル名、プログラム名、ソースコードなど、キーボード から入力可能なテキストを示しています。 monospace コマンドまたはオプションに使用可能な略語を示しています。コマンド 名またはオプション名を全て入力する代わりに、下線部分の文字だけを 入力してこれらを指定することができます。 monospace italic コマンドおよび関数への引数で、特定の値に置き換えることが可能なも のを示しています。 monospace bold サンプルコード以外に使用される言語キーワードを示しています。 italic 重要用語、専門用語、相互参照、引用箇所を斜体で記載しています。 bold メニュー名などのインタフェース要素を太字で記載しています。また、 適宜記述リスト内の重要箇所と、ARM プロセッサシグナルの名前にも太 字を用いています。 参考資料 このセクションでは、ARM プロセッサファミリの開発コード関連情報を提供している ARM 社および各社の出版物を紹介します。 ARM は自社出版物の定期的な更新・修正を行っています。最新の正誤表と追補情報、 ならびに ARM によく寄せられる質問とその回答については、ARM ホームページ http://www.arm.com をご覧下さい。 ARM の出版物 本書では、ADS に含まれている開発ツールの参考情報を提供しています。この他、本 製品には以下の資料が同梱されています。 • ADS Installation and License Management Guide(ARM DUI 0139) • ARM DUI0151AJ-00 スタートアップガイド(ARM DUI 0064) Copyright © 2001 ARM Limited. All rights reserved. vii 序章 • ADS デベロッパガイド(ARM DUI 0056) • ADS アセンブラガイド(ARM DUI 0068) • ADS コンパイラ / ライブラリガイド(ARM DUI 0067) • AXD/armsd デバッガガイド(ARM DUI 0066) • ADS デバッグターゲットガイド(ARM DUI 0058) • CodeWarrior IDE Guide(ARM DUI 0065) ARM デベロッパスイートには上記の他に以下の資料が収録されています。 • ARM Architecture Reference Manual(ARM DDI 0100)。DynaText と PDF 形式で収 録されています。 • ARM Applications Library Programmer's Guide。DynaText と PDF 形式で収録されて います。 • ARM ELF 仕様書(SWS ESPC 0003)。PDF 形式で install_directory\PDF\specs\ARMELF.pdf に収録されています。 • TIS DWARF 2 仕様書。PDF 形式で install_directory\PDF\specs\TIS-DWARF2.pdf に収録されています。 • ARM/Thumb® Procedure Call Standard specification。PDF 形式で install_directory\PDF\specs\ATPCS.pdf に収録されています。 また、ARM 製品の関連情報については、以下の出版物を参照して下さい。 • ARM Reference Peripheral Specification(ARM DDI 0062) • ご使用中のハードウェアデバイスに関する ARM データシートまたはテクニカル リファレンスマニュアル その他、サンプルコードおよび記述コードに関する情報については、ARM Firmware Suite (AFS)のサンプルコードと説明書を参照して下さい。AFS の詳細については、以下の ARM 出版物を参照して下さい。 • ARM Firmware Suite User Guide(ARM DUI 0136) • ARM Firmware Suite Reference Guide(ARM DUI 0102) 他の出版物 本書では、ARM アセンブリ言語、C ならびに C++ プログラミング言語については詳し く説明していません。プログラミングに関する一般情報については、他の出版物を参 照して下さい。 ARM アーキテクチャについての一般情報については、以下の出版物を参照して下さい。 • viii ARM System-on-chip Architecture (second edition), Furber, S., (2000). Addison Wesley. ISBN 0-201-67519-6. Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 序章 ご意見・ご質問 ARM 社では、ADS および本書に関するご意見・ご質問をお待ちしています。 ARM デベロッパスイートについてのご意見・ご質問 ADS に関するご意見・ご質問がございましたら、製品購入元までご連絡下さい。その 際、迅速かつ適切な対応をさせて頂くために、以下の情報をご用意下さい。 • お名前と会社名 • 製品のシリアル番号 • ご使用になっている製品のリリース情報 • ハードウェアプラットフォーム、オペレーティングシステムのタイプ、バージョ ンなど、ご使用になっているプラットフォームについての詳しい情報 • 当該問題が繰り返し発生するコードの小さなスタンドアロンサンプル • 当初の期待する動作と、実際に起こったことに関する詳しい説明 • コマンドラインオプションを含め、使用した全てのコマンド • 問題を例示するサンプル出力 • バージョン番号、ビルド番号などを含め、ご使用になっているツールのバージョ ン情報 本書に関するご意見 本書に関するご意見等がございましたら、電子メールに以下の情報をご記入の上、 [email protected] までお寄せ下さい。 • • • • 資料名 資料番号 ご意見のあるページ番号 問題点の詳しい説明 補足または向上すべき点についてのご提案もお待ちしています。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. ix 序章 x Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 第1章 はじめに 本章では、ADS に収録されている ARM リンカ / ユーティリティプログラムをご紹介し ます。本章は以下のセクションから構成されています。 • リンカおよびユーティリティについて:P. 1-2 • • ARM DUI0151AJ-00 リンカ:P. 1-2 ユーティリティ:P. 1-3 Copyright © 2001 ARM Limited. All rights reserved. 1-1 はじめに 1.1 リンカおよびユーティリティについて ADS は、支援文書およびサンプルを含み、ARM ファミリの RISC プロセッサ用アプリ ケーションの記述やデバッグを目的としたアプリケーション群で構成されています。 ADS を使用することにより、C、C++、ならびに ARM アセンブリ言語プログラムの開 発・作成・デバッグが可能となります。 ADS ツールキットは、以下の主要コンポーネントから構成されています: • • コマンドライン開発ツール GUI 開発ツール • • ユーティリティ 支援ソフトウェア 本書では、ADS に含まれている ARM リンカ armlink と、コマンドラインユーティリ ティツールについて説明します。ADS に収録されている ARM アセンブラ、コンパイ ラ、デバッガ、支援ソフトウェアの参考文書については、P. vii「ARM の出版物」をご 覧下さい。 1.1.1 リンカ armlink は、1 つ以上のオブジェクトファイルの内容と、1 つ以上のオブジェクトライブ ラリから選択された部分とを組み合わせ、ELF 実行イメージまたは部分的にリンクし た ELF オブジェクトを生成します。 armlink は ARM コードと Thumb コードをリンクさせ、必要に応じてプロセッサ状態を 切り替えるためのインタワーキングベニアを自動生成することができます。またこの リンカは、必要に応じて長分岐ベニアを自動生成し、分岐命令の範囲を拡張すること ができます。 armlink は、システムメモリマップ内にコードとデータを別々の位置に配置できるコマ ンドラインオプションをサポートしています。別の方法としては、分散ロード記述ファ イルを使用して、ロード時と実行時のどちらにも、出力イメージ内のコードセクショ ンとデータセクションに別々のメモリ位置を指定することができます。これにより複 数のメモリに広がる複雑なイメージを作成することができます。 armlink を使用して共通セクションと未使用セクションを削除し、出力イメージのサイ ズを小さくすることができます。さらに、このリンカを使用して以下を行うことがで きます。 • リンクされたファイルのデバッグ情報と参照情報の生成 • スタティックコールグラフの生成とそのスタック使用率のリスト • 出力イメージにあるシンボルテーブルの内容の制御 armlink は、リンクしようとするオブジェクトのビルド属性に基づいて、リンクに適し た標準 C または C++ ライブラリバリアントを自動的に選択します。 1-2 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 はじめに armlink は ELF 以外の出力形式を生成しません。したがって、ELF イメージを ROM に ロードするためにプレーンバイナリなどの他の形式に変換したい場合には、fromELF ユーティリティを使用して下さい。ユーティリティをご覧下さい。 この ARM リンカの詳細については、第 2 章「armlink のコマンド構文」を参照して下さい。 1.1.2 ユーティリティ このセクションでは、主要開発ツールをサポートするために提供されている以下の ユーティリティツールについて概説します。 • fromELF • armar • armprof fromELF fromELF は、ARM イメージ変換ユーティリティです。fromELF は ELF 形式の入力ファ イルを受け取り、以下の多様な出力形式に変換します。 • プレーンバイナリ • Motorola32 ビット S レコード形式 • Intel Hex-32 形式 • バイト指向(Verilog メモリモデル)Hex 形式 また、fromELF を使用して入力ファイルに関するテキスト情報を作成し、コードを逆 アセンブルすることもできます。詳細については、第 7 章「fromELF の使用」を参照し て下さい。 armar ARM ライブラリアン armar を使用して、ELF ファイルセットを ar 形式ライブラリに収 集・保管することができます。複数の ELF オブジェクトファイルの代わりにライブラ リをリンカに渡すことができます。詳細については、P. 6-6「ARM ライブラリアン」を 参照して下さい。 armprof ARM プロファイラ armprof は、ARM デバッガが生成したプロファイルデータファイル からの簡単なプログラムの実行プロファイルを表示します。詳細については、第 8 章 「ARM プロファイラの使用」を参照して下さい。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 1-3 はじめに 1-4 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 第2章 armlink のコマンド構文 本章では、armlink のコマンド構文について詳しく説明します。本章は以下のセクショ ンから構成されています。 • armlink について:P. 2-2 • ARM DUI0151AJ-00 armlink のコマンド構文:P. 2-8 Copyright © 2001 ARM Limited. All rights reserved. 2-1 armlink のコマンド構文 2.1 armlink について ARM リンカ armlink を使用して、以下を行うことができます。 • ARM コードまたは Thumb コードのどちらかを使用したライブラリとオブジェク トの集合をリンクし、1 つの実行イメージを作成する。 • 後のリンク作業の入力として使用可能なオブジェクトにするために、オブジェク ト集合の一部を 1 つのオブジェクトにする。 • コードとデータのメモリ内の位置を指定する。 • リンクされたファイルに関するデバッグ情報と参照情報を作成する。 オブジェクトは、コードと、初期化データと、ゼロに設定する必要のあるメモリの位 置を含む、複数の入力セクションから構成されます。入力セクションには、読み出し 専用(RO)、読み出し - 書き込み(RW)、ゼロ初期化(ZI)のいずれかの属性を設定す ることができます。armlink はこれらの属性を使用して入力セクションをグループ化し、 出力セクション、出力領域、出力イメージと呼ばれる大きなビルディングブロックを 作成します。ロード領域は ELF セグメントと同じです。 通常、リセット時またはデバッガによってイメージがターゲットにロードされた後は、 ロード領域はシステムメモリマップ内に存在します。イメージを実行するには、その 前にいくつかの領域を実行アドレスに移動させなければならない場合があります。こ のためイメージのメモリマップには全く異なる 2 つのビューがあります。 • • プログラムとデータが最初にロードされたときのメモリのロードビュー コードを通常の実行位置に移動した後のメモリの実行ビュー ロードアドレスで実行される領域をルート領域と呼びます。 イメージ階層の詳細については、P. 3-2「イメージ構造の指定」を参照して下さい。 2-2 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 armlink のコマンド構文 2.1.1 armlink への入力 armlink への入力は以下で構成されます。 • ELF オブジェクト形式の 1 つ以上のオブジェクトファイル。この形式については ARM ELF 仕様書で説明しています。詳細については P. vii「ARM の出版物」を参 照して下さい。 • その他、armar で作成された 1 つまたは複数のライブラリ(第 6 章「ライブラリ の作成と使用」参照) 注 下位互換性の目的で、armlink は AOF 形式のオブジェクトファイルと ALF 形式のライ ブラリにも対応しています。ただし、これらの旧形式は今後サポート対象外となる予 定です。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 2-3 armlink のコマンド構文 2.1.2 armlink からの出力 armlink の呼び出しに成功すると、以下のいずれかの出力が得られます。 • ELF 実行可能形式の実行イメージ • 部分リンクされた ELF オブジェクト形式のオブジェクト 単純なイメージの場合、ELF 実行ファイルにはそのイメージの RO および RW 出力セ クションとほぼ同じセグメントが含まれています。また ELF 実行ファイルは、イメー ジの出力セクションを含む ELF セクションも保持しています。 ELF 実行可能形式の実行イメージは、fromELF ユーティリティを使用して他のファイ ル形式に変換することができます。詳細については、第 7 章「fromELF の使用」を参照 して下さい。 実行イメージの構成 armlink を使用して実行イメージを構成するとき、armlink は以下を行います。 • 入力オブジェクトファイル間のシンボリック参照を解決する。 • そのままでは不完全なシンボリック参照を、ライブラリからオブジェクトモ ジュールを抽出することによって完成させる。 • 入力セクションを属性と名前によってソートし、類似する属性と名前の付いたセ クションを連続するチャンクにマージする。 • デバッグセクションの重複コピーを削除する。 • 決められたグループ化情報と配置情報に基づき、オブジェクトフラグメントをメ モリ領域内にまとめる。 • 再配置可能値を再配置する。 • 実行イメージを生成する。 部分リンクされたオブジェクトの構成 armlink を使用して部分リンクされたオブジェクトを構成するとき、armlink は以下を行 います。 • デバッグセクションの重複コピーを削除する。 • シンボルテーブルのサイズを最小化する。 • 未解決参照は未解決のままにしておく。 • 次のリンクステップへの入力として使用可能なオブジェクトを生成する。 注 部分リンクを行う場合、分散ローディングファイルにあるコンポーネントオブジェク トを名前で参照することはできません。 2-4 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 armlink のコマンド構文 2.1.3 armlink オプションの概要 このセクションでは、armlink の各コマンドラインオプションについて簡単に説明しま す。これらのオプションは機能グループで分類しています。 ヘルプおよび情報へのアクセス 使用可能なコマンドラインオプションに関する情報を得るには、以下のオプションを 使用します。 -help ツールのバージョン番号を確認するには、以下のオプションを使用します。 -vsn 出力タイプと出力ファイル名の指定 1 つの実行イメージではなく部分リンクされたオブジェクトを作成するには、以下のオ プションを使用します。 -partial 出力ファイルに名前を付けるには、以下のオプションを使用します。 -output 出力ファイル形式を指定するには、以下のオプションを使用します。 -elf ELF はデフォルトかつ唯一使用できる出力形式です。fromELF を使用することにより、 ELF 出力を他の形式に変換することができます。詳細については、第 7 章「fromELF の 使用」を参照して下さい。 via ファイルの使用 リンカへの追加コマンドライン引数を含む via ファイルを指定するには、以下のオプ ションを使用します。 -via 詳細については、ADS コンパイラ / ライブラリガイドの via ファイル関連セクションを 参照して下さい。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 2-5 armlink のコマンド構文 イメージのメモリマップ情報の指定 以下のオプションを使用して、単純なメモリマップを指定することができます。 -reloc -ro-base -rw-base -ropi -rwpi -split 複雑なイメージの場合には、以下のオプションを使用します。 -scatter 分散ローディングについては、第 5 章「分散ローディング記述ファイルの使用」を参 照して下さい。 -scatter オプションを使用する場合は、単純メモリマップオプションの -ro-base、 -rw-base、-reloc、-ropi、-rwpi、-split のいずれも使用できません。-scatter オプションを使用するには、分散ローディング記述ファイルを使用して __user_initial_stackheap() 関数を再実装する必要があります。 単純メモリマップオプションは実行イメージのメモリマップを指定するため、部分リ ンクには使用できません。詳細については ADS デベロッパガイドを参照して下さい。 イメージ内容の制御 以下のオプションを使用して、イメージの内容に影響を及ぼす様々な要因を制御する ことができます。 -debug | -nodebug -entry -first -keep -last -libpath -edit -locals | -nolocals -remove | -noremove -scanlib | -noscanlib -match 2-6 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 armlink のコマンド構文 イメージ関連情報の生成 以下のオプションを使用して、イメージ関連情報の抽出方法と表示方法を制御するこ とができます。 -callgraph -info -map -symbols -symdefs -xref -xreffrom -xrefto -callgraph を除き、リンカは標準出力ストリーム stdout で要求された情報をデフォ ルトで印字します。この情報は、-list コマンドラインオプションを使用してテキス トファイルに転送することができます。 -callgraph を使用する場合、この情報は HTML ファイルに保存されます。 output_name.htmと命名されたHTMLファイルが、生成イメージと同じディレクトリ に保存されます。 armlink の診断の制御 armlink による診断の実行方法を制御することができます。 以下のオプションを使用して、 -errors -list -verbose -strict -unresolved -mangled -unmangled ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 2-7 armlink のコマンド構文 2.2 armlink のコマンド構文 注 括弧を使用するコマンドライン引数の場合、UNIX システムでは逆スラシュ文字(\) を用いて括弧文字をエスケープしなければならない場合があります。 以下は、armlink の完全コマンド構文です。 armlink [-help] [-vsn] [-partial] [-output file] [-elf] [-reloc] [-ro-base address] [-ropi] [-rw-base address] [-rwpi] [-split] [-scatter file] [-debug|-nodebug] [-remove (RO/RW/ZI/DBG)|-noremove] [-entry location ] [-keep section-id] [-first section-id] [-last section-id] [-libpath pathlist] [-scanlib|-noscanlib] [-locals|-nolocals] [-callgraph] [-info topics] [-map] [-symbols] [-symdefs file] [-edit file] [-xref] [-xreffrom object(section)] [-xrefto object(section)] [-errors file] [-list file] [-verbose] [-unmangled |-mangled] [-match crossmangled] [-via file] [-strict] [-unresolved symbol] [-MI|-LI|-BI] [input-file-list] 各オプションの説明: -help 頻繁に使用される複数のコマンドラインオプションの一覧を印 字します。 -vsn armlink のバージョン情報を表示します。 -partial 1 つの実行イメージではなく部分リンクされたオブジェクトを作 成します。 -output file 出力ファイルの名前を指定します。このファイルは、部分リンク されたオブジェクトでも実行イメージでも構いません。出力ファ イルの名前が指定されていない場合、armlink は以下のデフォルト を使用します。 __image.axf 出力が実行イメージの場合。 __object.o 出力が部分リンクされたオブジェクトの場 合。 fileにパス情報が指定されていない場合、このファイルは現在の 作業ディレクトリ内に作成されます。パス情報が指定されている 場合は、そのディレクトリがデフォルトの出力ディレクトリにな ります。 -elf 2-8 ELF 形式のイメージを生成します。ELF は armlink がサポートし ている唯一の出力形式です。デフォルトにはこの形式が使用され ます。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 armlink のコマンド構文 -reloc 再配置可能イメージを作成します。 再配置可能イメージに含まれる動的セグメントは、リンク後のイ メージの再配置に使用できる再配置アドレスを保持します。リン ク後の再配置を示すサンプルコードに、拡張 ROM 構成と実行時 の動的ローディングが含まれます。 イメージをリンク時のアドレスにロードする場合は、armlink が作 成する再配置可能イメージの再配置処理を行う必要はなく、その イメージの有効なデバッグデータを得ることができます。しか し、イメージをリンク時のアドレスとは異なるアドレスにロード して再配置処理を行った場合には、そのイメージ内にあるすべて のデバッグデータが無効になります。 -reloc を単体で使用すると単純タイプ 1 に似たイメージが生成 されますが、その 1 つのロード領域に RELOC 属性が設定されま す。タイプ 1 のイメージについては、P. 3-14「タイプ 1:単一ロー ド領域と連続出力領域」を参照して下さい。 -reloc -split の組み合わせを使用すると単純タイプ 3 に似た イメージが生成されますが、この場合は 2 つのロード領域に RELOC 属性が設定されます。タイプ 3 のイメージについては、 P. 3-17「タイプ 3:2 ロード領域と不連続出力領域」を参照して下 さい。 -split を使用せずに -reloc -rw-base を使用すると、エラー が発生します。 -ro-base address RO 出力セクションを含む領域のロードアドレスと実行アドレス の両方を address に設定します。address は、ワード境界で整 列させる必要があります。このオプションを指定していない場合 は、デフォルトの RO ベースアドレス 0x8000 が使用されます。 -ropi RO 出力セクションを含むロード / 実行領域を位置独立にします。 このオプションを使用しない場合は、その領域が絶対領域として マーキングされます。通常、読み出し専用のどの入力セクション も、読み出し専用位置独立セクションである必要があります。こ のオプションを選択した場合、armlink は以下を行います。 • セクション間の再配置が可能であるかどうかをチェックし ます。 • インタワーキングベニアなど、armlink が生成したすべての コードが読み出し専用の位置独立コードであることを確認 します。 注 armlink が入力セクションの処理を終了するまで、ARM ツールは 最終出力イメージが読み出し専用の位置独立イメージであるか どうかを決定できません。したがって、コンパイラやアセンブラ に ROPI オプションを指定した場合でも、armlink が ROPI エラー メッセージを発行することがあります。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 2-9 armlink のコマンド構文 -rw-base address RW 出力セクションを含む領域の実行アドレスを address に設 定します。address はワード境界であること。 このオプションを -split と共に使用すると、RW 出力セクショ ンを含む領域のロードアドレスと実行アドレスの両方がaddress に設定されます。 RW/ZI 出力セクションを含むロード / 実行領域を位置独立にしま す。このオプションを使用しない場合は、その領域が絶対領域と してマーキングされます。このオプションを使用する場合は、 -rw-base に値を指定する必要があります。-rw-base が指定さ れていない場合は、-rw-base 0 とみなされます。通常、書き込 み可能な各入力セクションは、Read Only Position Independent セク ションである必要があります。 -rwpi このオプションを選択した場合、armlink は以下を行います。 • 読み出し - 書き込み実行領域への入力セクションに PI 属性 が設定されているかどうかをチェックします。 • セクション間の再配置が可能であるかどうかをチェックし ます。 • RO 領域と RW 領域のコピー時または初期化時に使用される テーブルの静的ベース相対エントリアドレスを生成します。 注 書き込み可能データに位置独立属性が、コンパイラによって設定 されることはありません。つまり、コンパイラやアセンブラに RWPI オプションを指定した場合でも、armlink はそのデータが RWPI ではないと診断する場合があります。 -split RO 出力セクションと RW 出力セクションを含むデフォルトの ロード領域を 2 つのロード領域に分割します。 • • 2-10 RO 出力セクションを含む領域:デフォルトのロードアドレ スは 0x8000 ですが、-ro-base オプションを使用して別 のアドレスを指定することができます。 RW 出力セクションを含む領域:この領域のロードアドレス は -rw-base オプションによって指定されます。このオプ ションを使用するには、-rw-base に値を指定する必要が あります。-rw-base が指定されていない場合は、 -rw-base 0 とみなされます。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 armlink のコマンド構文 -scatter file file に書かれた分散ローディングの記述を使用してイメージの メモリマップを作成します。この記述により、イメージ内の様々 な領域とセクションのグループ化および配置情報を用意するこ とができます。詳細については、第 5 章「分散ローディング記述 ファイルの使用」を参照して下さい。 注 このオプションを使用する場合は、スタックとヒープの初期化関 数 __user_initial_stackheap() を再実装する必要がありま す。 -debug 出力ファイルにデバッグ情報を付加します。このデバッグ情報に は、デバッグ入力セクションとシンボル / ストリングテーブルが 含まれています。このオプションはデフォルトで設定されます。 -nodebug 出力ファイルにデバッグ情報を付加しません。このオプションを 使用するとイメージサイズは小さくなりますが、ソースレベルで のデバッグが不可能になります。armlink は、入力オブジェクトと ライブラリメンバ内で検出したすべてのデバッグ入力セクショ ンを破棄し、イメージがデバッガにロードされるときにシンボル / ストリングテーブルを付加しません。これによる影響を受ける のはデバッガロード時におけるイメージサイズのみであり、ター ゲットにダウンロードされるバイナリイメージのサイズには影 響しません。 イメージではなく部分リンクされたオブジェクトを作成する場 合、armlink は入力オブジェクト内で検出したデバッグ入力セク ションを破棄しますが、部分リンクされたオブジェクト内にシン ボル / ストリングテーブルを作成します。 注 fromELF を使用する場合は、-nodebug を使用しないで下さい。 デバッグ情報がないイメージを作成した場合: ARM DUI0151AJ-00 • fromELF を使用しても、そのイメージを他のファイル形式 に変換することができません。 • fromELF が有意な逆アセンブリリストを作成することがで きません。 Copyright © 2001 ARM Limited. All rights reserved. 2-11 armlink のコマンド構文 -remove (RO/RW/ZI/DBG) 入力セクション上の未使用セクションを削除し、イメージから未 使用セクションを削除します。イメージのエントリポイントを含 んでいる、あるいは使用セクションから参照される入力セクショ ンは、使用するセクションとみなされます。P. 3-12「未使用セク ションの削除」を参照して下さい。 注意 -remove を使用する場合は、例外ハンドラを削除しないように注 意して下さい。この場合は -keep オプションを使用して例外ハ ンドラを識別するか、ENTRY ディレクティブを使用して例外ハン ドラにエントリポイントのラベルを付けて下さい。 また、セクション属性修飾子を使用すれば、未使用セクションの 削除プロセスをより厳密に制御することができます。この場合は 以下の修飾子を使用することができます。 RO タイプの全ての未使用セクションが削除されます。 RO RW タイプの全ての未使用セクションが削除されます。 RW ZI タイプの全ての未使用セクションが削除されます。 ZI DEBUG タイプの全ての未使用セクションが削除され DBG ます。 上記の修飾子を使用する場所と順序に制約はありませんが、修飾 子は必ず括弧 () で囲み、スラッシュ / で区切る必要があります。 デフォルトには -remove (RO/RW/ZI/DBG) が使用されます。 セクション属性修飾子が指定されていない場合は、全ての未使用 セクションが削除されます。-remove は -remove (RO/RW/ZI/DBG) と等価です。 2-12 -noremove このオプションを使用すると、入力セクション上の未使用セク ションの削除が実行されません。最終イメージ内の入力セクショ ンは未使用セクションも含めて全て保持されます。 -entry location イメージの固有の初期エントリポイントを指定します。イメージ には複数のエントリポイントが含まれている可能性があります が、このコマンドを使用して指定された初期エントリポイント は、ローダが使用する実行ファイルヘッダにストアされます。コ マンドラインでこのオプションを使用できるのは 1 箇所だけで す。イメージがロードされるとき、ARM デバッガはこのエント リアドレスを使用して PC を初期化します。初期エントリポイン トは、以下の条件を満たしている必要があります。 • イメージのエントリポイントが実行領域内に存在する。 • その実行領域が非オーバレイ領域であり、かつルート実行 領域である(ロードアドレス=実行アドレス)。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 armlink のコマンド構文 location を以下のいずれかと置き換えます。 entry_address 数値を指定します。 例: -entry 0x0 symbol イメージのエントリポイントに symbol のアドレスを 指定します。 例: -entry int_handler symbolの定義が複数存在すると、armlinkはエラーメッ セージを生成します。 offset+object(section) イメージのエントリポイントを、特定の object に含 まれる section 内の offset の位置に指定します。 例: -entry 8+startup(startupseg) -entry への引数にはスペースを入れないで下さい。 input section とオブジェクト名のマッチングにお いて、大文字・小文字は区別されません。以下の簡略 化された表記を使用することができます。 • object(section) と表記すれば、offset=0 と みなします。 • 入力セクションが 1 つしかないとき、object の み表記できます。この形式を使用した場合に、 object 内に複数の非デバッグ入力セクション が存在すると、armlink はエラーメッセージを生 成します。 -keep section-id 未使用セクションを削除する処理に対して、削除してはならない 入力セクションを指定します。P. 3-5「イメージのメモリマップの 指定」を参照して下さい。-keep へのどの形式の section-id 引数にも、ワイルドカード * および?を使用することができます。 section-id を以下のいずれかに置き換えて下さい。 symbol 未使用セクションを削除する処理に対して、symbol が定義されている入力セクションを保持するように指 定します。symbol の定義が複数存在する場合、 symbol を定義する全ての入力セクションが同様に処 理されます。 例: -keep int_handler _handler で終わるシンボルを定義する全てのセク ションを保存するには、以下を使用します。 -keep *_handler このコマンドは、コマンドライン上で何度でも使用す ることができます。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 2-13 armlink のコマンド構文 object(section) 未使用セクションを削除する処理に対して、object に ある section を削除しないように指定します。入力セ クションとオブジェクト名のマッチングにおいて、大 文字・小文字は区別されません。例えば、vectors.o オブジェクトの vect セクションを保持するには以下 のコマンドを使用します。 -keep vectors.o(vect) vectors.o オブジェクトに含まれ、セクション名の先 頭 3 文字が vec である全てのセクションを保持するに は、以下のコマンドを使用します。 -keep vectors.o(vec*) object このコマンドは、コマンドライン上で何度でも使用す ることができます。 未使用セクションを削除するとき、object にある 1 つ の入力セクションを保持するように指定します。オブ ジェクト名のマッチングが行われるとき、大文字・小 文字は区別されません。この省略形を使用したときに objectに複数の入力セクションが存在すると、armlink はエラーメッセージを生成します。 例: -keep dspdata.o 名前が dsp で始まる各オブジェクトの 1 つの入力セク ションを保持するには、以下のコマンドを使用します。 -keep dsp*.o このオプションは、コマンドライン上で何度でも使用 することができます。 -first section-id 選択された入力セクションを実行領域内に最初に配置します。例 えば、このオプションを使用することによって、リセットおよび 割り込みベクタを含むセクションを最初にイメージ内に配置す ることができます。section-id を以下のいずれかに置き換えて 下さい。 symbol symbol を定義するセクションを選択します。複数のセ クションを最初に配置することは不可能なため、複数 の定義を持つシンボルを指定することはできません。 例: -first reset object(section) objectからsectionを選択します。objectとその後 の開括弧との間にはスペースを入れないで下さい。 例: -first init.o(init) 2-14 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 armlink のコマンド構文 object object にある 1 つの入力セクションを選択します。こ の省略形を使用したときに複数の入力セクションが存 在すると、armlink はエラーメッセージを生成します。 例: -first init.o 注 分散ローディングを使用する場合は、コマンドラインで指定され た -FIRST の代わりに分散ローディング記述ファイル内の +FIRST を優先します。分散ローディングファイルが使用される と、armlink は -first と -last が無視されることを警告します。 -first を使用すると、最初に RO を、次に RW を、最後に ZI を配 置する、領域内の出力セクションの基本属性ソート順序を変更で きません。対象領域に RO セクションが存在する場合は、RW セ クションまたは ZI セクションを最初に配置することができませ ん。対象領域に RO セクションまたは RW セクションが存在する 場合は、ZI セクションを最初に配置することはできません。 異なる 2 つのセクションの両方を同一実行領域内の最初に配置す ることはできないため、 このオプションは 1 つしか使用できません。 -last section-id 選択された入力セクションを実行領域の最後に配置します。例え ば、このオプションを使用することで、チェックサムを含む入力 セクションを RW セクション内の最後に強制的に配置することが できます。section-id を以下のいずれかに置き換えて下さい。 symbol を定義するセクションを選択します。最後に複 数のセクションを配置することは不可能なため、複数 の定義を持つシンボルを指定することはできません。 例: -last checksum object(section) symbol object objectからsectionを選択します。objectとその後 の開括弧との間にはスペースを入れないで下さい。 例: -last checksum.o(check) object から 1 つの入力セクションを選択します。 objectに複数の入力セクションがある場合、armlinkは エラーメッセージを生成します。 注 分散ローディングを使用する場合は、コマンドラインで指定され た -LAST の代わりに分散ローディング記述ファイル内の +LAST を優先します。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 2-15 armlink のコマンド構文 -last を使用すると、最初に RO を、次に RW を、最後に ZI を配置 する、領域内の出力セクションの基本属性ソート順序をオーバラ イドすることができなくなります。対象領域に ZI セクションが存 在する場合、RW セクションを最後に配置することはできません。 対象領域に RW セクションまたは ZI セクションが存在する場合、 RO セクションを最後に配置することはできません。 異なる 2 つのセクションの両方を同一実行領域内の最後に配置す ることはできないため、 このオプションは 1 つしか使用できません。 -libpath pathlist ARM 標準 C/C++ ライブラリの探索に使用されるパスのリストを 指定します。 注 このオプションがユーザライブラリの探索に影響を及ぼすこと はありません。 これらのパスは、ARMLIB 環境変数によって指定されたパスを オーバライドします。pathlist は、必要な ARM ライブラリの 検索のみに使用されるパス path1, path2,... pathn をカン マで区切ってリストにしたものです。ARM ライブラリを含むディ レクトリのデフォルトパスは、ARMLIB 環境変数によって指定さ れます。ライブラリのインクルードについては、P. 6-3「ライブラ リの検索、選択、スキャン」を参照して下さい。 2-16 -scanlib 参照を解決するデフォルトライブラリ(標準 ARM C/C++ ライブ ラリ)のスキャンをイネーブルします。このオプションはデフォ ルトで設定されています。 -noscanlib リンク時にデフォルトライブラリをスキャンしません。 -locals 実行イメージの作成時に、出力シンボルテーブルにローカルシン ボルを追加するようにリンカに命令します。このオプションはデ フォルトで設定されています。 -nolocals 実行イメージの作成時に、出力シンボルテーブルにローカルシン ボルを追加しないようにリンカに命令します。出力シンボルテー ブルのサイズを小さくしたい場合には、このオプションを使用す ることによって最適化を図ることができます。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 armlink のコマンド構文 -callgraph 関数のスタティックコールグラフを HTML 形式で作成します。こ のコールグラフから、イメージ内の全ての関数の定義情報と参照 情報を得ることができます。各関数 func について、コールグラ フは以下を示します。 • 関数がコンパイルされるときのプロセッサ状態(ARM また は Thumb) • func を呼び出す関数の集合 • func によって呼び出される関数の集合 • func のアドレスがイメージ内で使用される回数 さらに、コールグラフから以下の関数を識別することができます。 • インタワーキングベニアを通じて呼び出される関数 • イメージ外で定義される関数 • 未定義のままであっても許される関数(弱い参照) スタティックコールグラフからは、以下のスタック使用情報も得 ることができます。 -info topics • 各関数が使用するスタックフレームのサイズ • 対象関数が全てのコールシーケンスを通じて、つまりコー ルグラフの非周期ファンクションコールを通じて使用する スタックの最大サイズ 指定されたトピックに関する情報を印字します。topics は一連 のトピックキーワードをカンマで区切ったものです。トピック キーワードには以下のいずれかを使用することができます。 sizes イメージ内の各入力オブジェクトおよびライブラリメ ンバに使用されるコードとデータ(RO データ、RW データ、ZI データ、デバッグデータ)のサイズをリス トします。このオプションを使用すると、-info sizes,totals が暗黙に定義されます。 入力オブジェクトおよびライブラリに使用されるコー ドとデータ(RO データ、RW データ、ZI データ、デ バッグデータ)のサイズの合計を示します。 veneers armlink が生成するベニアの詳細を示します。ベニアの 詳細については、P. 3-13「ベニアの生成」を参照して 下さい。 unused -removeを使用したことによってイメージから削除さ れた全未使用セクションをリストします。 totals ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 2-17 armlink のコマンド構文 注 リスト内のキーワード間にはスペースを入れないで下さい。 正しい入力の例: -info sizes,totals 間違った入力の例: -info sizes, totals -map イメージマップを作成します。このイメージマップは、デバッガ およびリンカが生成した入力セクションを含め、イメージ内の各 ロード領域、実行領域、入力セクションのアドレスとサイズを保 持します。 -symbols リンクステップで使用される各ローカル / グローバルシンボルと その値をリストします。この中にはリンカが生成したシンボルも 含まれます。 -symdefs file 出力イメージからのグローバルシンボルの定義を含んだシンボ ル定義ファイルを作成します。 デフォルトでは、全てのグローバルシンボルが symdefs ファイル に書き込まれます。file が既に存在する場合、リンカは既存の symdefs ファイルにリストされたシンボルだけを出力します。 fileがパス情報のないままで指定されている場合、リンカは出力 イメージが書き込まれるディレクトリ内でそのファイルを検索 します。ファイルが検出されない場合は、そのディレクトリ内に 作成されます。 このシンボル定義ファイルは、別のイメージにリンクするときの 入力として使用することができます。詳細については、P. 4-5「別 のイメージに含まれるシンボルへのアクセス」を参照して下さい。 -edit file このオプションを使用して、出力バイナリのシンボルテーブルを 編集するコマンドを含んだ、ステアリングファイルを指定するこ とができます。ステアリングファイル内には以下のコマンドを指 定することができます。 • グローバルシグナルを隠蔽するコマンド。このオプション を使用して、オブジェクトファイル内の特定のグローバル シンボルを隠蔽することができます。隠蔽されたシンボル は公開されません。 • グローバルシンボルに別名を付けるコマンド。このオプ ションを使用して、シンボル名の競合を解消することがで きます。 ステアリングファイルの構文については、P. 4-9「グローバルシン ボルの隠蔽と再命名」を参照して下さい。 -xref 2-18 入力セクション間の全ての相互参照をリストします。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 armlink のコマンド構文 -xreffrom object(section) object の入力section から別の入力セクションへの相互参照を リストします。このリストは -xref を使用することによって得ら れるリストのサブセットであり、特定の入力セクションからの参 照を調べたいときに便利です。このオプションを複数使用して、 複数入力セクションからの参照をリストさせることができます。 -xrefto object(section) 他の入力セクションから object に含まれる入力 section への 相互参照をリストします。このリストは -xref を使用すること によって得られるリストのサブセットであり、特定の入力セク ションへの参照を調べたいときに便利です。このオプションを複 数使用して、複数入力セクションへの参照をリストさせることが できます。 -errors file 標準エラーストリームからの診断を file へ転送します。 -list file -info、-map、-symbols、-xref、-xreffrom、-xrefto の 各コマンド出力からの診断を file へ転送します。 file がパス情報のないままで指定されている場合、そのファイル は出力イメージが書き込まれる出力ディレクトリ内に作成され ます。 -verbose インクルードされるオブジェクトと、それらのオブジェクトが取 得されるライブラリを含め、リンク操作に関する詳しい情報を印 字します。 -unmangled 診断メッセージ内、ならびに -xref、-xreffrom、-xrefto、 -symbols の各オプションによって作成されたリスト内に、符号 化されていないC++シンボル名を表示するようにリンカに指示し ます。 このオプションが選択されている場合、リンカは C++ シンボル名 がソースコード表記のように表示されるよう、これらのシンボル 名を復号化します。このオプションはデフォルトです。 -mangled ARM DUI0151AJ-00 診断メッセージ内、ならびに -xref、-xreffrom、-xrefto、 -symbols の各オプションによって作成されたリスト内に、符号 化された C++ シンボル名を表示するようにリンカに指示します。 このオプションが選択されている場合、リンカは C++ シンボル名 を復号化しません。シンボル名は、オブジェクトのシンボルテー ブルに出現する形で表示されます。 Copyright © 2001 ARM Limited. All rights reserved. 2-19 armlink のコマンド構文 -match crossmangled 以下の組み合わせのマッチングを行うようにリンカに指示します。 • 復号化されたシンボルへの参照と、符号化された定義 • 符号化されたシンボルへの参照と、復号化された定義 ライブラリとマッチングは以下のように行われます。 • ライブラリメンバが符号化された定義を定義し、復号化さ れた未解決参照があるとき、この参照を満たすためにその メンバがロードされます。 • ライブラリメンバが復号化された定義を定義し、符号化さ れた未解決参照があるとき、この参照を満たすためにその メンバがロードされます。 注 このオプションは部分リンクに使用しても作用しません。部分オ ブジェクトは、たとえ符号化された定義が存在しても、復号化さ れたシンボルへの全ての未解決参照を保持します。マッチングは 最終リンクステップにおいてのみ実行されます。 -via file 入力ファイル名およびリンカオプションの詳細リストを file か ら読み込みます。 armlink のコマンドラインには複数の -via オプションを入力する ことができます。また、-via オプションは via ファイル内に含め ることもできます。via ファイルの記述に関する詳しい情報につい ては、ADS コンパイラ / ライブラリガイドを参照して下さい。 -strict 警告ではなく、エラーとして障害を引き起こす可能性のある条件 を通知するようにリンカに指示します。 -unresolved symbol 未定義シンボルと、symbol のグローバル定義とのマッチングを 行います。symbol は、定義済みのグローバルシンボルである必 要があります。シンボルが未定義シンボルとしてリストされる と、リンクは、失敗です。このオプションを使用すれば、見当ら ない関数への各参照をダミー関数とのマッチングを行うことに よって部分的に実装されたシステムをテストすることが可能と なるため、トップダウン方式の開発では特に便利です。 このオプションを使用しても警告は表示されません。 2-20 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 armlink のコマンド構文 input-file-list オブジェクトまたはライブラリをスペースで区切ってリストし たものです。 オブジェクトファイルの特殊タイプであるsymdefファイルをこの リストに入れることで、以前に生成されたイメージファイルのグ ローバルシンボルの値を得ることができます。詳細については、 P. 4-5「別のイメージに含まれるシンボルへのアクセス」を参照し て下さい。 入力ファイルリスト内でライブラリを使用する方法には以下の 2 通りがあります。 • ライブラリから抽出し、独立オブジェクトとしてイメージ に追加する特定のメンバを指定する。例えば、入力ファイ ルリスト内にmystring.lib(strcmp.o)と指定すること ができます。 • 非弱な未解決参照を解決してくれるライブラリのメンバを 抽出して、追加すべきライブラリをライブラリリストに指 定する。例えば、入力ファイルリスト内に mystring.lib と指定することができます。armlink がデフォルトのライブ ラリディレクトリをスキャンし、ほぼ一致する使用可能な ライブラリを選択すると、armlink によって暗黙的にこのラ イブラリが、このライブラリリストに追加されます。この リストに含まれるライブラリのメンバは、それらが非弱な 未解決参照を解決する場合にのみ、イメージに追加されま す。詳細については、P. 6-3「ライブラリの検索、選択、ス キャン」を参照して下さい。 armlink は、以下の順序で入力ファイルリストを処理します。 1. オブジェクトをイメージに無条件で追加する。 2. パターンを使用してライブラリから選択したメンバを、オ ブジェクトであるかのようにイメージに無条件で追加す る。例: armlink main.o mylib(stdio.o) mylib(a*.o). 全ての a*.o オブジェクトおよび stdio.o を無条件で追加 します。 3. ARM DUI0151AJ-00 後で残りの非弱な未解決参照の解決に使用されるライブラ リをライブラリストに追加する。 Copyright © 2001 ARM Limited. All rights reserved. 2-21 armlink のコマンド構文 2-22 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 第3章 基本リンカ機能 本章では、armlink の基本機能について説明します。本章は以下のセクションから構成 されています。 • イメージ構造の指定:P. 3-2 • セクションの配置:P. 3-8 最適化と修正:P. 3-12 • コマンドラインオプションを使用した単純イメージの作成:P. 3-14 • より高度なリンカ機能については、以下のセクションを参照して下さい。 シンボルへのアクセス 第 4 章「イメージシンボルへのアクセス」 ARM DUI0151AJ-00 分散ローディング 第 5 章「分散ローディング記述ファイルの使用」 ライブラリ 第 6 章「ライブラリの作成と使用」 形式の変更 第 7 章「fromELF の使用」 Copyright © 2001 ARM Limited. All rights reserved. 3-1 基本リンカ機能 3.1 イメージ構造の指定 イメージの構造は以下によって定義されます。 • それを構成する領域と出力セクションの数 • イメージがロードされるときの、上記の領域とセクションのメモリ内における 位置 • イメージが実行されるときの、上記の領域とセクションのメモリ内における位置 3.1.1 オブジェクトとイメージのビルディングブロック 実行ファイルにストアされたイメージは、イメージ、領域、出力セクション、入力セ クションから成る階層から構成されています。 • 1 つのイメージは、1 つ以上の領域から構成されています。各領域は、1 つ以上の 出力セクションから構成されています。 • 各出力セクションには、1 つ以上の入力セクションが含まれています。 • 入力セクションには、オブジェクトファイル内のコードおよびデータ情報が含ま れています。 P. 3-3図3-1は、領域、出力セクションならびに入力セクション間の関係を示しています。 3-2 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 基本リンカ機能 図 3-1 イメージのビルディングブロック 入力セクション 入力セクションには、コードまたは初期化データを保持しているものと、 初期化されていないメモリ、あるいはイメージ実行前にゼロを設定する 必要があるメモリの断片を記述するものがあります。入力セクションに は、RO、RW、ZI のいずれかの属性を設定することができます。armlink はこれらの属性を使用して入力セクションをグループ化し、出力セク ションまたは出力領域と呼ばれる大きなビルディングブロックを構成し ます。 出力セクション 1 つの出力セクションは、RO、RW、ZI のうちで同じ属性を持った、連 続する一連の入力セクションから構成されます。出力セクションは、そ れを構成する入力セクションと同じ属性を持ちます。これらの入力セク ションは、その出力セクション内において P. 3-8「セクションの配置」で 説明する規則にしたがってソートされます。 領域 ARM DUI0151AJ-00 1 つの領域は、1 ~ 3 つの連続する出力セクションから構成されます。領 域内の出力セクションは、属性にしたがってソートされます。最初に RO 出力セクション、次に RW 出力セクション、最後に ZI 出力セクションが 配置されます。通常、領域は ROM、RAM、ペリフェラルなどの物理メ モリデバイスにマップされます。 Copyright © 2001 ARM Limited. All rights reserved. 3-3 基本リンカ機能 3.1.2 イメージのロードビューと実行ビュー イメージ領域は、ロード時にシステムのメモリマップに配置されます。イメージを実 行するには、その前にいくつかの領域を実行アドレスへ移動し、ZI 出力セクションを 作成しなければならない場合があります。例えば、初期化された RW データは、ROM 内のロードアドレスからRAM内の実行アドレスにコピーしなければならない場合があ ります。 イメージのメモリマップには異なる 2 つのビューがあります(図 3-2)。 ロードビュー このビューは、イメージがメモリにロードされるとき、すなわち イメージ実行開始前のアドレスに基づいて各領域と各セクショ ンを表します。 実行ビュー このビューは、イメージ実行中におけるアドレスに基づいて各領 域と各セクションを表します。 図 3-2 ロード時と実行時のメモリマップ 表 3-1 は、ロードビューと実行ビューの比較を示しています。 表 3-1 ロード 説明 ロード アドレス イメージの実行開始前まで、そのイ 実行アドレス メージ内のセクションまたは領域が ロードされているメモリ内のアドレ ス。セクションまたは非ルート領域の ロードアドレスは、実行アドレスと異 なる場合があります。 イメージの実行中に、そのイメージ内の セクションまたは領域が位置するアド レス。 ロード領域 ロードアドレス空間内の領域。 実行アドレス空間内の領域。 3-4 実行 実行領域 説明 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 基本リンカ機能 3.1.3 イメージのメモリマップの指定 1 つのイメージを構成する領域および出力セクションの数に制限はありません。これら の領域がいくつあっても、異なるロードアドレスと実行アドレスを割り当てることが できます。イメージのメモリマップを構成するには、armlink に以下に関する情報を与 える必要があります。 グループ化 入力セクションを出力セクションと出力領域にグループ化する方法。 配置 メモリマップ内におけるイメージ領域の位置。 イメージのメモリマップの複雑度により、この情報は以下の 2 つの方法で armlink に渡 すことができます。 コマンドラインオプションの使用 イメージ内のロード領域が 1 ~ 2 つで、実行領域が 3 つまでしかないよ うな単純なケースには、以下のオプションを使用することができます。 • -ro-base • -rw-base • -split • -ropi • -rwpi 上記のオプションを使用した簡素化された記述により、単純イメージに 使用する分散ローディング記述と同じことを設定することができます。 詳細については、P. 3-14「コマンドラインオプションを使用した単純イ メージの作成」を参照して下さい。 分散ローディング記述ファイルの使用 イメージコンポーネントのグループ化と配置を厳密に制御しなければな らない複雑なケースには、記述ファイルを使用します。詳細については、 第 5 章「分散ローディング記述ファイルの使用」を参照して下さい。分 散ローディングの使用には、コマンドラインで -scatter filename を 指定します。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 3-5 基本リンカ機能 3.1.4 イメージのエントリポイント イメージ内のエントリポイントによって、プログラムの実行開始位置が示されます。エ ントリポイントには異なる 2 つのタイプがあります。 初期エントリポイント イメージの初期エントリポイントは 1 つの値で表され、ELF ヘッダファ イルにストアされます。オペレーティングシステムまたはブートローダ によって RAM にロードされたプログラムに対して、ローダはそのイメー ジ内の初期エントリポイントに制御を渡すことによって、イメージの実 行を開始します。 1 つのイメージ内に存在し得る初期エントリポイントは 1 つだけです。初 期エントリポイントはENTRYディレクティブによって設定されたエント リポイントの 1 つとも考えられますが、必ずしもそうであるとは限りま せん。 ENTRY ディレクティブによって設定されたエントリポイント エントリポイントが ENTRY ディレクティブを使用してアセンブリ言語 ソースに設定されていることがあります。組み込みシステムの場合、こ のディレクティブは例外ベクタ経由で開始されるコードのマーキングに 使用するのが一般的です。 初期エントリポイントの指定 初期エントリポイントは -entry リンカオプションを使用して指定することができま す。-entry オプションを指定できるのは 1 箇所だけです。詳細については、P. 2-8 「armlink のコマンド構文」を参照して下さい。 ブートローダまたはオペレーティングシステムのプログラムローダといったローダに よって実行されるイメージには、初期エントリポイントが含まれている必要がありま す。例えば、OS のイメージはブートローダによってロードされ、実行ファイルヘッダ 内に指定された初期エントリポイントから実行が開始されます。このイメージはロー ドされた後にブートローダをオーバライドし、OS となります。オペレーティングシス テムの場合、そのイメージには例外ハンドラアドレスなどの他のエントリポイントが 含まれています。 ゼロ番地に ROM を置く組み込みアプリケーションの場合には、-entry 0x0(または 上位ベクタを使用する CPU では 0xffff0000)を使用します。 初期エントリポイントは、以下の条件を満たしている必要があります。 3-6 • そのイメージのエントリポイントが実行領域内に存在していること。 • その実行領域が非オーバレイ領域であり、かつルート領域であること(ロードア ドレスが実行アドレスと同じであること)。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 基本リンカ機能 -entry オプションを使用して初期エントリポイントを指定していない場合でも、リン カは可能な限りこれを設定しようと試みます。 • -entry オプションを使用していない場合に、入力オブジェクトに ENTRY ディ レクティブによって設定されたエントリポイントが 1 つだけ存在しているとき、 リンカはそのエントリポイントをイメージの初期エントリポイントとして使用 します。 • -entry オプションが使用されておらず、さらに以下のどちらかが真である場合 に、リンカは初期エントリポイントを含まない出力オブジェクトを生成します。 — ENTRYディレクティブを使用して複数のエントリポイントが指定されてい る。 — ENTRYディレクティブを使用して指定されているエントリポイントが存在 しない。 出力オブジェクトに初期エントリポイントが含まれていない場合、リンカは以下 の警告を発行します。 L6305W: Image does not have an entry point. (Not specified or not set due to multiple choices) 複数エントリポイントの指定 組み込みイメージには複数のエントリポイントを記述することができます。例えば、 一般的に組み込みイメージには、Reset、IRQ、FIQ、SVC、UNDEF、ABORT の各例外 がそのイメージの実行中に制御を渡すために使用するエントリポイントが含まれてい ます。 ENTRY ディレクティブを使用すれば、1 つのイメージ内に複数のエントリポイントを記 述することができます。このディレクティブは ENTRY キーワードで出力コードセク ションをマーキングし、リンカが未使用セクションの削除を実行する際にそのセク ションを削除しないように指示します。C または C++ で記述したプログラムの場合、C ライブラリにある __main() 関数もエントリポイントとなります。ENTRY ディレク ティブの詳細については、ADS アセンブラガイドを参照して下さい。 組み込みイメージがローダによって使用される場合には、そのイメージのヘッダに 1 つ の初期エントリポイントを指定する必要があります。詳細については、P. 3-6「初期エ ントリポイントの指定」を参照して下さい。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 3-7 基本リンカ機能 3.2 セクションの配置 リンカは、領域内の全ての入力セクションをその属性にしたがってソートします。同 一属性を持つ入力セクションは、その領域内において一連の連続したブロックを形成 します。 各入力セクションのベースアドレスはリンカが定義するソート順序によって決定さ れ、そのベースアドレスを保持する出力セクション内で正しく整列されます。 イメージを生成するとき、リンカは以下の順序で入力セクションをソートします。 • 属性 • 入力セクションの名前 • 入力リスト内における各セクションの位置(-first または -last オプション によってオーバライドされている位置を除く)。詳細については、P. 3-10「FIRST と LAST を使用したセクションの配置」を参照して下さい。 デフォルトでリンカが作成するイメージは、RO と RW に加え、オプションで ZI の属 性を持つ出力セクションから構成されます。メモリ管理ハードウェアを搭載したシス テムでは、ランタイムに RO 出力セクションを保護することができます。また、RO セ クションはターゲットの ROM 内に配置することも可能です。 3-8 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 基本リンカ機能 3.2.1 属性による入力セクションの順序付け 特定言語のランタイムシステムと関連付けられたイメージ部分は、数を最小限に抑え た連続領域にまとめられます。armlink は、入力セクションを属性によって以下のよう に順序付けます。 • 読み出し専用コード • 読み出し専用データ • 読み出し / 書き込みコード • • 他の初期化データ ゼロ初期化(未初期化)データ 同一属性を持つ入力セクションは、名前によって順序付けされます。名前は大文字・小 文字を区別するものとみなされ、ASCII 文字照合シーケンスを使用してアルファベット 順で比較されます。 同一の属性と名前を持つ入力セクションは、入力リスト内における相対位置にした がって順序付けられます。 したがって、ライブラリからインクルードされる、同じ属性と名前を持つ入力セクショ ンの位置は予測不可能です。厳密な位置設定を行う必要がある場合には、モジュール を手動で抽出し、それを入力リストに組み込むことができます。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 3-9 基本リンカ機能 3.2.2 FIRST と LAST を使用したセクションの配置 領域内の全ての RO コード入力セクションは連続して 1 つの RO 出力セクションを形成 し、この出力セクションは全ての RW 入力セクションを含む出力セクションよりも優 先されます。 分散ローディングを使用しない場合には、リンカオプション -first および -last を 使用して入力セクションを配置します。 分散ローディングを使用するときに配置順序が重要な場合には、分散ロード記述ファ イル内で擬似属性 FIRST および LAST を使用し、実行領域内の最初と最後の入力セク ションをマーキングします。 ただし、FIRST と LAST の使用方法が基本属性ソート順序に違反してはなりません。つ まり、ある入力セクションは、それを含む出力セクションが実行領域内の最初(また は最後)の出力セクションである場合に、その領域内の最初(または最後)に配置す ることができます。例えば、RO 入力セクションを含む実行領域内の FIRST 入力セク ションは、RO 入力セクションでなければなりません。同様に、その実行領域に ZI 入 力セクションが含まれている場合には、LAST 入力セクションは ZI 入力セクションで なければなりません。 各出力セクション内において、入力セクションはその名前にしたがってアルファベッ ト順でソートされ、次に入力順序内における位置によってソートされます。 3-10 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 基本リンカ機能 3.2.3 セクションの整列 入力セクションが順序付けられると、armlink はベースアドレスが固定される前に必要 に応じてパディングを行い、各入力セクションをそのアライメントの倍数になるアド レスから開始させます。アライメントは拡張する(通常は 4 バイト整列のものを 8 バ イト整列に設定する)ことが可能ですが、自然アライメントを縮小する(通常は 4 バ イト整列のものを 2 バイト整列に設定する)ことはできません。入力セクションはワー ド境界で整列させるのが一般的です。入力セクションのアライメントは、以下のいず れかを使用して指定することができます。 ALIGN この属性はアセンブリ言語から AREA ディレクティブに使用します。こ の場合の入力セクションのアドレスは、2(align 属性値)の倍数となります。 __align C からの場合はこの修飾子を使用します。入力セクションアドレスは、 指定値(2 の累乗)の倍数となります。 __alignについては、 例3-1およびADS コンパイラ /ライブラリガイドの__alignの項を参 照して下さい。ALIGN については、例 3-2 および ADS アセンブラガイドの ALIGN の 項を参照して下さい。 例 3-1 __align 修飾子の使用 __align(8) long long big_var; // big_var eight-byte aligned 例 3-2 アセンブリコードにおける ALIGN 属性の使用 AREA LDR_LABEL, CODE, READONLY, ALIGN=3 ; align on eight-byte boundary ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 3-11 基本リンカ機能 3.3 最適化と修正 armlink は、重複セクションを削除するために最適化と修正を何度か実行し、ARM コー ドと Thumb コード間のインタワーキングを可能にして長分岐を実現します。 3.3.1 共通デバッグセクションの削除 コンパイラとアセンブラは、コンパイル単位である各ソースファイルにつき、1 つのデ バッグセクションセットを生成します。armlink は、特定ソースファイルのデバッグセ クションのコピーを複数検出し、最終イメージには 1 つのコピーだけを残して、その 他全てのコピーを破棄します。これにより、イメージのデバッグサイズを大幅に縮小 することができます。 3.3.2 共通セクションの削除 ソース内にインライン関数またはテンプレートが使用されている場合、ARM C++ コン パイラはインライン関数およびテンプレート関数の独立した複数のコピーを保持する ように、オブジェクトを生成します。共通ヘッダファイル内で宣言されている場合、こ れらの関数はその後リンクする個々のオブジェクト内で何度も定義される可能性があ ります。重複を削除するため、コンパイラはこれらの関数を共通コードセクションの armlink は各共通コードセクションの 1 つのコピー 別々のインスタンスにコンパイルし、 だけを保持します。 共通コードセクションの個々のインスタンスが同一でない場合もあります。例えば、こ れらのコピーのいくつかは、異なる(ただし互換性のある)ビルドオプション、最適 化オプション、あるいはデバッグオプションを使用してビルドされたライブラリ内で 検出される場合があります。 コピーが同一でない場合、armlink は入力オブジェクトの属性に基づき、各共通コード セクションの最も可用性の高い部分を一つにして保持します。 3.3.3 未使用セクションの削除 未使用セクションの削除によって、一度も実行されないコード、またはそのコードに よって参照されないデータが最終イメージから削除されます。この最適化は、 -(no)remove、-first、-last、-keep のリンカオプションを使用して制御するこ とができます。-info unused リンカオプションを使用すると、削除された未使用セ クションのリストを生成するようにリンカに指示することができます。 3-12 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 基本リンカ機能 入力セクションは以下の条件で最終イメージに保持されます。 • エントリポイントが含まれている場合 • エントリポイントを含む入力セクションからの非弱な参照によって、直接的また は間接的に参照される場合 • -first オプションまたは -last オプション(あるいはこれと同じ分散ローディ ング機能)を使用して、最初または最後の入力セクションが指定されている場合 • -keep オプションによって削除不可とマーキングされている場合 3.3.4 ベニアの生成 armlink は、以下の場合にベニアを生成する必要があります。 • 分岐によって ARM 状態と Thumb 状態が変更される場合 • 分岐のデスティネーションが、現在の状態の分岐範囲外にある場合 ベニアは、分岐範囲を拡大してプロセッサ状態を変更することができます。armlink は、 長分岐と状態変更を結合します。インタワーキングベニアも全て長分岐ベニアです。 以下のベニアタイプは、それぞれ異なる分岐要件を満たします。必要に応じ、リンカ は位置独立なベニアを生成します。 ARM → ARM 長分岐 ARM → Thumb 長分岐とインターワーキング Thumb → ARM 長分岐とインタワーキング Thumb → Thumb 長分岐 armlink は、各ベニアに対して Veneer$$Code と呼ばれる 1 つの入力セクションを作 成します。ベニアは、要件を満たせる既存のベニアが存在しない場合に初めて生成さ れます。2 つの入力セクションに同一デスティネーションへの長分岐が含まれていると き、1 つのベニアに両方のセクションから到達できる場合には、1 つのベニアだけが生 成されます。 1 つの入力セクションにベニアを収集する場合には、それによって生成されるベニア入 力セクションが他の入力セクションの範囲内に収まらない可能性があるため、全ての ベニアを収集することはできません。これらのセクションがアドレシング範囲内にな い場合、長分岐は不可能です。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 3-13 基本リンカ機能 3.4 コマンドラインオプションを使用した単純イメージの作成 単純イメージは、RO、RW、ならびに ZI タイプの多数の入力セクションから構成され ます。これらの入力セクションが照合されることにより、RO、RW、ZI の各出力セク ションが形成されます。ロード領域と実行領域における出力セクションの配置により、 単純イメージには以下の 3 つの基本タイプがあります。 タイプ 1 ロードビューには 1 つの領域、実行ビューには 3 つの連続領域が存在し ます。このタイプのイメージを作成する場合は -ro-base オプションを 使用します。 タイプ 2 ロードビューには 1 つの領域、実行ビューには 3 つの不連続領域が存在 します。このタイプのイメージを作成する場合は、-ro-base および -rw-base オプションを使用します。 タイプ 3 ロードビューには 2 つの領域、実行ビューには 3 つの不連続領域が存在 します。このタイプのイメージを作成する場合は、-ro-base、 -rw-base、-split の 3 つのオプションを使用します。 単純イメージのどのタイプの場合にも、使用できる実行領域は 3 つまでです。 • 最初の実行領域には RO 出力セクションが含まれます。 • 2 番目の実行領域には RW 出力セクションが含まれます(存在する場合)。 • 3 番目の実行領域には ZI 出力セクションが含まれます(存在する場合)。 これらの実行領域は、RO、RW ならびに ZI 実行領域と呼びます。 単純イメージは分散ローディングファイルを使用して作成することも可能です。分散 ローディングファイルの詳細については、P. 5-28「等価な分散ローディング記述を使用 した単純イメージの生成」を参照して下さい。 3.4.1 タイプ 1:単一ロード領域と連続出力領域 :単一ロード領域と連続出力領域 このタイプのイメージはロードビュー内の 1 つのロード領域から構成され、その 3 つ の実行領域はメモリマップ内に隣接して配置されます。この方法は、OS ブートローダ、 Angel、デスクトップシステムなど、RAM にプログラムをロードするシステムに適し ています(P. 3-15 図 3-3 参照)。 3-14 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 基本リンカ機能 図 3-3 タイプ 1 ロードビュー 単一のロード領域は、隣接して配置された RO および RW 出力セクションから構成さ れます。ロード時には ZI 出力セクションは存在しません。ZI 出力セクションは、実行 前にイメージファイル内の出力セクションの記述を使用して作成されます。 実行ビュー RO、RW、ZI の各出力セクションを含む 3 つの実行領域は隣接して配置されます。RO および RW 実行領域の実行アドレスはロードアドレスと同じであるため、ロードアド レスから実行アドレスに移動させる必要のあるものはありません。しかし、ZI 出力セ クションを含む ZI 実行領域は、実行開始前に作成されます。 RO 出力を含む領域のロード / 実行アドレスを指定するには、armlink オプション -ro-base address を使用します。このデフォルトアドレスは 0x8000 です(図 3-3 参 照)。 再配置可能イメージを作成するには、-reloc オプションを使用します。-reloc をそ れだけで使用すると、単純タイプ 1 に似たイメージが生成されますが、その 1 つのロー ド領域に RELOC 属性が設定されます。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 3-15 基本リンカ機能 3.4.2 タイプ 2:単一ロード領域と不連続出力領域 :単一ロード領域と不連続出力領域 このタイプのイメージは 1 つのロード領域で構成され、実行ビューでは 3 つの実行領 域から構成されます。RW 実行領域と RO 実行領域は隣接していません。この方法は、 ROM ベースの組み込みシステムなどに使用できます(図 3-4 参照)。 図 3-4 タイプ 2 ロードビュー ロードビューでは、ROM などに連続で配置された RO および RW 出力セクションが 1 つのロード領域を構成します。ロード時には ZI 出力セクションは存在しません。ZI 出 力セクションは、実行前にイメージファイル内の出力セクションの記述を使用して作 成されます。 実行ビュー 実行ビューでは、最初の実行領域に RO 出力セクションが、2 番目の実行領域に RW お よび ZI 出力セクションが含まれます。 RO 出力セクションを含む領域の実行アドレスはそのロードアドレスと同じであるた め、RO 出力セクションを移動させる必要はありません。 3-16 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 基本リンカ機能 RW 出力セクションを含む領域の実行アドレスはそのロードアドレスと異なるため、 RW 出力セクションはロードアドレスから(単一ロード領域から)実行アドレスに(2 番目の実行領域に)移動されます。ZI 実行領域とその出力セクションは、RW 実行領 域に隣接して配置されます。 RO 出力セクションのロード / 実行アドレスを指定するには armlink オプション -ro-base addressを、RW出力セクションの実行アドレスを指定するには-rw-base exec_address を使用します。-ro-base オプションで実行アドレスが指定されてい ない場合、armlink はデフォルト値の 0x8000 を使用します。組み込みシステムの場合、 -ro-base には 0x0 を指定するのが一般的です。-rw-base オプションで実行アドレス が指定されていない場合、デフォルトで RW は RO の直ぐ上に配置されます。 3.4.3 タイプ 3: :2 ロード領域と不連続出力領域 このタイプのイメージはタイプ 2 のイメージと似ていますが、ここではタイプ 2 の 1 つ のロード領域が 2 つのロード領域に分割されます(図 3-5)。 図 3-5 タイプ 3 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 3-17 基本リンカ機能 ロードビュー ロードビューでは、最初のロード領域が RO 出力セクションから構成され、2 番目の ロード領域が RW 出力セクションから構成されます。ロード時には ZI 出力セクション は存在しません。ZI 出力セクションは、実行前にイメージファイル内の出力セクショ ンの記述を使用して作成されます。 実行ビュー 実行ビューでは、最初の実行領域に RO 出力セクションが、2 番目の実行領域に RW お よび ZI 出力セクションが含まれます。 RO 領域の実行アドレスはそのロードアドレスと同じであるため、RO 出力セクション の内容がロードアドレスから実行アドレスに移動されることはありません。 RW 領域の実行アドレスもロードアドレスと同じであるため、RW 出力セクションの内 容はロードアドレスから実行アドレスに移動されません。しかし、ZI 出力セクション は実行開始前に作成され、RW 領域の後に配置されます。 ロード / 実行アドレスは以下のリンカオプションを使用して指定することができます。 -reloc -reloc -splitの組み合わせを使用すると単純タイプ3と同様のイメー ジが作成されますが、2 つのロード領域に RELOC 属性が設定されます。 -split このオプションは、-ro-base と -rw-base を使用して 2 つの領域を 別々に配置できるように、デフォルトの 1 つのロード領域(RO 出力セ クションと RW 出力セクションを含む領域)を 2 つのロード領域(一方 が RO 出力セクションを、他方が RW 出力セクションを含む)に分割し ます。 -ro-base address RO セクションを含む領域のロード / 実行アドレスに 4 バイト整列の address(例:ROM 内の先頭位置のアドレス)を設定するように armlink に指示します。-ro-base オプションを使用してこのアドレスが指定さ れていない場合、armlink はデフォルト値の 0x8000 を使用します。 -rw-base address RW 出力セクションを含む領域の実行アドレスに、4 バイト整列の address を設定するように armlink に指示します。このオプションを -split と共に使用すると、RW 領域のロードアドレスと実行アドレスの 両方が指定されます。 -splitを使用せずに-reloc -rw-baseを使用すると、 エラーが発生し ます。 3-18 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 第4章 イメージシンボルへのアクセス 本章では、armlink を使用したシンボルの参照方法について説明します。本章は以下の セクションから構成されています。 • リンカ定義シンボルへのアクセス:P. 4-2 • • • ARM DUI0151AJ-00 別のイメージに含まれるシンボルへのアクセス:P. 4-5 グローバルシンボルの隠蔽と再命名:P. 4-9 $Super$$ と $Sub$$ を使用したシンボル定義のオーバライド:P. 4-12 Copyright © 2001 ARM Limited. All rights reserved. 4-1 イメージシンボルへのアクセス 4.1 リンカ定義シンボルへのアクセス armlink が定義するいくつかのシンボルには、文字シーケンス $$ が含まれています。こ れらのシンボルと、シーケンス $$ を含む他の全ての外部名は、ARM で予約している 名前です。これらのシンボルは、領域、出力セクション、入力セクションのそれぞれ のベースアドレスと範囲を指定する目的で使用されます。 アセンブリ言語プログラムの場合、これらのシンボリックアドレスはインポートして 再配置可能アドレスとして使用することが可能であり、また C/C++ ソースコードから はを extern シンボルとして参照することができます。 注 リンカ定義シンボルは、コードがこれらを参照する場合にのみ定義されます。 4.1.1 領域関連シンボル 領域関連シンボルは、armlink がイメージを作成するときに生成されます。表 4-1 は、イ メージ内に存在する各実行領域に対して armlink が生成するシンボルを示しています。 分散ローディングを使用する場合は、記述ファイルがイメージ内の全ての実行領域を 命名し、各領域のロードアドレスと実行アドレスを定義します(第 5 章「分散ローディ ング記述ファイルの使用」参照)。 分散ローディングを使用しない場合、 リンカはregion_nameの値に以下を使用します。 • ER_RO 読み出し専用領域 • ER_RW 読み出し / 書き込み領域 • ER_ZI ゼロ初期化領域 ZI 出力セクションを含む全ての実行領域に対し、armlink は $$ZI$$ を含む追加シンボ ルを生成します。 表 4-1 領域関連リンカシンボル 4-2 シンボル 説明 Load$$region_name$$Base 領域のロードアドレス。 Image$$region_name$$Base 領域の実行アドレス。 Image$$region_name$$Length 実行領域のバイト長(4 の倍数)。 Image$$region_name$$Limit 実行領域の終わりを超えるバイトアドレス。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 イメージシンボルへのアクセス 表 4-1 領域関連リンカシンボル シンボル 説明 Image$$region_name$$ZI$$Base この領域にある ZI 出力セクションの実行アドレス。 Image$$region_name$$ZI$$Length ZI 出力セクションのバイト長(4 の倍数)。 Image$$region_name$$ZI$$Limit 実行領域に含まれる ZI 出力セクションの終わりを超 えるバイトアドレス。 注 • イメージの ZI 出力セクションは静的に生成されるのではなく、ランタイムに動 的に自動生成されます。したがって、ZI 出力セクションのロードアドレスシンボ ルはありません。 • セクション関連シンボルよりも領域関連シンボルを優先して使用することを推 奨します。 ZI 領域の上にスタックとヒープを配置する 領域関連シンボルの一般的な使用目的の 1 つに、ZI 領域のすぐ上にヒープを配置する ことが挙げられます。例 4-1 は、__user_initial_stackheap() の再ターゲッティ ング化バージョンをアセンブリ言語で作成する方法を示しています。この例では、ARM Cライブラリからデフォルトである1領域のメモリモデルを使用することを想定してい ます。詳細については、ADS コンパイラ / ライブラリガイドの __user_initial_stackheap() の項を参照して下さい。C を使用する場合の方法に ついては、ADS デベロッパガイド の「ROM へのコードの書き込み」の章にある retarget.c の説明を参照して下さい。 例 4-1 IMPORT ||Image$$region_name$$ZI$$Limit|| __user_initial_stackheap LDR r0, =||Image$$region_name$$ZI$$Limit|| MOV pc, lr ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 4-3 イメージシンボルへのアクセス 4.1.2 セクション関連シンボル 表 4-2 が示す出力セクションシンボルは、コマンドラインオプションを使用して単純イ メージを作成するときに生成されます。単純イメージには、3 つの実行領域を生成する 3 つの出力セクション(RO、RW、ZI)が含まれています。このイメージ内にある全て の入力セクションに対し、armlink は表 4-2 が示す入力シンボルを生成します。 表 4-2 セクション関連リンカシンボル シンボル セクション 説明 のタイプ Image$$RO$$Base 出力 RO 出力セクションの開始アドレス。 Image$$RO$$Limit 出力 RO出力セクションの終わりを超える最初のバイトアドレス。 Image$$RW$$Base 出力 RW 出力セクションの開始アドレス。 Image$$RW$$Limit 出力 ZI 出力セクションの終わりを超えるバイトアドレス。 (RW 領 域の終わりではなく ZI 領域の終わりを選択することによっ て、既存コードとの互換性を維持することができます。) Image$$ZI$$Base 出力 ZI 出力セクションの開始アドレス。 Image$$ZI$$Limit 出力 ZI 出力セクションの終わりを超えるバイトアドレス。 SectionName$$Base 入力 SectionName と呼ばれる連結セクションの開始アドレス。 SectionName$$Limit 入力 SectionName と呼ばれる連結セクションの終わりを超える バイトアドレス。 注 コードが入力セクションシンボルを参照する場合、イメージ内に含まれる同一名の全 ての入力セクションは、そのイメージのメモリマップ内に連続配置するものとみなさ れます。不連続メモリ上でベースシンボルと範囲シンボルを使用すると予測不能かつ 有害な結果をもたらすことが多いため、分散ローディング記述によって入力セクショ ンが不連続配置された場合には、armlink はこれをエラーと診断します。 分散ローディングファイルを使用する場合の表4-2の出力セクションシンボルは未定義 です。コードがこれらのシンボルにアクセスする場合は、弱い参照として処理する必 要があります。 __user_initial_stackheap() の標準実装では、Image$$ZI$$Limit の値を使用 します。したがって、分散ローディングファイルを使用する場合には __user_initial_stackheap() を再実装し、ヒープとスタックの境界を設定する必 要があります。ADS コンパイラ / ライブラリガイドのライブラリメモリモデル関連セク ションと、P. 4-2「領域関連シンボル」を参照して下さい。 4-4 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 イメージシンボルへのアクセス 4.2 別のイメージに含まれるシンボルへのアクセス シンボル定義(symdefs)ファイルを使用することにより、あるイメージに別のイメー ジに含まれるグローバルシンボルの値を知らせることができます。 このファイルは、例えば、ROM に常駐する 1 つのイメージと、RAM にロードされる 複数のイメージがある場合などに使用できます。RAM にロードされるイメージは、 ROM にあるイメージのグローバル関数とグローバルデータにアクセスすることができ ます。 4.2.1 symdefs ファイルの読み出し symdefs ファイルは、コードもデータも含まない、シンボル情報だけのオブジェクト ファイルと考えられます。symdefs ファイルを読み出すには、他のオブジェクトファイ ルの場合と同様に、このファイルをファイルリストに追加します。armlink はこのファ イルを読み出し、ファイルに含まれているシンボルとそれらの値を出力シンボルテー ブルに追加します。追加されたシンボルには ABSOLUTE と GLOBAL の 2 つの属性があ ります。 部分リンクが実行されている場合は、これらのシンボルが出力オブジェクトシンボル テーブルに追加されます。完全リンクが実行されている場合は、これらのシンボルは イメージシンボルテーブルに追加されます。 ファイル内に無効な行を検出すると、armlink はエラーメッセージを生成します。行は 以下の場合に無効となります。 • 欠けている列がある場合 • いずれかの列に無効な値が含まれている場合 symdefs ファイルから抽出されるシンボルは、オブジェクトシンボルテーブルから抽出 されるシンボルと全く同じ方法で処理されます。多重シンボル定義および ARM/Thumb 同義語に関しても、同じ制約条件が適用されます。 4.2.2 symdefs ファイルの作成 symdefs ファイルを作成するには、armlink オプション -symdefs filename を使用し ます。 armlink は、正常な最終リンクステージの間に symdefs ファイルを作成します。部分リ ンクの場合と、最終リンクに失敗した場合には、symdefs ファイルは作成されません。 注 filename が存在しない場合には、全てのグローバルシンボルを含むファイルが作成さ れます。filename が存在する場合には、armlink がそのファイルに再度書き込みを行 うときに出力されるシンボルの選択に、filename の既存の内容が使用されます。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 4-5 イメージシンボルへのアクセス グローバルシンボルのサブセットの出力 デフォルトでは、全てのグローバルシンボルが symdefs ファイルに書き込まれます。 filename が存在する場合、armlink はその内容を使用して、出力をグローバルシンボル のサブセットに制限します。出力シンボルを制限するには: 1. image1 の最終リンクを行うところで -symdefs filename を指定する。armlink が symdef ファイル filename を作成します。 2. テキストエディタで filename を開き、最終リストに不要なシンボル項目を削 除し、ファイルを保存する。 3. image1 の最終リンクを行うときに -symdefs filename を指定する。 image1 を作成する 1 つ以上のオブジェクトの使用方法が変更された後でシンボ ル定義を更新する場合など、filename はいつでも編集してコメントを追加した り image1 を再リンクすることが可能です。 armlink は以下の方法で symdefs ファイルを更新します。 1. armlink が一時出力ファイルを作成する。 2. filename に含まれている行が処理される。 a. コメント行と空白行が、そのまま変更されずに一時ファイルにコピーされ る。 b. filename 内でシンボル名が検出されると、現在のイメージに含まれる命 名済みシンボルの定義が一時ファイルに出力されます。 注 1 つのシンボルが filename 内に複数回出現する場合、そのシンボルの 1 つの定義だけが一時ファイルに出力されます。 filename 内で検出されたシンボルが現在のイメージ内で定義されていな い場合、そのシンボルに関する出力は生成されません。 3. 4-6 最終リンクに成功すると filename が削除され、一時ファイルが filename と 再命名される。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 イメージシンボルへのアクセス 4.2.3 Symdefs ファイルの形式 symdefs ファイルは、シンボルとその値を含む、1 つのタイプのオブジェクトファイル です。しかし他のオブジェクトファイルとは異なり、このファイルにはコードもデー タも含まれていません。 symdefs ファイルは、識別行、任意のコメント、シンボル情報から構成されます(例 4-2 参照)。 例 4-2 #<SYMDEFS># ARM Linker, ADS1.2 [Build 776]: Last Updated: Tue Jul 24 13:56:35 2001 ;value type name, this is an added comment 0x00001000 A function1 0x00002000 T function2 # This is also a comment, blank lines are ignored 0x00003300 A function3 0x00003340 D table1 識別ストリング テキストファイル内の最初の 11 文字が #<SYMDEFS># である場合、armlink はそのファ イルを symdefs ファイルとして認識します。 識別ストリングの後には、リンカのバージョン情報と、symdefs ファイルが一番最近更 新された日付と時刻が続きます。バージョン情報と更新情報は、識別ストリングの一 部ではありません。 コメント コメントは、テキストエディタを使用して手動で挿入できます。コメントには以下の プロパティがあります。 ARM DUI0151AJ-00 • 最初の非空白文字が ; または # である行は全てコメントです。 • 先頭行は必ず特殊識別コメント #<SYMDEFS># で開始します。このコメントは ファイル作成時に armlink が挿入するもので、ユーザが削除してはなりません。 • 最初の非空白文字の後に ; または # がある場合はコメントとみなされません。 • 空白行は無視されますが、読みやすくする目的で挿入することも可能です。 Copyright © 2001 ARM Limited. All rights reserved. 4-7 イメージシンボルへのアクセス シンボル情報 シンボル情報はシンボルのアドレス、タイプ、名前で構成され、1 行に記述されます。 シンボルの値 armlink はシンボルの絶対アドレスを固定 16 進形式(例: 0x00004000)で書き込みます。このファイルを編集する場合、 シンボルのアドレス値には 16 進形式または 10 進形式のどちらで も使用することができます。 タイプフラグ 以下の各文字はそれぞれのタイプを表します。 シンボル名 4-8 A ARM コード T Thumb コード D データ シンボルの名前 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 イメージシンボルへのアクセス 4.3 グローバルシンボルの隠蔽と再命名 このセクションでは、ステアリングファイルを使用して、出力ファイル内のグローバ ルシンボルを隠蔽または再命名する方法を説明します。例えば、ステアリングファイ ルは知的所有権の保護やネーム空間のクラッシュの回避に使用することができます。 ステアリングファイルは、出力オブジェクトのシンボルテーブルを編集するコマンド セットを含んだテキストファイルです。 ステアリングファイルを指定するには、armlink コマンドラインオプション -edit filename を使用します(P. 2-8「armlink のコマンド構文」の -edit オプションの説明 を参照して下さい)。 サポートされているコマンドは以下の 3 つです。 4.3.1 • RENAME:P. 4-10 • HIDE:P. 4-11 • SHOW:P. 4-11 ステアリングファイルの形式 ステアリングファイルは、以下の形式のプレーンテキストファイルです。 • 最初の非空白文字がセミコロン(;)またはハッシュ(#)文字である行がコメン トとして解釈されます。コメントは空白行として処理されます。 • 空白行は無視されます。 • 空白ではない非コメント行は、コマンドまたは連続する非空白行に分割されたコ マンドの一部です。 • 最後の非空白文字がカンマ(,)で終わるコマンド行は、次の非空白行に続きます。 各コマンドは、コマンドとそれに続く 1 つ以上のカンマで区切られたオペランドグルー プで構成されます。そのコマンドによって、各オペランドグループは 1 つまたは 2 つ のオペランドから構成されます。コマンドは、そのコマンド内の各オペランドグルー プに適用されます。この場合には以下の規則が適用されます。 • コマンドの大文字・小文字は区別されませんが、一般的には大文字で表示され ます。 • オペランドは大文字・小文字が区別されるシンボル名とのマッチングを行う必要 があるため、大文字・小文字が区別されます。オペランドにはワイルドカード文 字を使用することができます。 コマンドはグローバルシンボルだけに適用されます。ローカルシンボルや STT_FILE などの他のシンボルは影響を受けません。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 4-9 イメージシンボルへのアクセス 4.3.2 ステアリングファイルコマンド 以下のステアリングファイルコマンドによって、シンボルテーブルに含まれるシンボ ルの再命名、隠蔽、表示を行うことができます。 RENAME RENAME コマンドは、定義済みの、または未定義のグローバルシンボル名を再命名し ます。 構文 RENAME pattern AS replacement_pattern [,pattern AS replacement_pattern]* 上記において: pattern 0 個以上のグローバルシンボルに一致し、ワイルドカード文字を含める ことのできるストリングです。pattern がどのグローバルシンボルにも 一致しない場合、リンカはそのコマンドを無視します。このオペランド は、定義済みシンボルと未定義シンボルのどちらにも一致させることが できます。 replacement_pattern ワイルドカード文字を含めることのできるストリングであり、このスト リングのシンボルが再命名されます。ワイルドカードを使用する場合は、 pattern 内に対応するワイルドカードが存在していなければなりませ ん。pattern のワイルドカードに一致する文字が、 replacement_pattern のワイルドカードに置き換わります。 例えば、func1 と命名されたシンボルの場合: RENAME f* AS my_f* によって、func1 は my_func1 と再命名されます。 用法 ターゲットシンボルの名前がそれ自体で再命名される場合でも、あるシンボルに既に 存在しているシンボル名を付けることはできません。RENAME コマンドでは、ワイルド カード文字は 1 文字しか(* または ?)使用できません。 armlink は置換を行う前にステアリングファイルを処理します。したがって、1 行目で RENAME A AS B を使用し、2 行目で RENAME B AS A を使用することはできません。 4-10 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 イメージシンボルへのアクセス HIDE HIDEコマンドは、シンボルテーブル内の定義済みグローバルシンボルを匿名にします。 構文 HIDE pattern [,pattern]* 上記において: pattern 0 個以上の定義済みグローバルシンボルに一致し、ワイルドカード文字 を含めることのできるストリングです。pattern がどの定義済みグロー バルシンボルにも一致しない場合、リンカはそのコマンドを無視します。 未定義シンボルを隠蔽することはできません。 SHOW SHOWコマンドは、それまでHIDEコマンドで隠蔽されていたグローバルシンボルを認識 可能にします。このコマンドは、HIDE コマンドにワイルドカードを使用した特定シン ボルの隠蔽を解除したい場合に便利です。 構文 SHOW pattern [,pattern]* 上記において: pattern ARM DUI0151AJ-00 0 個以上のグローバルシンボルに一致し、ワイルドカード文字を含める ことのできるストリングです。pattern がどのグローバルシンボルにも 一致しない場合、リンカはそのコマンドを無視します。 Copyright © 2001 ARM Limited. All rights reserved. 4-11 イメージシンボルへのアクセス 4.4 $Super$$ と $Sub$$ を使用したシンボル定義のオーバライド 外部ライブラリや ROM コード内に存在しているなどの理由で、既存のシンボルを修正 できない場合があります。 このような場合には、$Super$$ と $Sub$$ のパタンを使用して既存のシンボルをパッ チします。例えば、関数 foo() の定義をパッチするには、$Sub$$foo() と $Super$$foo() を使用します。 $Sub$$foo 元関数 foo() の代わりに呼び出される新しい関数を識別します。このパ タンを使用して、元関数の前処理または後処理を追加します。 $Super$$foo パッチされていない元関数 foo() を識別します。元関数はこのパタンを 使用して直接呼び出すことができます。 例 4-3 は、ExtraFunc() への呼び出しと foo() への呼び出しを行うように修正され た従来の関数 foo() を示しています。詳細については、pdf\specs ディレクトリ内 の ARMELF.pdf に保存されている文書を参照して下さい。 例 4-3 extern void ExtraFunc(void); extern void $Super$$foo(void): /* this function will be linked instead of the original foo() */ void $Sub$$foo(void) { ExtraFunc(); /* does some extra setup work */ $Super$$foo(); /* calls the original foo function */ } 4-12 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 第5章 分散ローディング記述ファイルの使用 本章では、armlink と分散ローディング記述ファイルを使用した複雑イメージの作成方 法を説明します。本章は以下のセクションから構成されています。 • 分散ローディングについて:P. 5-2 • • ARM DUI0151AJ-00 分散ローディング記述ファイルの形式構文:P. 5-7 等価な分散ローディング記述を使用した単純イメージの生成:P. 5-28 Copyright © 2001 ARM Limited. All rights reserved. 5-1 分散ローディング記述ファイルの使用 5.1 分散ローディングについて イメージは領域と出力セクションから構成されます。イメージに含まれる各領域の ロードアドレスと実行アドレスは異なっていても構いません(P. 3-2「イメージ構造の 指定」参照)。 分散ローディング機能を使用することにより、イメージのメモリマップを armlink に指 定することができます。分散ローディングでは、イメージコンポーネントのグループ 化と配置を全て制御することができます。これにより、ロード時と実行時にメモリマッ プ内で分散する複数領域から構成される複雑イメージのマップを記述することができ ます。分散ローディンは単純イメージ(P. 5-5 図 5-2 参照)にも使用できますが、メモ リマップが複雑なイメージのみに使用されるのが一般的です(P. 5-6 図 5-4 参照)。 イメージのメモリマップを構成するには、armlink に以下に関する情報を与える必要が あります。 • 入力セクションを領域にグループ化する方法を記述したグループ化情報 • メモリマップ内にイメージ領域を配置するアドレスを記述した配置情報 これらの情報は分散ローディング記述を使用して、armlink に渡されるテキストファイ ル内に指定されます。 5.1.1 分散ローディング用に定義されたシンボル armlink は分散ローディング記述を使用してイメージを作成するときに、いくつかの領 域関連シンボルを作成します。これらのシンボルについては、P. 4-2「領域関連シンボ ル」を参照して下さい。これらの特殊シンボルは、コードが参照している場合にのみ armlink によって作成されます。 注意 分散ローディング記述ファイルが使用されていない場合、 シンボルImage$$RW$$Base、 Image$$RW$$Limit、Image$$RO$$Base、Image$$RO$$Limit、Image$$ZI$$Base、 Image$$ZI$$Limit は定義されません。 デフォルトの実装では Image$$ZI$$Limit を使用しているため、 __user_initial_stackheap() を再実装してヒープ領域の開始位置とスタック領 域の最上位を示す値を定義する必要があります。詳細については、ADS コンパイラ / ラ イブラリガイドの「ライブラリメモリモデル」のセクションと、ADS デベロッパガイ ドの「ROM へのコードの書き込み」のセクションを参照して下さい。 __user_initial_stackheap() を再実装しないと、リンカによって以下のエラーメッ セージが表示されます。 Undefined symbol Image$$ZI$$Limit (referred from sys_stackheap.o). 5-2 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 5.1.2 分散ローディングはいつ使用すべきか リンカへのコマンドラインオプションを使用すればデータとコードの配置をある程度 制御することができますが、配置を完全に制御するには、コマンドラインから入力可 能な指示よりもさらに詳細な指示を必要とします。以下に、分散ローディング記述を 必要とする(あるいはその方が非常に有効である)ケースを挙げます。 メモリマップが複雑な場合 数多くの異なるメモリエリアに配置しなければならないコードとデータ には、どのセクションをどのメモリ空間に配置するかを定義した詳細な 指示が必要となります。 メモリタイプが異なる場合 多くのシステムには、フラッシュ、ROM、SDRAM、高速 SRAM が組み 込まれています。分散ローディング記述を使用することにより、コード とデータを最も適切なメモリタイプにマッチングさせることができま す。例えば、割り込みコードは高速 SRAM に配置して割り込み応答時間 を向上させ、あまり使用されないコンフィギュレーション情報はそれよ りも遅いフラッシュメモリに配置するといったことが考えられます。 メモリマップ I/O を使用する場合 分散ローディング記述を使用して、データセクションをメモリマップ内 の厳密なアドレスに配置することができます。 関数の位置を固定する場合 周辺アプリケーションが修正され、再コンパイルされた場合でも、関数 はメモリ内の同じ位置に配置しておくことができます。 ヒープとスタックの識別にシンボルを使用する場合 ヒープとスタックの位置を示すシンボルを定義し、そこに内包されるモ ジュールの位置はアプリケーションのリンク時に指定することができ ます。 このように、組み込みシステムでは ROM、RAM、メモリマップ I/O が使用されるため、 これらの実行にはほとんどの場合に分散ローディングが必要となります。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-3 分散ローディング記述ファイルの使用 5.1.3 コマンドラインオプション 以下は、分散ローディングに使用する armlink コマンドラインオプションです。 -scatter description_file_name このコマンドは、description_file_name に記述されている通りにメモリマップを 構成するよう、armlink に指示します。記述ファイルの形式については、P. 5-7「分散 ローディング記述ファイルの形式構文」を参照して下さい。 分散ローディング記述ファイルの詳細については、以下を参照して下さい。 • 例:領域アドレスとセクションアドレスの指定:P. 5-22 • • 5.1.4 等価な分散ローディング記述を使用した単純イメージの生成:P. 5-28 ADS デベロッパガイドの「ROM へのコードの書き込み」の説明 メモリマップが単純なイメージ 図 5-1 が示す分散ローディング記述は、オブジェクトファイルからのセグメントを、 P. 5-5 図 5-2 のマップに対応するメモリにロードします。この領域の最大サイズは特に 指定する必要はありませんが、指定しておけば領域が境界をオーバフローしていない かどうかをリンカにチェックさせることができます。 図 5-1 単純なファイルの内容 5-4 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 図 5-2 メモリマップ リンカへのコマンドラインオプションで -ro-base 0x0 および -rw-base 0x10000 を指定しても、これと同じ結果が得られます。 5.1.5 メモリマップが複雑なイメージ 図 5-3 の分散ローディング記述は、program1.o と program2.o の 2 ファイルからの セグメントを、P. 5-6 図 5-4 のマップに対応するメモリにロードします。 図 5-3 メモリマップが複雑なファイルの内容 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-5 分散ローディング記述ファイルの使用 図 5-4 分散ロードされる複雑なメモリマップ P. 5-5 図 5-2 が示す単純なメモリマップとは異なり、このアプリケーションは基本コマ ンドラインオプションだけではリンカに指定できません。 注意 P. 5-5 図 5-3 の分散ローディング記述は、program1.o および program2.o のコード とデータの位置だけを指定します。したがって、例えば program3.o という別のモ ジュールをリンクさせるときにこの記述ファイルを使用しても、program3.o のコー ドとデータの位置は指定されません。 コードとデータの配置をよほど厳密に行うのでない限り、残ったコードとデータの配 置には、指定子 * または .ANY の使用を推奨します(P. 5-24「固定アドレスへの領域の 配置」参照)。 5-6 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 5.2 分散ローディング記述ファイルの形式構文 分散ローディング記述ファイルは、ターゲット組み込み製品のメモリマップを armlink に通知するテキストファイルです。armlink をコマンドラインから使用する場合には、 この記述ファイルのファイル拡張子に意味はありません。しかし、CodeWarrior IDE を 使用する場合は、記述ファイルのデフォルト拡張子に .scf が使用されます。(たとえ この拡張子を変更しても、CodeWarrior IDE は分散ローディングファイルとして認識し ます。)分散ローディング記述ファイルを使用すると、以下を指定することができます。 • 各ロード領域のロードアドレスおよび最大サイズ • 各ロード領域の属性 • 各ロード領域から導出される実行領域 • 各実行領域の実行アドレスおよび最大サイズ • 各実行領域の入力セクション 記述ファイルの形式には、ロード領域、実行領域、入力セクションの階層が反映され ます。 注 領域に対する入力セクションの割り当ては、選択パタンが分散ローディング記述ファ イルに書き込まれる順序と全く関係ありません。選択パタンと、ファイル / セクション の名前またはセクション属性との間で最適な組み合わせが使用されます。P. 5-18「多重 一致の解決」を参照して下さい。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-7 分散ローディング記述ファイルの使用 5.2.1 BNF の表記と構文 表 5-1 は、形式言語の記述に使用する BNF シンボルを示しています。 表 5-1 BNF 構文 シンボル 説明 " クオテーションマークは、通常は BNF 構文の一部である文字が定義の 中でリテラル文字として使用されることを示す場合に使用します。 例えば、定義 B"+"C はパタン B+C によってのみ置き換えることがで きます。定義 B+C は、パタン BC、BBC、BBBC のいずれかに置き換え られます。 A ::= B A を B として定義します。例えば、A::= B"+" | C は、A が B+ また は C のどちらかと等価であることを意味します。 ::= 表記は、そのコンポーネントにおいて上位レベルの構成を定義す るために使用します。また各コンポーネントには、さらに単純なコン ポーネントの上位レベルの構成を定義する ::= 定義を使用することも 可能です。 例えば、A::= B および B::= C | D は、定義 A がパタン C または D と等価であることを意味します。 [A] 任意のエレメント A を示します。例えば、A::= B[C]D は定義 A を BD または BCD に拡大可能であることを意味します。 A+ エレメント A が 1 個以上出現することを意味します。例えば、A::= B+ は、定義 A を B、BB、BBB のいずれかに拡大できることを示します。 A* エレメント A が 0 個以上出現することを意味します。 A|B 出現するのはエレメント A または B のどちらかであり、両方ではない ことを意味します。 (A B) エレメント A および B が一緒にグループ化されることを意味します。 このシンボルは、| 演算子を使用するとき、あるいは複雑なパタンを繰 り返すときに使用すると便利です。 例えば、A::=(B C)+ (D | E) は、定義 A が BCD、BCE、BCBCD、 BCBCE、BCBCBCD、BCBCBCE のいずれかに拡大可能であることを意味 します。 5-8 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 5.2.2 分散ローディング記述ファイルに使用する構文の概要 このセクションで説明する BNF の定義では、読みやすくするために改行とスペースを 入れています。分散ローディングの定義に改行とスペースを入れる必要はなく、たと えファイル内に存在していても無視されます。 scatter_descriptionは、1つ以上のload_region_descriptionパタンと定義さ れます。 Scatter_description ::= load_region_description+ load_region_description はロード領域の名前として定義され、この後に任意の属 性指定子またはサイズ指定子、ならびに 1 つ以上の実行領域の記述が続きます。 load_region_description ::= load_region_name (base_address | ("+" offset)) [attributes] [max_size] "{" execution_region_description+ "}" execution_region_description は、実行領域名、ベースアドレス指定、任意の属 性指定子またはサイズ指定子、ならびに 1 つ以上の入力セクションの記述として定義 されます。 execution_region_description ::= execution_region_name (base_address | "+ " offset) [attributes] [max_size] "{" input_section_description+ "}" input_section_description は、ソースモジュールセレクタパタンとそれに続く 任意の入力セクションセレクタして定義されます。 input_section_description ::= module_select_pattern [ "(" ("+" input_section_attr | input_section_pattern) ([","] "+" input_section_attr | "," input_section_pattern))* ")" ] ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-9 分散ローディング記述ファイルの使用 図 5-5 は、典型的な分散ローディング記述ファイルの内容と構成を示しています。 図 5-5 分散ローディングファイル定義のコンポーネント 5-10 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 5.2.3 ロード領域の記述 ロード領域は以下で構成されます。 • 名前(リンカはこの名前を使用して数あるロード領域を識別します。) • ベースアドレス(ロードビューにおけるコードとデータの開始アドレスです。) • 属性(オプション) • 最大サイズ(オプション) • 実行領域リスト(実行ビューにおけるモジュールのタイプと位置を識別します。) 図 5-6 は、典型的なロード領域の記述に含まれるコンポーネントを示しています。 図 5-6 ロード領域の記述に含まれるコンポーネント 以下は BNF における構文です。 load_region_description ::= load_region_name (base_address | ("+" offset)) [attribute_list] [ max_size ] "{" execution_region_description+ "}" 上記において: load_region_name ロード領域を命名します。先頭 31 文字だけが有意です。この名 前 は 各 領 域 の 識 別 の み に 使 用 さ れ ま す。exec_region_name (P. 5-13)とは異なり、load_region_name は Load$$region_name シンボルの生成には使用されません。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-11 分散ローディング記述ファイルの使用 注 デバッガは領域をロードアドレスにロードする必要があるため、 デバッガに使用する目的で作成されるイメージには各領域に固有 のベースアドレスが必要となります。ロード領域アドレスがオー バラップしていると、そのイメージの一部が上書きされます。 しかし、ローダまたはオペレーティングシステムは、オーバラッ プしている位置独立領域を正しくロードすることができます。1 つ 以上の位置独立領域が異なるアドレスに自動的に移動されます。 base_address 領域内のオブジェクトをリンクさせるアドレスです。 base_address にはワード境界整列の数値を指定する必要があ ります。 +offset 先行ロード領域の終わりを offset バイト分だけ超えたベースア ドレスを示します。offset には 4 で割った余りが 0 になる値を 指定する必要があります。これが最初のロード領域である場合、 +offset はベースアドレス 0 から offset バイトずれた位置で開 始することを意味します。 attribute_list ロード領域の内容のプロパティを指定します。 PI 位置独立 RELOC 再配置可能 OVERLAY オーバレイ ABSOLUTE 絶対アドレス 属性は上記の中から 1 つだけを指定することができます。デフォ ルトのロード領域属性は ABSOLUTE です。 PI、RELOC、OVERLAY のいずれかの属性を持つロード領域のアド レス範囲はオーバラップさせることができます。ABSOLUTE ロー ド領域のアドレス範囲がオーバラップしていると、armlink はエ ラーを生成します。 OVERLAY キーワードを使用することにより、同一アドレス上に複 数の実行領域を配置することができます。ADS にはオーバレイ機 能はありません。したがって同一アドレス上に複数の実行領域を 配置するには、専用のオーバレイマネージャを使用する必要があ ります。 max_size ロード領域の最大サイズを指定します。(任意の max_size の値 が指定されている場合、その領域に複数の max_size バイトが割 り当てられていると、armlink はエラーを生成します。) execution_region_description 実行領域の名前、アドレス、内容を指定します(P. 5-13「実行領 域の記述」参照)。 5-12 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 5.2.4 実行領域の記述 実行領域は以下で構成されます。 • 名前 • ベースアドレス(絶対または相対) • 任意の最大サイズの指定 • 実行領域のプロパティを指定する属性 • 1 つ以上の入力セクションの記述(対象実行領域に配置されるモジュール) 図 5-7 は、典型的な実行領域の記述に含まれるコンポーネントを示しています。 図 5-7 実行領域の記述に含まれるコンポーネント 以下は BNF を使用した実行領域記述構文を示しています。 execution_region_description ::= exec_region_name (base_address | "+" offset) [attribute_list] [max_size] "{" input_section_description+ "}" 上記において: exec_region_name 実行領域を命名します。(先頭 31 文字だけが有意です。) base_address 領域内のオブジェクトをリンクさせるアドレスです。 base_address はワード境界で整列させる必要があります。 +offset 先行の実行領域の終わりを offset バイト超えたベースアドレス を記述します。offset には 4 で割った余りが 0 になる値を指定 する必要があります。 先行の実行領域が存在しない場合(つまり、これがロード領域内 の最初の実行領域である場合)、+offset は実行領域のベースア ドレスが、それを含むロード領域のベースから offset バイトず れた位置から開始することを意味します。 * ベース指定子(base_designator)は下記の部分を指します。 (base_address | "+" offset) ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-13 分散ローディング記述ファイルの使用 +offset形式が使用され、それを含むロード領域にRELOC 属性が 設定されている場合、実行領域はこの RELOC 属性を継承します。 しかし、固定 base_address が使用されていると、それ以後に 出現する offset は RELOC 属性を継承しません。 attribute_list 実行領域の内容のプロパティを指定します。 PI 位置独立 OVERLAY オーバレイ ABSOLUTE 絶対アドレス。領域の実行アドレスはベース 指定子によって指定されます。 FIXED 固定アドレス。対象領域のロードアドレスと 実行アドレスの両方がベース指定子によっ て指定されます(この領域はルート領域で す。P. 5-22「ルート実行領域の作成」を参照 して下さい)。ベース指定子には絶対ベース アドレス、あるいは +0 のオフセットを指定 する必要があります。 UNINIT 未初期化データ 属性には、PI、OVERLAY、FIXED、ABSOLUTE のいずれか 1 つを 指定することができます。PI、FIXED、OVERLAY のいずれかが 指定されていない限り、実行領域のデフォルト属性には ABSOLUTE が使用されます。 +offset 形式のベース指定子を使用する実行領域は、その前の実 行領域(あるいは、その領域がロード領域内の最初の実行領域で ある場合には、それを含んでいるロード領域)の属性を継承する か、ABSOLUTE 属性を持ちます。 実行領域に属性 RELOC を明示的に指定することはできません。実 行領域は、前の実行領域または親領域の属性を継承する場合にの み RELOC 属性を持つことができます。 +offset 形式のベース指定子を使用する実行領域がそれ自身の 属性を持つことはできません(ただし、継承をオーバライドする ABSOLUTE 属性は除きます)。開始位置を変更せずに領域に ABSOLUTE を設定するには、+0 ABSOLUTE の組み合わせを使用し ます。 PI または OVERLAY が指定された(あるいは RELOC 属性を継承し た)実行領域は、オーバラップしたアドレス範囲を持つことがで きます。ABSOLUTE または FIXED が設定された実行領域のアドレ armlink はエラーを生成します。 ス範囲がオーバラップしていると、 UNINIT は、実行領域内に ZI 出力セクションが存在している場合 に、その ZI 出力セクションが 0 に初期化されないことを示しま す。この属性を使用することにより、未初期化データまたはメモ リマップ I/O を含む実行領域を作成することができます。 5-14 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 対象領域に複数の max_size が割り当てられている場合にはエ ラーを生成するように armlink に命令する任意の数値です。 max_size input_section_description 入力セクションの内容を指定します(「入力セクションの記述」参 照)。 5.2.5 入力セクションの記述 input_section の記述とは、以下によって入力セクションを識別するパタンを意味 します。 • モジュール名(オブジェクトファイルの名前、ライブラリメンバの名前、あるい はライブラリファイルの名前)。モジュール名にはワイルドカード文字を使用す ることができます。 • 入力セクション名、あるいは READ-ONLY や CODE などの入力セクション属性 図 5-8 は、典型的な入力セクションの記述に含まれるコンポーネントを示しています。 図 5-8 入力セクションの記述に含まれるコンポーネント 以下は BNF を使用した構文を示しています。 input_section_description ::= module_select_pattern ["(" ("+" input_section_attr | input_section_pattern) ([","] "+" input_section_attr | "," input_section_pattern))* ")"] 上記において: module_select_pattern リテラルテキストから構成されるパタンです。ワイルドカード文字 * は 0 個以上の文字と、? は任意の 1 文字とマッチングされます。 ファイル名の大文字・小文字を区別するホストでも、マッチングは大文 字・小文字の区別なく行われます。 全てのオブジェクトとマッチングさせるときは *.o を、全てのファイル およびライブラリとマッチングさせるときは * を使用します。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-15 分散ローディング記述ファイルの使用 入力セクションは、module_selector_pattern が以下のいずれか 1 つと一致するときに、module_selector_pattern と一致します。 • その入力セクションを含むオブジェクトファイルの名前 • ライブラリメンバの名前(先行パス名なし) • そのセクションが抽出されたライブラリのフルネーム(パス名を 含む)。この名前にスペースが含まれている場合には、ワイルド カードを使用して検索を簡素化することができます。例えば、 C:\lib dir\libname.libとのマッチングには*libname.lib を使用します。 特殊モジュールセレクタパタン .ANY を使用すると、入力セクションの 親モジュールを考えることなく、入力セクションを実行領域に割り当て ることができます。.ANY は、実行領域をドントケア割り当てによって 満たす場合に使用します。 注 • module_selector_pattern かつ、input_section_attr ま たは input_section_pattern のどちらかと一致する入力セク ションだけが実行領域に含まれます。 (+ input_section_attr)および(input_section_pattern) を省略した場合には、デフォルトの +RO が使用されます。 • コンパイラによって生成された、あるいは ARM ライブラリコード によって使用される入力セクション名は信頼しないで下さい。こ れらの名前は、異なるコンパイラオプションが使用される場合な どに、コンパイルの都度変更される可能性があります。また、コ ンパイラに使用されるセクション命名規則が全てのリリースで一 貫しているとは限りません。 input_section_attr 入 力 セ ク シ ョ ン 属 性 と マ ッ チ ン グ さ れ る 属 性 セ レ ク タ で す。各 input_section_attr の前には + を付けます。 入力セクション名とマッチングするパタンを指定するとき、この名前に は接頭文字 + を付ける必要があります。+ の直前にあるカンマは省略す ることが可能です。 5-16 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 セレクタの大文字・小文字は区別されません。認識されるセレクタは以 下のとおりです。 • RO-CODE • RO-DATA • RO(RO-CODE と RO-DATA の両方を選択します。) • RW-DATA • RW-CODE • RW(RW-CODE と RW-DATA の両方を選択します。) • ZI • ENTRY(ENTRY ポイントを含むセクションです。) 以下の同義語が認識されます。 • CODE:RO-CODE • CONST:RO-DATA • TEXT:RO • DATA:RW • BSS:ZI 以下の擬似属性が認識されます。 • FIRST • LAST FIRST と LAST は、配置順序が重要な場合(例えば、特定の入力セク ションを領域内の最初に配置し、チェックサムを含む入力セクションを 最後に配置しなければならない場合など)に、領域内の最初と最後のセ クションをマーキングする目的で使用することができます。FIRST また は LAST が input_section_attr として最初に出現した時点で、その リストを終了します。 特殊モジュールセレクタパタン .ANY を使用すると、入力セクションの 親モジュールを考えることなく、入力セクションを実行領域に割り当て ることができます。.ANY は、実行領域をドントケア割り当てによって 満たす場合に使用します。ほとんどの場合、1 つの .ANY を使用しても、 * モジュールセレクタを使用しても、結果は同じです。 分散ローディング記述ファイル内に 2 つの * セレクタを使用することは できません。しかしながら、例えば 2 つの修正セレクタ *A と *B を使用 することは可能であり、また .ANY セレクタを * モジュールセレクタと 組み合わせて使用することも可能です。* モジュールセレクタは .ANY よ りも優先されます。* セレクタを含むファイルの一部分が削除されると、 .ANY セレクタが有効になります。 .ANY モジュールセレクタパタンを持つ input_section_descriptions の解決は、その他全ての(非 .ANY の) 入力セクションの記述が解決され、入力セクションが完全一致に最も近 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-17 分散ローディング記述ファイルの使用 い実行領域に割り当てられてから行われます。複数の .ANY パタンが存 在するとき、リンカは可能な限り最初の .ANY を埋めてから、次の .ANY の充填を開始します。 残りの各未割り当て入力セクションは、以下の特性を持つ実行領域に割 り当てられます。 • 残りの空き空間が最大の領域(max_size 値と、既に割り当てら れている入力セクションのサイズによって決定されます。) • .ANY input_section_description に一致する領域 • メモリアクセス属性(存在する場合)が入力セクションのメモリ 属性と一致する領域 input_section_pattern 大文字・小文字の区別なく、入力セクション名とマッチングするパタン です。このパタンはリテラルテキストで構成されます。ワイルドカード 文字 * は 0 個以上の文字と、? は任意の 1 文字とマッチングされます。 5.2.6 多重一致の解決 1 つのセクションが複数の実行領域と一致するとき、それらの一致は以下のように解決 されます。一意の一致を検出できない場合、armlink はその分散ローディング記述を誤 りとみなします。各セクションは module_selector_pattern と input_section_selector によって選択されます。 module_selector_pattern の指定例: • * は全てのモジュールまたはライブラリと一致します。 • *.o は全てのオブジェクトモジュールと一致します。 • math.o は math.o モジュールと一致します。 • *math.lib は math.lib で終わる全てのライブラリパスと一致します(例: C:\apps\lib\math\satmath.lib)。 input_section_selector 指定例: • +ROは、全てのROコードと全てのROデータに一致する入力セクション属性です。 • +RW,+ZI は、全ての RW コード、全ての RW データ、全ての ZI データに一致す る入力セクション属性です。 BLOCK_42 は、BLOCK_42. と命名されたアセンブリファイルエリアに一致する 入力セクションパタンです。 • 5-18 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 注 コンパイラは、.text、.data、.constdata、.bss などの入力セクションパ タンによって識別可能なエリアを生成します。しかし、これらの名前は今後の バージョンで変更される可能性があるため、できるだけ使用しないで下さい。 CまたはC++ファイルに含まれる特定の関数または外部データをマッチングする 必要がある場合には、以下のいずれかの方法を使用して下さい。 — その関数またはデータを独立モジュールにコンパイルし、そのモジュール オブジェクト名でマッチングする。 — #pragma arm section を使用して対象コードまたはデータを含むセク ションを指定する(ADS コンパイラ / ライブラリガイドのプラグマの説明 を参照して下さい)。 多重一致の記述には以下の変数を使用します。 • m1 および m2:モジュールセレクタパタンを表します。 • s1 および s2:入力セクションセレクタを表します。 多重一致の場合、armlink は最も厳密な module_selector_pattern と input_section_selector の組み合わせに基づいて、入力セクションを割り当てる 領域を決定します。 例えば、入力セクション A が実行領域 R1 の m1,s1 と一致し、実行領域 R2 の m2,s2 と 一致する場合、armlink は以下のように割り当てを行います。 • m1,s1 が m2,s2 よりも厳密な場合は、A を R1 に割り当てます。 • m2,s2 が m1,s1 よりも厳密な場合は、A を R2 に割り当てます。 • m1,s1 が m2,s2 よりも厳密ではなく、同時に m2,s2 が m1,s1 よりも厳密ではない場 合は、その分散ローディングの記述を誤りと診断します。 armlink は以下の順序で最も厳密な module_selector_pattern、 input_section_selector 対を決定します。 1. モジュールセレクタパタンの場合: テキストストリング m1 がパタン m2 に一致し、テキストストリング m2 がパタン m1 に一致しない場合は、m1 が m2 よりも厳密であると判断します。 2. ARM DUI0151AJ-00 入力セクションセレクタの場合: • s1 と s2 の両方が同一パタンのセクション名を持つ場合には、モジュールセ レクタパタンと同じ定義が使用されます。 • s1、s2 のどちらか一方が入力セクション名と一致し、他方が入力セクショ ン属性と一致する場合には、s1 と s2 の順序付けは行われず、その記述は誤 りと診断されます。 • s1 と s2 の両方が入力セクション属性に一致する場合、s1 が s2 よりも厳密 であるかどうかの決定は、次の関係によって定義されます。 Copyright © 2001 ARM Limited. All rights reserved. 5-19 分散ローディング記述ファイルの使用 ENTRY は、RO-CODE、RO-DATA、RW-CODE、RW-DATA よりも厳密である。 RO-CODE は RO よりも厳密である。 RO-DATA は RO よりも厳密である。 RW-CODE は RW よりも厳密である。 RW-DATA は RW よりも厳密である。 セクション属性においては、上記以外に(s1 が s2 よりも厳密である)関係 を示すメンバはありません。 3. module_selector_pattern, input_section_selector 対に関して、 m1,s1 は以下が真である場合にのみ m2,s2 よりも厳密であると判断されます。 • s1 がリテラル入力セクション名(つまり、パタン文字が含まれていない名 前)であり、s2 が +ENTRY 以外の入力セクション属性と一致する。 • m1 が m2 よりも厳密である。 • s1 が s2 よりも厳密である。 このマッチング方式は以下の結果をもたらします。 5-20 • 記述がファイル内に書かれた順序に依存しない。 • 一般的に、オブジェクトの記述が厳密になればなるほど、それに含まれる入力セ クションの記述が厳密になる。 • input_section_selectors が以下の場合を除いて検査されない。 — オブジェクトの選択が確定されない。 — 一方のセレクタが入力セクションの完全な名前を指定し、他方が属性で選 択する。この場合、明示的な入力セクション名は、ENTRY 以外の、1 つの オブジェクトから 1 つの入力セクションだけを選択するどの属性よりも厳 密です。このことは、入力セクション名に関連付けられたオブジェクトセ レクタがその属性よりも厳密ではない場合にも言えます。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 例 5-1 は、複数実行領域とパタンマッチングを示しています。 例 5-1 パタンマッチング LR_1 0x040000 { ER_ROM 0x040000 { application.o (+ENTRY) } ER_RAM1 0x048000 { application.o (+RO_CODE) } ER_RAM2 0x050000 { application.o (+RO) } ER_RAM3 0x060000 { application.o (+RW) } ER_RAM4 +0 { *.o (+RO, +RW, +ZI) } } ARM DUI0151AJ-00 ; ; ; ; The startup exec region address is the same as the load address. The section containing the entry point from the object is placed here. ; Other RO code from the object goes here ; The RO data goes here ; RW code and data go here ; Follows on from end of ER_R3 ; Everything except for application.o goes here Copyright © 2001 ARM Limited. All rights reserved. 5-21 分散ローディング記述ファイルの使用 5.3 例:領域アドレスとセクションアドレスの指定 このセクションでは、分散ローディング記述ファイルを使用した以下のアドレスの指 定方法を説明します。 • ベニア • ROM 内の RO 定数 • ルート実行領域 固定アドレスにあるデータおよび関数へのアクセスについては、ADS デベロッパガイ ドの「ROM へのコードの書き込み」を参照して下さい。 5.3.1 分散ローディング記述におけるベニア入力セクションの選択 ベニアは、ARM コードと Thumb コードの切り替え、あるいは 1 つの命令で指定可能な ジャンプよりも長いプログラムジャンプの実行に使用されます(P. 3-13「ベニアの生 成」参照)。リンカが生成したベニア入力セクションの配置には、分散ローディング ファイルを使用します。分散ローディング記述ファイル内で *(Veneer$$Code) セク ションセレクタを保持できる実行領域は多くても 1 つです。 armlink は、安全な場合に限り、*(Veneer$$Code) セクションセレクタによって識別 される領域にベニア入力セクションを配置します。アドレス範囲の問題や実行領域サ イズの制限などにより、ベニア入力セクションをその領域に割り当てることができな い場合もあります。指定された領域にベニアを追加できない場合は、そのベニアを生 成した再配置後の入力セクションを含む実行領域に追加されます。 旧バージョンの ARM ツールを使用した分散ローディング記述ファイルに含まれる *(IWV$$Code) のインスタンスは、自動的に *(Veneer$$Code) に変換されます。新 しい記述では *(Veneer$$Code) を使用して下さい。 5.3.2 ルート実行領域の作成 イメージの初期エントリポイントを指定する場合、あるいは ENTRY ディレクティブが 1 つしか使用されていないためにリンカが初期エントリポイントを作成する場合には、 そのエントリポイントが必ず ルート 領域内に配置されるようにしなければなりませ ん。ルート領域とは、そのロードアドレスで実行する領域を指します。初期エントリ ポイントがルート領域内に存在しない場合はリンクが不可能となり、リンカは以下の ようなエラーメッセージを返します。 Entry point (0x00000000) lies within non-root region ER_ROM 5-22 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 分散ローディング記述ファイルにおいて、ある領域がルート領域であることを指定す るには、以下のどちらかの方法を使用することができます。 • • その実行領域の属性として、明示的に、あるいはデフォルトのままで ABSOLUTE を指定し、最初の実行領域とそれを含むロード領域に同じアドレスを使用しま す。実行領域のアドレスをロード領域のアドレスと同一にするには、以下のどち らかの方法を使用します。 — 実行領域のベース指名子(アドレス)とロード領域のベース指名子(アド レス)の両方に同一数値を指定する。 — ロード領域内の最初の実行領域に +0 オフセットを指定する。 全ての実行領域にオフセット 0(+0)を指定すると、それらの領域全てが ルート領域となります(例 5-2 参照)。 FIXED 実行領域属性を使用して、特定領域のロードアドレスと実行アドレスを同 じにします(P. 5-24 例 5-3、P. 5-24 図 5-9 参照)。 FIXED 属性を使用することにより、どの実行領域でも ROM 内の特定アドレスに配置す ることができます。詳細については、P. 5-24「固定アドレスへの領域の配置」を参照し て下さい。 例 5-2 同一ロード / 実行アドレスの指定 LR_1 0x040000 { ER_RO 0x040000 { *(+RO) ; load region starts at 0x40000 ; start of execution region descriptions ; load address = execution address ; all RO sections (must include section with ; initial entry point) } ; rest of scatter description... ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-23 分散ローディング記述ファイルの使用 例 5-3 FIXED 属性の使用 LR_1 0x040000 ; load region starts at 0x40000 { ; start of execution region descriptions ER_RO 0x040000 ; load address = execution address { *(+RO) ; RO sections other than those in init.o } ER_INIT 0x080000 FIXED ; load address and execution address of this ; execution region are fixed at 0x80000 { init.o(+RO) ; all RO sections from init.o } ; rest of scatter description... 図 5-9 固定実行領域のメモリマップ 5.3.3 固定アドレスへの領域の配置 実行領域の分散ローディング記述に FIXED 属性を使用することにより、ロードおよび 実行が固定アドレスで行われるルート領域を作成することができます。 FIXED は、1 つのロード領域内(一般的には単一 ROM デバイス内)に複数のルート領域 を作成するために使用します。例えば、この属性を使用することで定数テーブルや チェックサムなどの関数またはデータブロックをROM内の固定アドレスに配置できる ため、ポインタから容易にアクセスすることが可能となります。 例えば、何らかの初期化コードを ROM の開始位置に配置し、チェックサムを ROM の 終わりに配置するように指定した場合には、メモリ内容の一部分が使用されない可能 性があります。このような場合には * または .ANY モジュールセレクタを使用して、初 期化ブロックの終わりからデータブロック開始までの領域を充填します。 5-24 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 注 コードの保守性とデバッグの容易性を高めるには、分散ローディング記述ファイル内の 配置指定要素を最小限に抑え、関数とデータの詳細な配置はリンカに任せておきます。 部分リンクされたコンポーネントオブジェクトは指定できません。例えば、オブジェ クト obj1.o、obj2.o、obj3.o を部分リンクさせて obj_all.o を生成したとき、 これらのコンポーネントオブジェクトの名前は生成されたオブジェクトで破棄されま す。このため、例えばオブジェクトの 1 つである obj1.o を名前で参照することはで きなくなります。参照できるのは結合オブジェクトである obj_all.o のみです。 特定アドレスへの関数とデータの配置 通常、コンパイラは 1 つのソースファイルから RO、RW、ZI の各セクションを生成し ます。これらの領域にはソースファイルからの全てのコードとデータが含まれていま す。1 つの関数またはデータ項目を固定アドレスに配置するには、リンカにその関数ま たはデータを入力ファイルの残りの部分とは別に生成させる必要があります。個々の オブジェクトにアクセスするには、以下のいずれかの方法を使用します。 • 関数またはデータ項目をそれ専用のソースファイルに配置する。 注 関数ごと、またはデータブロックごとに 1 つのオブジェクトを指定すると、コン パイラの最適化能力が低下します。 ARM DUI0151AJ-00 • -zo コンパイラオプションを使用して、関数ごとに 1 つのオブジェクトファイル を生成する(ADS コンパイラ / ライブラリガイド参照)。 • C または C++ ソースコード内で #pragma arm section を使用し、複数の名前 を持つセクションを作成する(P. 5-27 例 5-5 参照)。 • アセンブリ言語から AREA ディレクティブを使用する。アセンブリコードでは、 配置可能な最小単位が AREA となります(ADS アセンブラガイド参照)。 Copyright © 2001 ARM Limited. All rights reserved. 5-25 分散ローディング記述ファイルの使用 各オブジェクトファイルの内容の配置 例 5-4 が示す分散ローディング記述ファイルは、以下の配置を行います。 • 初期化コードをアドレス 0x0 に配置する(続けて残りの RO コードと、オブジェ クト data.o 内の RO データを除く全ての RO データを配置します) 。 • 全てのグローバル RW 変数を RAM 内の 0x400000 に配置する。 • data.o からのテーブル RO_DATA をアドレス 0x1ff00 に固定する。 例 5-4 セクションの配置 LOADREG1 0x0 0x10000 { EXECREG1 0x0 0x2000 ; ROOT Region, containing init code { ; place init code at exactly 0x0 init.o (Init, +FIRST) * (+RO) ; rest of code and read-only data } RAM 0x400000 ; RW data to be placed at 0x400000 { * (+RW +ZI) } DATABLOCK 0x1ff00 0xff FIXED ; execution region fixed at 0x1ff00 { ; the maximum space available for table is 0xff data.o(+RO_DATA) ; place read-only data between 0x1ff00 and 0x1ffff } } 注 FIXED を単一ロード領域に使用することが適切ではない場合があります。以下に、固 定位置を指定するための他の方法を紹介します。 5-26 • 使用するローダが複数のロード領域を処理できる場合は、RO コードまたはデー タをその専用のロード領域に配置する。 • 関数またはデータを ROM 内の固定位置に配置する必要がない場合は、FIXED の 代わりに ABSOLUTE を使用する。これにより、ローダはロード領域からのデー タを RAM 内の指定されたアドレスにコピーします(ABSOLUTE はデフォルト属 性です)。 • データ構造をメモリマップ I/O の位置に配置するには、2 つのロード領域を使用 して UNINIT を指定する(UNINIT を使用するとメモリ位置はゼロ初期化されま せん)。詳細については、ADS デベロッパガイドの「ROM へのコードの書き込 み」を参照して下さい。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 arm セクションプラグマの使用 コードまたはデータオブジェクトを専用ソースファイル内に配置して、そのオブジェ クトファイルのセクションを配置するには、標準的なコーディング方法を使用します。 しかしながら、命名されたセクションの配置には、プラグマと分散ローディング記述 ファイルも使用することができます。モジュール(例:adder.c)を作成し、例 5-5 が 示すようにセクションを明示的に命名します。 例 5-5 セクションの命名 // file int int int int adder.c x1 = 5; y1[100]; const z1[3] = {1,2,3}; sub1(int x) {return x-1;} // // // // #pragma arm section rwdata = "foo", int x2 = 5; // char *s3 = "abc"; // int add1(int x) {return x+1;} // #pragma arm section code, rwdata // in.data in.bss in.constdata in.text code ="foo" in foo (data part of region) s3 in foo, "abc" in .constdata in foo (.text part of region) return to default placement 命名したセクションを配置する位置は、分散ローディング記述ファイルを使用して指 定します(例 5-6 参照)。コードセクションとデータセクションの名前が同じ場合には、 コードセクションを先に配置します。 例 5-6 セクションの配置 FLASH 0x24000000 0x4000000 { FLASH 0x24000000 0x4000000 { init.o (Init, +First) * (+RO) } 32bitRAM 0x0000 { vectors.o (Vect, +First) * (+RW,+ZI) } ADDER 0x08000000 { adder.o (foo) } } ARM DUI0151AJ-00 ; place code from init.o first ; sub1(), z1[] ; x1, y1 ; x2, string s3, and add1() Copyright © 2001 ARM Limited. All rights reserved. 5-27 分散ローディング記述ファイルの使用 5.4 等価な分散ローディング記述を使用した単純イメージの生成 コマンドラインオプション(-ro-base、-rw-base、-reloc、-split、-ropi、-rwpi) を使用すると、P. 3-14「コマンドラインオプションを使用した単純イメージの作成」で 説明した単純イメージタイプが作成されます。これらと同じイメージタイプは、 -scatter コマンドラインオプションと、対応する分散ローディング記述を含むファイ ルを使用して作成することができます。 5.4.1 タイプ 1 このタイプのイメージは、ロードビューでは 1 つのロード領域、実行ビューでは 3 つ の実行領域から構成されます。実行領域はメモリマップ内で連続配置されます。 非 ropi 領域 -ro-base address は、RO 出力セクションを含む領域のロード / 実行アドレスを指定 します。例 5-7 は、-ro-base 0x040000 を使用したときと同じ結果をもたらす分散 ローディング記述を示しています。 例 5-7 単一ロード領域と連続実行領域 LR_1 0x040000 { ER_RO +0 ; ; ; ; Define the load region name as LR_1, the region starts at 0x040000. Start of execution region descriptions. First execution region is called ER_RO, region starts at end of previous region. However, since there was no previous region, the address is 0x040000. { *(+RO) } ER_RW +0 ; All RO sections go into this region, they are placed consecutively. ; Second execution region is called ER_RW, the region starts at the end of the ; previous region. The address is 0x040000 + size of ER_RO region. { *(+RW) } ER_ZI +0 ; All RW sections go into this region, they are placed consecutively. ; Last execution region is called ER_ZI, the region starts at the end of the ; previous region at 0x040000 + the size of the ER_RO regions + the size of ; the ER_RW regions. { *(+ZI) ; All ZI region are placed consecutively here. } } この記述により、ロードアドレスが 0x040000 の、LR_1 と命名された単一ロード領 域が作成されます。 5-28 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 このイメージは ER_RO、ER_RW、ER_ZI と命名された 3 つの実行領域で構成され、こ れらの領域には RO、RW、ZI 出力セクションがそれぞれ含まれます。ER_RO の実行ア ドレスは 0x040000 です。これら 3 つの全ての領域は、実行領域の記述に +offset 形 式のベース指名子を使用することによって、メモリマップ内に連続で配置されます。こ の方法で、1 つの実行領域をその前の実行領域の直後に配置することができます。 ropi 領域 実行領域はメモリマップ内に連続で配置されます。しかし、-ropi は RO 出力セクショ ンを含む実行領域を位置独立領域としてマーキングします。 RO 出力セクションを含む領域のロード / 実行アドレスを指定するには、-ro-base address を使用します。 例 5-8 は、-ro-base 0x010000 -ropi を使用したときと同じ結果をもたらす分散 ローディング記述を示しています。 例 5-8 位置独立コード LR_1 0x010000 PI { ER_RO +0 ; The first load region is at 0x010000. ; The PI attribute is inherited from parent. ; The default execution address is 0x010000, but the code can be moved. { *(+RO) } ER_RW +0 ABSOLUTE { *(+RW) } ER_ZI +0 { *(+ZI) } ; All the RO sections go here. ; PI attribute is overridden by ABSOLUTE. ; The RW sections are placed next. They cannot be moved. ; ER_ZI region placed after ER_RW region. ; All the ZI sections are placed consecutively here. } RO 実行領域である ER_RO は、ロード領域 LR_1 の PI 属性を継承します。次の実行領 域 ER_RW は ABSOLUTE とマーキングされており、+offset 形式のベース指名子を使 用しています。このため、ER_RW は ER_RO から PI 属性を継承しません。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-29 分散ローディング記述ファイルの使用 5.4.2 タイプ 2 このタイプのイメージは、ロードビューでは 1 つのロード領域から、実行ビューでは 3 つの実行領域から構成されます。RW 実行領域が RO 実行領域と隣接していないことを 除けば、このタイプはタイプ 1 のイメージと同様です。 非 rwpi 領域 -ro-base address1は、RO出力セクションを含む領域のロード/実行アドレスを指定 します。-rw-base address2 は、RW 実行領域の実行アドレスを指定します。 例 5-9 は、-ro-base 0x010000 -rw-base 0x040000 を使用したときと同じ結果 をもたらす分散ローディング記述を示しています。 例 5-9 単一ロード領域と複数実行領域 LR_1 0x010000 { ER_RO +0 ; Defines the load region name as LR_1 ; The first execution region is called ER_RO and starts at end of previous region. ; Since there was no previous region, the address is 0x010000. { *(+RO) } ER_RW 0x040000 { *(+RW) } ER_ZI +0 ; All RO sections are placed consecutively into this region. ; Second execution region is called ER_RW and starts at 0x040000. ; All RW sections are placed consecutively into this region. ; The last execution region is called ER_ZI. ; The address is 0x040000 + size of ER_RW region. { *(+ZI) ; All ZI sections are placed consecutively here. } } この記述により、LR_1 と命名され、ロードアドレスが 0x010000 の単一ロード領域 で構成されるイメージが作成されます。 このイメージは、それぞれ RO、RW、ZI の各出力セクションを含む、ER_RO、ER_RW、 ER_ZI と命名された 3 つの実行領域から構成されます。ER_RO の実行アドレスは 0x010000 です。 ER_RW 実行領域は ER_RO に隣接していません。この領域の実行アドレスは 0x040000 です。 5-30 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 ER_ZI 実行領域は、その前の実行領域である ER_RW の直後に配置されます。 rwpi 領域 この領域は、RW 実行領域の -rw-base を RO 実行領域から切り離したタイプ 2 のイメー ジに似ています。しかし、-rwpi は RW 出力セクションを含む実行領域を位置独立領 域としてマーキングします。 タイプ 2 の他のイメージと同様に、-ro-base address は RO 出力セクションを含む 領域のロード / 実行アドレスの指定に使用し、-rw-base address2 は RW 出力セク ションを含む領域のロード / 実行アドレスの指定に使用します。 例 5-10 は、-ro-base 0x010000 -rw-base 0x018000 -rwpi を使用したときと 同じ結果をもたらす分散ローディング記述を示しています。 例 5-10 位置独立データ LR_1 0x010000 { ER_RO +0 ; The first load region is at 0x010000. ; Default ABSOLUTE attribute is inherited from parent. The execution address ; is 0x010000. The code and ro data cannot be moved. { *(+RO) } ER_RW 0x018000 PI { *(+RW) } ER_ZI +0 { *(+ZI) } ; All the RO sections go here. ; PI attribute overrides ABSOLUTE ; The RW sections are placed at 0x018000 and they can be moved. ; ER_ZI region placed after ER_RW region. ; All the ZI sections are placed consecutively here. } RO 実行領域である ER_RO は、ロード領域 LR_1 の ABSOLUTE 属性を継承します。次 の実行領域 ER_RW は PI とマーキングされています。 タイプ 2 とタイプ 3 のイメージにおける -ropi と -rwpi の他の組み合わせの用法に 対応するように同様の分散ローディング記述を書くこともできます。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-31 分散ローディング記述ファイルの使用 5.4.3 タイプ 3 タイプ 3 のイメージは、ロードビューでは 2 つのロード領域から、実行ビューでは 3 つ の実行領域から構成されます。このタイプは、タイプ 2 での単一ロード領域が 2 つの ロード領域に分割される点を除き、タイプ 2 のイメージと同様です。 再配置不可能なロード領域 -ro-base address1は、RO出力セクションを含む領域のロード/実行アドレスを指定 します。-rw-base address2 は、RW 出力セクションを含む領域のロード / 実行ア ドレスを指定します。 -split は、デフォルトの単一ロード領域(RO および RW 出力セクションを含む領域) を 2 つのロード領域に分割するために使用します。これにより、一方のロード領域に RO 出力セクションが、他方に RW 出力セクションが含まれます。 例 5-11 は、-ro-base 0x010000 -rw-base 0x040000 -split を使用したときと 同じ結果をもたらす分散ローディング記述を示しています。 例 5-11 複数ロード領域 LR_1 0x010000 { ER_RO +0 { *(+RO) } } LR_2 0x040000 { ER_RW +0 { *(+RW) } ER_ZI +0 { *(+ZI) } } ; The first load region is at 0x010000. ; The address is 0x010000. ; The second load region is at 0x040000. ; The address is 0x040000. ; All RW sections are placed consecutively into this region. ; The address is 0x040000 + size of ER_RW region. ; All ZI sections are placed consecutively into this region. この記述により、ロードアドレスが 0x010000 と 0x040000 の、LR_1 および LR_2 と命名された 2 つのロード領域を持つイメージが作成されます。 5-32 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 分散ローディング記述ファイルの使用 このイメージは、それぞれ RO、RW、ZI の各出力セクションを含む、ER_RO、ER_RW、 ER_ZI と命名された 3 つの実行領域から構成されます。ER_RO の実行アドレスは 0x010000 です。 ER_RW 実行領域は ER_RO に隣接していません。この領域の実行アドレスは 0x040000 です。 ER_ZI 実行領域は、その前の実行領域である ER_RW の直後に配置されます。 再配置可能なロード領域 このタイプ 3 のイメージもまた、ロードビューでは 2 つのロード領域から、実行ビュー では 3 つの実行領域から構成されます。しかし、-reloc を使用することによって、2 つのロード領域に RELOC 属性が設定されます。 -ro-base address1は、RO出力セクションを含む領域のロード/実行アドレスを指定 します。-rw-base address2 は、RW 出力セクションを含む領域のロード / 実行ア ドレスを指定します。 -splitは、RO出力セクションとRW出力セクションを含むデフォルトの単一ロード領 域を 2 つのロード領域に分割するために使用します。これにより、一方のロード領域 には RO 出力セクションが、他方には RW 出力セクションが含まれます。 P. 5-34 例 5-12 は、-ro-base 0x010000 -rw-base 0x040000 -reloc -split を 使用したときと同じ結果をもたらす分散ローディング記述を示しています。 この記述により、ロードアドレスが 0x010000 と 0x040000 の、LR_1 および LR_2 と命名された 2 つのロード領域を持つイメージが作成されます。 このイメージは、それぞれ RO、RW、ZI の各出力セクションを含む、ER_RO、ER_RW、 ER_ZI と命名された 3 つの実行領域から構成されます。ER_RO のデフォルト実行アドレ スは 0x010000 です。 ER_RW 実行領域は ER_RO に隣接していません。この領域のデフォルト実行アドレスは 0x040000 です。 ER_ZI 実行領域は、その前の実行領域である ER_RW の直後に配置されます。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 5-33 分散ローディング記述ファイルの使用 例 5-12 再配置可能なロード領域 LR_1 0x010000 RELOC { ER_RO + 0 { *(+RO) } } LR2 0x040000 RELOC { ER_RW + 0 { *(+RW) } ER_ZI +0 { *(+ZI) } } 5-34 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 第6章 ライブラリの作成と使用 本章では armlink とライブラリの使用について説明します。本章は以下のセクションか ら構成されています。 • ライブラリについて:P. 6-2 • • ARM DUI0151AJ-00 ライブラリの検索、選択、スキャン:P. 6-3 ARM ライブラリアン:P. 6-6 Copyright © 2001 ARM Limited. All rights reserved. 6-1 ライブラリの作成と使用 6.1 ライブラリについて オブジェクトファイルは、関数や変数といった外部シンボルを参照することができま す。armlink はこれらの参照を、他のオブジェクトファイルまたはライブラリから検出 された定義とマッチングすることによって解決しようと試みます。armlink は、ar 形式 のファイルに格納された ELF ファイルの集合をライブラリとして認識します。 6-2 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 ライブラリの作成と使用 6.2 ライブラリの検索、選択、スキャン armlink がオブジェクトファイルをイメージに追加する方法と、ライブラリをイメージ に追加する方法には、以下の違いがあります。 • 入力リスト内の各オブジェクトファイルは、それを参照するものがあるかどうか に関係なく無条件に出力イメージに追加されますが、-noremove が使用されて いない限り、未使用セクションは後で削除されます。 • ライブラリのメンバは、オブジェクトファイルまたはインクルード済みのライブ ラリメンバがそのメンバへの弱い参照を行う場合にのみ、あるいは armlink が明 示的にそのメンバを追加するように指示されている場合にのみ、出力にインク ルードされます。 注 パタンを使用してライブラリから選択されたメンバは、オブジェクトであるかの ように無条件にイメージに追加されます。 弱いシンボルへの未解決参照によってライブラリメンバがロードされることはありま せん。 注 -noscanlib オプションが指定されている場合、armlink はデフォルトの ARM ライブラ リを検索せずに、入力ファイルリスト内に指定されているライブラリのみを使用して 参照を解決します。 あるライブラリメンバが入力ファイルリスト内で明示的に要求されている場合、その メンバはたとえ現在の参照を解決するものでなくてもロードされます。この場合、明 示的に要求されたメンバは、通常のオブジェクトであるかのように扱われます。 armlink はライブラリリストを以下のように作成します。 1. 2. armlink は、入力ファイルリスト内に指定されている全てのライブラリをリスト に追加します。 armlink によってユーザ指定検索パスが検査され、入力オブジェクトに組み込ま れたライブラリ要求のライブラリディレクトリが識別されます。この検索プロセ スの詳細については、P. 6-4「ARM ライブラリの検索」を参照して下さい。 検索対象のディレクトリおよびサブディレクトリからは、最適なライブラリバリアン トが選択されます。ARM が提供しているライブラリには、そのメンバの属性に基づい て命名された複数のバリアントがあります。ライブラリバリアントの詳細については、 ADS コンパイラ / ライブラリガイドおよび P. 6-4「ARM ライブラリバリアントの選択」 を参照して下さい。 armlink はライブラリのリストを構成すると、リスト内の各ライブラリを何度もスキャ ンすることによって参照を解決します。詳細については、P. 6-5「ライブラリのスキャ ン」を参照して下さい。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 6-3 ライブラリの作成と使用 6.2.1 ユーザライブラリの検索 コマンドラインで明示的にインクルードするライブラリの場合、それらのライブラリ が現在の作業ディレクトリ内に存在しなければパスが要求されます。 注 ARM 標準ライブラリに使用される検索パスは、ユーザライブラリの検索対象となりま せん。 6.2.2 ARM ライブラリの検索 ARM 標準ライブラリの検出に使用される検索パスは、以下の方法で指定することがで きます。 • armlink コマンドラインにおいて、カンマで区切った親ディレクトリのリストに -libpath 引数を追加する。 このリストは、ARM ライブラリディレクトリ armlib および cpplib の親ディ レクトリで終わっている必要があります。ARMLIB 変数は、ARM ライブラリの 親ディレクトリへのパスを保持します。 注意 -libpath は、ARMLIB 変数によって指定されるパスをオーバライドします。 • CodeWarrior IDE リンカコンフィギュレーションパネルを使用する(CodeWarrior IDE Guide 参照)。 • 環境変数 ARMLIB を使用する。 armlink は、上記の -libpath、コンフィギュレーションパネル、ARMLIB 変数のいず れかによって指定された各親ディレクトリと、入力オブジェクトからの各サブディレ クトリ要求を組み合わせることにより、ARM ライブラリの検索場所を識別します。親 ディレクトリ内のARMサブディレクトリの名前は、Lib$$Request$$sub_dir_name 形式のシンボルを使用することにより、コンパイル後の各オブジェクト内に配置され ます。 6.2.3 ARM ライブラリバリアントの選択 armlink は ARM ライブラリの検索時に選択した各ディレクトリから最適なライブラリ を選択する必要があります。これらのライブラリは、そのメンバオブジェクトの属性 に基づいた ARM ライブラリのバリアントです。ARM ライブラリのバリアントが ARM ライブラリに代わってコーディングされます。ライブラリの命名規則については、ADS コンパイラ / ライブラリガイドを参照して下さい。 6-4 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 ライブラリの作成と使用 armlink は各入力オブジェクトの属性を累算し、それらを使用して累算属性に最適なラ イブラリバリアントを選択します。選択した複数のライブラリが同等に適している場 合には、最初に選択されたライブラリが保存され、他のライブラリは破棄されます。 最終リストには、armlink が参照を解決するためにスキャンする全てのライブラリが含 まれています。 6.2.4 ライブラリのスキャン 全てのディレクトリが検索されると、最も互換性の高いライブラリバリアントが選択 されてライブラリリストに追加され、要求されたメンバをロードするために各ライブ ラリがスキャンされます。 1. 現時点で未解決の非弱な各参照について、armlink は一致する定義を求めてライ ブラリリストをシーケンシャルに検索します。最初に検出された定義がステップ 2 のためにマーキングされます。 検索をシーケンシャルに行う理由は、複数のライブラリが同一シンボルを定義し ている場合でも、armlink にリスト内で最初に出現したライブラリを選択させる ためです。したがって、使用するライブラリを入力ファイルリストに追加するこ とで、ARM C ライブラリなどの他のライブラリからの関数定義をオーバライド することができます。 2. ステップ 1 でマーキングされたライブラリメンバがロードされます。メンバが ロードされるたび、場合によっては弱い参照も含めた未解決参照の幾分かが満た されます。また、ライブラリをロードすることにより、未解決の弱い参照または 非弱な参照が新たに作成される可能性があります。 3. ステップ 1 と 2 のプロセスは、全ての非弱な参照が解決されるまで、あるいはど のライブラリによっても解決できなくなるまで継続されます。 スキャン動作の終了時に非弱な参照が未解決のまま残っている場合には、armlink はエ ラーメッセージを生成します。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 6-5 ライブラリの作成と使用 6.3 ARM ライブラリアン ARM ライブラリアン armar により、ELF オブジェクトファイルセットをまとめてライ ブラリに保存することができます。armlink には複数のオブジェクトファイルの代わり にこのライブラリを渡すことができます。しかし、1 つのオブジェクトライブラリファ イルとリンクさせても、そのオブジェクトライブラリファイルに収集された全てのオ ブジェクトファイルとリンクしたときと同じ結果が得られるとは限りません。これは armlink が入力リストとライブラリを異なる方法で処理するためです。 • armlink -remove オプションが指定されていれば未使用エリアは削除されます が、入力リスト内の各オブジェクトファイルは無条件に出力に出現します。 • ライブラリファイルのメンバは、オブジェクトファイルまたはその前に処理され たライブラリファイルによって参照される場合にのみ、出力にインクルードされ ます。 armlink の入力ファイルの処理方法については、第 2 章「armlink のコマンド構文」を参 照して下さい。 6.3.1 ライブラリアンコマンドラインオプション 以下は、ファイルまたはライブラリ情報の抽出に使用する armar コマンド構文を示して います。 armar [ -help] [-C] [-entries] [-p] [-t] [-s] [-sizes] [-T] [-vsn] [-v] [-via option_file] [-x] [-zs] [-zt] library [file_list] 以下は、ライブラリ内のファイルを追加または修正するときに使用する構文です。 armar [ -help] [-create] [-c] [-d] [-m] [-q] [-r] [-u] [-vsn] [-v] [-via option_file] [ {-a|-b|-i} pos_name] library [file_list] オプションの説明: 6-6 -a library 内の新しいファイルをファイル pos_name の後に配置します。 -b library 内の新しいファイルをファイル pos_name の前に配置します。 -create library が既に存在している場合でも、新しいライブラリを作成します。 -c ライブラリの作成時に、通常は標準エラーに書き込まれる診断メッセー ジを抑制します。 -C 抽出実行時に、既存ファイルを似た名前のファイルと置き換えないよう にライブラリアンに指示します。このオプションは、短縮ファイル名が 同じ接頭文字でファイルを置き換えないように -T を一緒に使用すると 有効です。 -d library から 1 つ以上のファイルを削除します。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 ライブラリの作成と使用 -entries library 内に定義された全てのエントリポイントをリストします。リスト 形式は以下のとおりです。 ENTRY at offset num in section name of member file_list 処理対象となるファイルのリストです。各ファイルは、そのパスと名前 で完全指定します。このパスには、絶対パス、ドライブ / ルートに対す る相対パス、カレントディレクトリに対する相対パスのいずれかを指定 することができます。 ライブラリに含まれるファイルの名前との比較には、パスの最後にある ファイル名だけが使用されます。複数のパスオペランドが同一ファイル 名で終わっている場合の結果は定義されていません。ファイルの指定に は、ワイルドカード * および ? を使用できます。 これらのファイルの 1 つがライブラリである場合、armar はその入力ライ ブラリの全てのメンバをデスティネーションライブラリにコピーしま す。コマンドラインからの入力項目の順序がそのまま保たれます。した がって、ライブラリファイルを与えることは、その全てのメンバをライ ブラリに保存したときの順序で与えることと論理的には同じことです。 -help armar コマンドの詳細をオンラインで提供します。 -i library 内の新しいファイルをメンバ pos_name の前に配置します(-b と 等価です)。 library ライブラリファイルのパス名です。 -m ファイルを移動します。-a、-b、-i が pos_name に指定されていると き、ファイルが新しい位置に移動されます。その他の場合は、ファイル がライブラリの終わりに移動されます。 -n アーカイブシンボルテーブルを抑制します。このオプションは、ライブ ラリがオブジェクトライブラリではない場合に使用します。 -p library 内のファイルの内容を標準出力に印字します。 pos_name 相対配置に使用される既存のライブラリメンバの名前です。この名前は、 オプション -a、-b、あるいは -i を付けて指定する必要があります。 -q -r のエイリアスです。 -r library 内のファイルを置換、または追加します。library が存在しない場 合は新しいライブラリファイルが作成され、診断メッセージが標準エ ラーに書き込まれます。 file_list が指定されていないときにライブラリが存在する場合の結果は定 義されていません。既存ファイルに置き換わるファイルが、ライブラリ の順序を変更することはありません。 -u オプションが使用されている場合には、ライブラリファイルよりも後 の修正日付を持つファイルだけが置き換えられます。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 6-7 ライブラリの作成と使用 -a、-b、-i のいずれかのオプションを使用するときは pos_name が存在 していなければならず、新しいファイルを pos_name の後(-a)と前(-b または -i)のどちらに配置するかを指定する必要があります。指定され ていない場合、新しいファイルは最後に配置されます。 -t library の内容を印字します。印字されるリストには file_list によって指定 されたファイルが含まれます。file_list が指定されていない場合は、ライ ブラリ内の全てのファイルがアーカイブ順に印字されます。 -s アーカイブシンボルテーブルを生成します。 -sizes library に含まれる各メンバの Code、RO Data、RW Data、ZI Data、 Debug のサイズをリストします。以下はこの出力例です。 Code 464 3356 3820 RO Data 0 0 0 RW data 0 0 0 ZI Data 0 10244 10244 Debug 8612 11848 20460 Object Name app_1.o app_2.o TOTAL -T このオプションを使用すると、ファイルシステムがサポートできる長さ よりもライブラリ名が長い抽出ファイルの名前を短縮することができま す。デフォルトでは、長過ぎる名前のファイルを抽出するとエラーが生 じます。この場合は診断メッセージが書き込まれ、そのファイルは抽出 されません。 -u 古いファイルを更新します。-r オプションと組み合わせて使用した場合 は、対応ファイルの修正時間が少なくともライブラリ内のファイルの修 正時間と同じぐらい最近の場合にのみ、library 内のファイルが置き換え られます。 -via option_file ライブラリアンに option_file からオプションを取得するように命令 します。via ファイルの記述については、ADS コンパイラ / ライブラリガ イドを参照して下さい。 -v verbose 出力を与えます。 この出力は、他に使用されているオプションに依存します。 -d, -r or -x -p -t -x -vsn 6-8 ライブラリ作成のファイルごとの記述、構成ファイル、保守 活動を記述します。 ファイル自体を標準出力に書き込む前に、ファイルの名前を 標準出力に書き込みます。 ライブラリ内のファイルに関する情報の長いリストを含み ます。 各抽出前にファイル名を印字します。 標準エラーにバージョン番号を印字します。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 ライブラリの作成と使用 -x library から file_list 内のファイルを抽出します。 library の内容 は変更されません。ファイルオペランドが指定されていない場合は、 library 内の全ファイルが抽出されます。ライブラリから抽出された ファイルの名前がデスティネーションディレクトリでサポートされてい る長さよりも長い場合の結果は定義されていません。 -zs シンボルテーブルを表示します。 -zt library に含まれるメンバのサイズおよびエントリポイントをリストしま す。出力形式については、-sizes および -entries を参照して下さい。 注 通常操作では、オプション -a、-b、-C、-i、-m、-T、-u、-v は必要ありません。 ARM ツールチェインではシンボルテーブルを持たないライブラリを使用することがで きないため、ライブラリ順序に関連するオプション(-a、-b、-i、-m など)は関係 ありません(シンボルテーブルが存在すれば、順序は関係ありません)。 ライブラリは更新するよりも再構築することが多いため、ライブラリの更新に関連す るオプション(-C および -u)を使用することはあまりありません。 6.3.2 例 例 6-1 ~ P. 6-10 例 6-7 は、構文の例を示しています。 例 6-1 新しいライブラリの作成と全オブジェクトファイルの追加 armar -create mylib *.o 例 6-2 目次のリスト armar -t mylib 例 6-3 シンボルテーブルのリスト armar -zs mylib ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 6-9 ライブラリの作成と使用 例 6-4 ファイルの追加(または置換) armar -r my_lib obj1.o obj2.o obj3.o ... armar -ru mylib k*.o 例 6-5 ファイルグループの抽出 armar -x my_lib k*.o 例 6-6 ファイルグループの削除 armar -d my_lib sys_* 例 6-7 ライブラリと追加(または置換)ファイルのマージ armar -r my_lib.a obj1.o my_lib.a other_lib.a obj2.o obj3.o 6-10 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 第7章 fromELF の使用 本章では ADS に収録されている fromELF ソフトウェアユーティリティについて説明し ます。本章は以下のセクションから構成されています。 • fromELF について:P. 7-2 ARM DUI0151AJ-00 • fromELF コマンドラインオプション:P. 7-3 • fromELF の使用例:P. 7-10 Copyright © 2001 ARM Limited. All rights reserved. 7-1 fromELF の使用 7.1 fromELF について fromELF ユーティリティは、armlink によって生成された実行リンク形式(ELF)のイ メージファイルを、ROM ツールまたはメモリへの直接ロードに適した他の形式に変換 します。また、このユーティリティを使用して ELF オブジェクトに関する様々な情報 を表示させたり、その情報を含むテキストファイルを生成することもできます。 fromELF は以下のイメージ形式を出力します。 • プレーンバイナリ形式 • Motorola 32 ビット S レコード形式 • Intel Hex-32 形式 • バイト向き(Verilog メモリモデル)16 進形式 • ELF 形式(ELF で再保存することができます。例えば、-debug ELF イメージを -nodebug ELF イメージに変換することが可能です。) また fromELF を使用することにより、逆アセンブリ出力やシンボルリストなどの入力 ファイルに関する情報を、標準出力またはテキストファイルに印字させることも可能 です。 注 -fieldoffsets fromELF ステップを必要とする場合は、-nodebug リンカオプション 使用してイメージをリンクしないで下さい。デバッグ情報なしでイメージが生成され た場合: • fromELF はそのイメージを他のファイル形式に変換することができません。 • 7.1.1 fromELF は有意な逆アセンブリリストを生成することができません。 イメージ構造 fromELF はファイルを ELF から他の形式に変換することができます。ただし、-base オプションが使用されているときに Motorola S レコードまたは Intel Hex 出力のベース アドレスを変更することを除いては、イメージの構造もアドレスも変更することがで きません。分散ロードされる ELF イメージを他の形式の非分散ロードイメージに変換 することはできません。構造またはアドレシングに関する情報は、全てリンク時に armlink に渡す必要があります。 7-2 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 fromELF の使用 7.2 fromELF コマンドラインオプション 以下は、fromELF のコマンド構文です。 fromelf [-help] [-fieldoffsets [-select select_options ]] [-nolinkview] [-nodebug] [-vsn] [text_output_format| code_output_format] [-base n] [memory_config] [-output output_file] input_file オプションの説明: -help ヘルプ情報と用法を表示します。このオプションが指定されてい るとき、他のコマンドラインオプションは無視されます。パラ メータを何も指定せずに fromELF を呼び出すと、同じヘルプ情報 が生成されます。 -fieldoffsets C++ クラスまたは C 構造フィールドの名前が、そのクラスまたは 構造のベースからのオフセットを、また、アセンブリ言語の場合 の EQU ディレクティブのリストを生成し、標準出力に書き込みま す。この入力 ELF ファイルは再配置可能なオブジェクトまたはイ メージです。 出力をファイルに転送するには -o を使用します。生成されたファ イルをロードし、C++ クラスおよび C 構造のメンバにアセンブリ 言語から名前でアクセスするには、armasm から INCLUDE コマン ドを使用します。armasm の詳細については、ADS アセンブラガ イドを参照して下さい。 注 ソースファイルにデバッグ情報が含まれていない場合は、このオ プションを使用できません。また、このオプションを code_output_format と一緒に使用することはできません。 -fieldoffsets は、全ての構造情報を出力します。構造のサブ セットを出力するには、-select select_options を使用し ます。 armasm に入力可能なファイルを必要としない場合には、-text -a オプションを使用することによって、表示アドレスをさらに読 みやすい形式にフォーマットすることができます。-a オプション は、イメージ内の構造とスタティックデータのアドレス情報のみ を出力します。これは、それらのアドレスが再配置可能オブジェ クト内においては未知であるためです。 -select select_options -select select_option は、-fieldoffsets または -text -a のどちらかのオプションと一緒に使用することにより、オプ ションリスト内のパタンと一致するフィールドだけを選択する ことができます。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 7-3 fromELF の使用 複数フィールドの選択には特殊文字を使用します。 • リスト内のオプションを結合するには a を使用します(例: a*,b*,c*) • 任意の名前とのマッチングには、ワイルドカード文字 * を 使用できます。 • 任意の 1 文字とのマッチングには、ワイルドカード文字 ? を使用できます。 • インクルードするフィールドは、select_option ストリ ングに接頭文字 a + を付けることによって指定します。これ はデフォルトです。 • 除外するフィールドは、select_option ストリングに接 頭文字 a ~ を付けることによって指定します。 Unix 上で特殊文字を使用する場合は、シェルが選択を拡大しない ように、オプションを引用符で囲む必要があります。 -nolinkview ELF イメージからセクションレベルのビュー(リンク時のビュー) を破棄し、セグメントレベルのビュー(ロード時のビュー)だけ を保存する場合は -nolinkview を使用します。セクションレベ ルのリンクビューを破棄すると、以下が削除されます。 • セクションヘッダテーブル • セクションヘッダストリングテーブル • ストリングテーブル • シンボルテーブル • 全てのデバッグセクション 出力に残るのはプログラムヘッダテーブルとプログラムセグメ ントだけです。ELF 仕様により、ELF ファイル内に存在するもの でプログラムローダに依存するものはこれだけです。 注意 コマンドラインで -elf を指定していないときにこのオプション を使用すると、予期しない結果が生じることがあります。正しい 用例については、P. 7-5 例 7-2 を参照して下さい。 7-4 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 fromELF の使用 -nodebug このオプションを使用すると、出力ファイルにデバッグ情報が含 まれません。バイナリイメージの場合はこれがデフォルト設定で す。-nodebug が指定されていると、全ての出力形式に作用しま す。このオプションは -text -g オプションをオーバライドし ます。 注意 コマンドラインで -elf を指定していないときにこのオプション を使用すると、予期しない結果が生じることがあります。例 7-1 のオプションは、出力形式が指定されていないためにテキスト ファイルを生成します。 例 7-1 テキスト出力 fromelf -nodebug image -o image_nodb.asf ELF形式の出力を得るには、例7-2が示すオプションを使用します。 例 7-2 ELF 出力 fromelf -elf -nodebug image.axf -o image_ndb.axf -vsn fromELF のバージョン情報を表示します。 text_output_format イメージ情報をテキスト形式で表示させるには、テキスト指定 (例:-text -c)を使用します。このオプションを使用して、ELF イメージまたはELFオブジェクトファイルをデコードすることが できます。このオプションはデフォルトです。テキスト形式また は、コード出力形式が指定されていない場合には、-text とみな されます。 output_fileが-oオプションと一緒に指定されていない場合に は、情報は標準出力に表示されます。 特定のテキストカテゴリを指定していない場合は、デフォルトで ヘッダ情報が出力されます。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 7-5 fromELF の使用 指定する場合、テキストカテゴリは以下の 1 つ以上の要素で構成 します。 a グローバルアドレスとスタティックデータアドレス (構造および合併内容のアドレスを含む)を印字しま す。このオプションは、デバッグ情報を含むファイル にのみ使用できます。データアドレスのサブセットを 出力するには、-select オプションを使用します。 c d g r s t v z コードを逆アセンブルします。 データセクションの内容を印字します。 デバッグ情報を印字します。 再配置情報を印字します。 シンボルテーブルを印字します。 ストリングテーブルを印字します。 イメージの各セグメントとセクションヘッダに関する 詳細情報を印字します。 コードサイズとデータサイズを印字します。 上記のカテゴリセレクタは、以下のいずれかで指定することがで きます。 • 個々のオプション(例:-text -c -d) • 単一の連結ストリング(例:-text -cd) • カテゴリセレクタのみ(例:-c -d) • スラッシュ文字の後に複数文字を続ける(例:-text/cd) 出力形式が指定されていない場合は、デフォルト出力形式 -text が使用され、個々のカテゴリセレクタが認識されます。別の出力 形式が指定されている場合、これらのセレクタは無視されます。 7-6 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 fromELF の使用 code_output_format バイナリまたは ELF 出力ファイルオプションを選択します。 code_output_format には以下のいずれかを指定することがで きます。 -bin プレーンバイナリ。memory_config オプションを使 用して、このオプションからの出力を複数のファイル に分割することができます。 -ihf 拡張 Intellec16 進形式。この出力のベースアドレスは -base オプションを使用して指定することができま す。 (このオプションは現在使用されておらず、本製品 の今後のバージョンからは削除される予定です。) Motorola 32 ビット形式(32 ビット S レコード)。この -m32 出力のベースアドレスは -base オプションを使用して 指定することができます。 Intel Hex-32 形式。この出力のベースアドレスは -base -i32 オプションを使用して指定することができます。 -vhx バイト向け(Verilog メモリモデル)16 進形式。この形 式は、HDL シミュレータのメモリモデルへのロードに 適しています。memory_config オプションを使用し て、このオプションからの出力を複数ファイルに分割 することができます。 ELF 形式(ELF で再保存)。このオプションを使用し -elf て、デバッグ ELF イメージを非デバッグ ELF イメージ に変換することができます。 fromELF を使用し、-bin、-ihf、-m32、-i32、-vhx オプショ ンのいずれかを使用して複数のロード領域を含む ELFイメージを バイナリ形式に変換する場合、fromELF は output_file と命名 された出力ディレクトリを作成し、入力イメージ内の各ロード領 域につき 1 つのバイナリ出力ファイルを生成します。fromELF は これらの出力ファイルを output_file ディレクトリ内に配置し ます。 複数のロード領域を定義する分散ロード記述ファイルを使用し て ELF イメージをビルドした場合、この ELF イメージには複数 のロード領域が含まれます。 -base n Motorola S レコード、Intel Hex、拡張 Intellec16 進の各ファイル形 式で生成された出力のベースアドレスを指定します。このオプ ションは、出力形式 -m32、-i32、-ihf のいずれかが指定され ている場合にのみ使用できます。 ベースアドレスは以下のどちらかで指定することができます。 • 10 進数(例:-base 0) • ARM DUI0151AJ-00 16 進数(例:-base 0x8000) Copyright © 2001 ARM Limited. All rights reserved. 7-7 fromELF の使用 出力ファイルにエンコードされた全てのアドレスが、ベースアド レス n で開始します。 -base オプションを指定していない場合は、 このベースアドレスがロード領域アドレスから取得されます。 注 . 複数のロード領域が存在する場合、-base 値は各出力ファイルに 使用されます。つまり、この値が全てのロード領域アドレスを オーバライドします。 memory_config 複数メモリバンクに対して複数ファイルを出力します。このオプ ションは、出力形式として -vhx または -bin が指定されている 場合にのみ使用できます。 memory_config の形式は -widthxbanks で指定されます。上記 において: width. ターゲットメモリシステムのメモリ幅(8 ビット、16 ビット、32 ビット、あるいは 64 ビット)を指定します。 banks. ターゲットメモリシステム内のメモリバンクの数を指 定します。 以下は有効なコンフィギュレーションです。 -8x1 -8x2 -8x4 -16x1 -16x2 -32x1 -32x2 -64x1 複数のコンフィギュレーションが指定されているとき、fromELF は最後に指定されているコンフィギュレーションを使用します。 このオプションが -vhx または -bin 以外の形式に選択されてい る場合は無視されます。 イメージが 1 つのロード領域で構成されている場合、fromELF は 以下の命名規則を使用して bank ファイルを生成します。 • 1 つのメモリバンクが存在するとき(banks = 1)、出力ファ イルは -o output_file 引数によって命名されます。 • 複数のメモリバンクが存在する場合(bank>1)、fromELF は output_file0 で始まり、output_file bank-1 で終わ る banks 個のファイルを生成します。例: fromelf -vhx -8x2 test.axf -o test は、test0 および test1 と命名された 2 つのファイルを生 成します。 イメージが複数のロード領域で構成されている場合、fromELF は output_file という名前のディレクトリを作成し、load region0 から load region banks-1 の間で命名された各ロー ド領域のバンクファイルを生成します。 7-8 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 fromELF の使用 width で指定したメモリ幅は、イメージから読み出され、ファイ ルに書き込まれるチャンク情報のサイズを決定します。最初に読 み出されたチャンクは最初のファイル(output_file0)に割り 当てられ、次のチャンクは次のファイルに割り当てられます。 チャンクが最後のファイルに割り当てられると、割り当てが最初 のファイルから再び開始されます(つまり、この割り当てはファ イル数に基づくモジュロです)。例えば、 memory_config が -8x4 の場合: byte0 byte1 byte2 byte3 byte4 ... -> -> -> -> -> file0 file1 file2 file3 file0 memory_config が -16x2 の場合: halfword0 -> file0 halfword1 -> file1 halfword3 -> file0 ... -output output_file このオプションは出力ファイルの名前、あるいは複数の出力ファ イルが作成される場合は出力ディレクトリの名前を指定します (text_output_format および code_output_format の説明 を参照して下さい)。-text 出力オプションを使用する場合の出 力ファイルの指定は任意ですが、他の全ての出力では必ず指定す る必要があります。 input_file 変換する ELF ファイルを指定します。 fromELF は、ARM 実行 ELF ファイルと ARM オブジェクト ELF ファイル(.o)しか受け取りません。input_file が複数のロー ド領域を含む分散ロードイメージであり、その出力形式が -bin、 -ihf、-m32、-i32、-vhx のいずれかである場合、fromELF は各 ロード領域に別々のファイルを作成します。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 7-9 fromELF の使用 7.3 fromELF の使用例 このセクションでは、fromELF を使用したイメージ形式の変更方法、または ELF ファ イルからの情報の抽出方法を示した例を紹介します。 注 Unix で *、?、~ などのワイルドカード文字を使用する場合は、シェルが選択を拡大し ないように、これらのオプションを引用符で囲む必要があります。 例えば、*, ~*.* ではなく、’*, ~*.*’ と入力します。 7.3.1 プレーンバイナリファイルの生成 ELF ファイルをプレーンバイナリ(.bin)ファイルに変換するには、以下のように入 力します。 fromelf -bin -o outfile.bin infile.axf 7.3.2 逆アセンブリ ELF ファイルの逆アセンブリバージョンを含む標準出力へのリストを生成するには、 以 下のように入力します。 fromelf -c infile.axf ELF ファイルの逆アセンブリバージョンとシンボルテーブルを含むプレーンテキスト 出力ファイルを生成するには、以下のように入力します。 fromelf -c -s -o outfile.lst infile.axf 7.3.3 フィールドオフセットをアセンブリ言語 EQU としてリストする ファイル inputfile.o 内に存在する全ての構造から、全てのフィールドオフセット を含む標準出力への出力リストを生成するには、以下のように入力します。 fromelf -fieldoffsets inputfile.o p で始まる名前のファイル inputfile.o 内の構造から、outputfile.a にリストす る全てのフィールドオフセットを含む出力ファイルを生成するには、以下のように入 力します。 fromelf -fieldoffsets -select p* -o outputfile.a inputfile.o tools または moretools の名前を持つファイル inputfile.o 内の構造から、 outputfile.a にリストする全てのフィールドオフセットを含む出力ファイルを生成 するには、以下のように入力します。 fromelf -fieldoffsets -select tools.*, moretools.* -o outputfile.a inputfile.o 7-10 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 fromELF の使用 名前が数字で始まり、ファイル inputfile.o 内の構造 tools 内の構造フィールド top に含まれる構造フィールドの、outputfile.a にリストする全てのフィールドオ フセットを含む出力ファイルを生成するには、以下のように入力します。 fromelf -fieldoffsets -select tools.top.number* -o outputfile.a inputfile.o 7.3.4 スタティックデータアドレスのリスト 全てのグローバル変数とスタティックデータ変数、ならびに全ての構造フィールドア ドレスを標準出力にリストするには、以下のように入力します。 fromelf -text -a -select * infile.axf 構造のみの選択 inputfile.axf 内の全ての構造アドレスを含み、グローバル変数またはスタティック データ変数の情報を含まないテキストファイルを生成するには、以下のように入力し ます。 fromelf -text -a -select *.* -o strucaddress.txt infile.axf 入れ子構造のみの選択 入れ子構造のアドレスのみを含むテキストファイルを生成するには、以下のように入 力します。 fromelf -text -a -select *.*.* -o strucaddress.txt infile.axf 変数のみの選択 inputfile.axf 内のグローバル変数またはスタティクデータ変数の情報を含み、構造 アドレスは含まないテキストファイルを生成するには、以下のように入力します。 fromelf -text -a -select *, ~*.* -o strucaddress.txt infile.axf 7.3.5 デバッグから非デバッグへの変換 -debug オプションを使用して生成された ELF ファイルから、-nodebug オプションを 使用したときと同様の新しい出力ファイルを生成するには、以下のように入力します。 fromelf -nodebug -elf -o outfile.axf infile.axf ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 7-11 fromELF の使用 7-12 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 第8章 ARM プロファイラの使用 本章では、ADS に収録されている ARM プロファイラについて説明します。本章は以 下のセクションから構成されています。 • ARM プロファイラ:P. 8-2 • • ARM DUI0151AJ-00 プロファイラのコマンドラインオプション:P. 8-3 サンプル出力:P. 8-4 Copyright © 2001 ARM Limited. All rights reserved. 8-1 ARM プロファイラの使用 8.1 ARM プロファイラ ARM プロファイラ armprof は、ARM デバッガによって生成されたプロファイルデータ ファイルから、プログラムの実行プロファイルを表示します。 注 ARM プロファイラは、基本 ATPCS 標準にコンパイルされた単純なイメージに対して のみ有用です。分散ローディングなどを使用している場合には、有益な情報は得られ ません。 ARM プロファイラは、プロファイルデータ内に存在する情報量に基づいて、2 つのタ イプの実行プロファイルのうち、どちらか一方を表示します。 8-2 • pc サンプリング情報だけが存在する場合、プロファイラは各関数に費やされた時 間の割合を示すフラットプロファイルだけを表示することができます。関数の子 に費やされた時間は表示されません。 • 関数呼び出しのカウント情報が存在する場合、プロファイラは各関数に費やされ た時間、各関数の全ての子への呼び出しごとに計算された時間、ならびに異なる 親からの呼び出しに割り当てられた時間の近似値を示すコールグラフプロファ イルを表示することができます。 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 ARM プロファイラの使用 8.2 プロファイラのコマンドラインオプション いくつかのオプションを使用して、プロファイラ出力内の形式と情報量を制御するこ とができます。以下は、このコマンド構文を示しています。 armprof [-parent|-noparent] [-child|-nochild] [-sort options] prf_file オプションの説明: -parent プロファイルリスト内の各関数の親に関する情報を表示します。 このオプションを使用すると、それぞれの親からの呼び出しを処 理する各関数に費やされた時間の近似情報を得ることができま す。 -noparent 親のリスティングをオフにします。 -child 各関数の子に関する情報を表示します。プロファイラは、親の代 わりに処理を実行するそれぞれの子に費やされた近似時間を表 示します。 -nochild 子のリスティングをオフにします。 -sort options 以下のいずれか 1 つのオプションを使用して、プロファイル情報 をソートします。 cumulative 各関数と、その全ての子に費やされた合計時 間で出力をソートします。 self 各関数に費やされた時間(その子に費やされ た時間は除く)で出力をソートします。 descendants 各関数の全ての子に費やされた時間(関数本 体に費やされた時間は除く)で出力をソート します。 calls リスト内の各関数への呼び出しの数で出力 をソートします。 prf_file プロファイル情報を保持するファイルを指定します。 デフォルトでは、子関数はリストされますが親関数はリストされず、出力が累算時間 でソートされます。 8.2.1 例 armprof -parent sort.prf ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. 8-3 ARM プロファイラの使用 8.3 サンプル出力 プロファイラ出力はいくつものセクションに分割され、各セクションは行で区切られ ます。各セクションは 1 つの関数に関する情報を保持します。親関数の情報も子関数 の情報も持たないフラットプロファイルでは、各セクションが 1 行で構成されます。 以下は、insert_sort および strcmp を呼ぶ関数のサンプルセクションを示してい ます。 Name cum% self% desc% calls ------------------------------------------------------main 17.69% 60.06% 1 insert_sort 77.76% 17.69% 60.06% 1 strcmp 60.06% 0.00% 243432 ------------------------------------------------------qs_string_compare 3.21% 0.00% 13021 shell_sort 3.46% 0.00% 14059 insert_sort 60.06% 0.00% 243432 strcmp 66.75% 66.75% 0.00% 270512 ------------------------------------------------------- 8-4 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 用語集 ADS ARM デベロッパスイート参照。 Angel ARM ベースのハードウェアで実行するアプリケーションの開発とデバッグに使用可能 なデバッグモニタプログラム。Angel は、ARM 状態または Thumb 状態で動作するアプ リケーションをデバッグすることができます。 ANSI 米国規格協会(American National Standards Institute)。他の中でも特にコンピュータソフ トウェアの規格を規定する団体です。 API アプリケーションプログラムインタフェース。 Architecture (アーキテクチャ) 同様の特長を持つプロセッサグループの識別に使用される用語。 ARM Developer Suite( (ARM デベロッパスイート) 支援文書およびサンプルを含み、ARM ファミリの RISC プロセッサ用アプリケーショ ンを記述してデバッグするためのアプリケーションスイート。 ARMulator 命令セットシミュレータ。各種 ARM プロセッサの命令セットとアーキテクチャをシ ミュレートするモジュールの集合です。 ATPCS ARM/Thumb プロシージャコール標準。サブルーチンコールに関するレジスタとスタッ クの使用方法を定義します。 Big-endian(ビッグ (ビッグ エンディアン) ワードの最下位バイトが最上位バイトよりも上位アドレスに位置するメモリ構成。 BNF バッカスノアフォーム。論理構造を定義する数学表記です。 ARM DUI0151AJ-00 Copyright © 2001 ARM Limited. All rights reserved. Glossary-1 用語集 Byte(バイト) (バイト) 8 ビットで構成されるメモリ域の単位。 Deprecated (廃止予定) 廃止予定のオプションまたは機能は、使用しないことを強く推奨します。衰退オプショ ンおよび機能は、本製品の今後のバージョンではサポートしない予定です。 Double word (ダブルワード) 64 ビット単位の情報。ダブルワードの内容は、指定されていない限り符号なし整数と みなされます。 DWARF Debug With Arbitrary Record Format(任意レコード形式でのデバッグ)の略。 ELF 実行リンク形式。 Environment(環境) (環境) アプリケーションを実行する実ハードウェアとオペレーティングシステムのこと。 Executable and linking format(実行リンク形式) (実行リンク形式) ARM デベロッパスイートで使用している業界標準バイナリファイル形式。ELF オブ ジェクト形式は、armcc や armasm などの ARM オブジェクト生成ツールによって生成 されます。ARM リンカは ELF オブジェクトファイルを受け取り、ELF 実行ファイルま たは部分リンク ELF オブジェクトを出力することができます。 Execution view (実行ビュー) イメージがメモリにロードされて実行を開始した後の、領域およびセクションのアド レス。 Flash memory (フラッシュメモリ) アプリケーションコードの保持に頻繁に使用される不揮発性メモリ。 Heap(ヒープ) (ヒープ) 新しい変数の作成に使用可能なコンピュータメモリの一部分。 Host(ホスト) (ホスト) 別のコンピュータにデータや他のサービスを提供するコンピュータ。 IDE 統合開発環境(例:CodeWarrior IDE)。 Image(イメージ) (イメージ) 実行を目的にプロセッサにロードされた実行可能ファイル。 Input section (入力セクション) コードまたは初期化データを保持する、あるいはアプリケーションの起動前にゼロに 設定する必要があるメモリフラグメントを記述するセクション。 出力セクション参照。 Interrupt(割り込み) (割り込み) 外部シグナルなどが原因で、アプリケーションの通常処理シーケンスに変更が生じる こと。 Interworking(インターワーキング) (インターワーキング) ARM コードと Thumb コードの両方を使用するアプリケーションの生成。 Library (ライブラリ) アセンブラまたはコンパイラの出力オブジェクトの集合をグループ化した 1 つの構成 物。 Linker(リンカ) (リンカ) 1 つ以上のソースアセンブラ / コンパイラ出力オブジェクトから 1 つのイメージを生成 するソフトウェア。 Little-endian(リトル (リトル エンディアン) ワードの最下位バイトが最上位バイトよりも下位アドレスに位置するメモリ構成。 Glossary-2 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 用語集 Load view (ロードビュー) イメージがメモリにロードされ、実行がまだ開始されていないときの領域およびセク ションのアドレス。 Output section (出力セクション) RO、RW、ZI のうちで同じ属性を持った、連続する一連の入力セクションから構成さ れるセクション。出力セクションは、領域と呼ばれるさらに大きなフラグメントにグ ループ化されます。これらの領域がグループ化されて最終的な実行イメージが生成さ れます。 領域参照。 PIC 位置独立コード。 ROPI 参照。 PID 位置独立データまたは ARM プラットフォーム独立開発カード。 RWPI 参照。 Profiling (プロファイリング) パフォーマンスの測定や重要コードエリアの特定を目的に、デバッグ対象プログラム の実行中の統計データを蓄積したもの。 コールグラフプロファイリングでは詳細な情報を得られますが、実行速度が著しく低 下します。フラットプロファイリングでは簡単な統計データを得ることができ、実行 速度への影響もそれほどありません。 どちらのタイプのプロファイリングでも、統計データ収集動作間の時間間隔を指定す ることができます。 Program image(プログラムイメージ) (プログラムイメージ) イメージ参照。 Redirection(転送) (転送) デフォルト出力を異なるデスティネーションに送信する、あるいはデフォルト入力を 異なるソースから受信するプロセス。転送は、転送しなければコンピュータ画面に表 示されるテキストをファイルに出力する目的で使用するのが一般的です。 Region(領域) (領域) イメージ内において、1 ~ 3 個の連続する一連の出力セクション(RO、RW、ZI)から 構成される領域。領域は一般的に、ROM、RAM、ペリフェラルなどの物理メモリデバ イスにマップされます。 ルート領域参照。 Remapping (再マッピング) 物理メモリまたはデバイスのアドレスを、アプリケーションの実行開始後に変更する こと。通常、この動作は初期化完了後に ROM を RAM に置き換えるために行われます。 Retargeting (再対象化) ある実行環境に合わせて設計されたコードを別の実行環境に移す作業工程。 Root region (ルート領域) イメージ内において、それ自身のロードアドレスで実行される領域。非ルート領域と は、そのロードアドレスから実行アドレスにコピーする必要がある領域を言います。 ROPI ARM DUI0151AJ-00 読み出し専用位置独立。コードおよび読み出し専用データのアドレスはランタイムに 変更することが可能です。 Copyright © 2001 ARM Limited. All rights reserved. Glossary-3 用語集 RTOS リアルタイムオペレーティングシステム。 RWPI 読み出し / 書き込み位置独立。読み出し / 書き込みデータのアドレスはランタイムに変 更することが可能です。 Scatter-loading (分散ローディング) 1 つの大きなブロックを使用するのではなく、コードセクションとデータセクションの アドレスを個々に割り当て、これらをグループ化すること。 Sections (セクション) イメージを構成するソフトウェアコードまたはデータのブロック。 入力セクション参照。 Semihosting (セミホスティング) ターゲットがアプリケーションコード内で発生した I/O 要求を、その I/O 自体をサポー トしようとするのではなく、ホストシステムに通知するメカニズム。 Stack(スタック) (スタック) サブルーチンを呼び出すコードのリターンアドレスを記録するために使用されるメモ リの部分。スタックは、パラメータおよび一時変数にも使用することができます。 SWI ソフトウェア割り込み。プロセッサにプログラマが指定したサブルーチンを呼び出さ せる命令。ARM によってセミホスティングを処理するために使用されます。 Target(ターゲット) (ターゲット) ターゲットアプリケーションを実行する実ターゲットプロセッサ(実際の、またはシ ミュレートされたプロセッサ)。 デバッギングセッションにおける基本オブジェクト。デバッギングシステムの基礎。 ターゲットソフトウェアを実行する環境。実質的には、実際の、またはシミュレート されたプロセッサの集合を意味します。 Veneer(ベニア) (ベニア) プロセッサ状態の変更要件、あるいは現在のプロセッサ状態では到達不可能なアドレス への分岐要件があるときに、サブルーチンコールに使用される小さなコードブロック。 Volatile(揮発性) (揮発性) 内容を実行中のアプリケーションとは無関係に変更し得るメモリアドレスは、揮発性 と記述されます。一般的にはメモリマップされるペリフェラルを指します。 メモリマップ参照。 VFP ベクタ浮動小数点。複数のデータ値を 1 つの命令で処理できる浮動小数点コプロセッ サの標準。 Word(ワード) (ワード) 32 ビット単位の情報。ワードの内容は、指定されていない限り符号なし整数とみなさ れます。 ZI ゼロ初期化。初期値を持たない変数の保持に使用される R/W メモリです。通常、この メモリはリセット時にゼロに設定されます。 Glossary-4 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI0151AJ-00 Index The items in this index are listed in alphabetical order, with symbols and numerics appearing at the end. The references given are to page numbers. A E H armar 6-6 ARMLIB variable 6-4 armprof 8-2 ELF 2-3 ELF file format 2-8 Entry point specifying to the linker 2-12, 2-13 Execution profile 8-2 regions and veneers 3-13 Hiding and renaming symbols 2-18, 4-9 C Call graph, profiling 8-2 Command syntax fromelf 7-3 librarian 6-6 linker profiler 8-3 D Disassembly 7-6 ARM DUI 0151A F File formats ELF 2-8 fromELF output 7-7 symdefs 4-7 Files scatter-loading 5-1 steering 4-9 symdefs 4-5 via 2-20 Function call count, profiling 8-2 I Images complex 5-4 examples, scatter-loaded 5-4 regions, overview 3-3 sections 5-7 overview 3-3 simple 3-14 specifying a memory map 3-5 structure of 3-2 Image$$ symbols not defined 5-2 user_initial_stackheap() 5-2 Interworking ARM and Thumb 1-2 Copyright © 2001 ARM Limited. All rights reserved. Index-1 Index L Librarian 6-6 Libraries and linker, see Linker, libraries Linker code and data sizes 2-17 debug information turning on and off 2-11 default addresses 2-9 diagnostics 2-19 entering commands via a file 2-20 execution information 3-4 help on 2-5, 2-17 image construction 2-6 entry point 2-12 keeping sections 2-13 load and execution views 3-4 overview 3-2 structure 3-2 image-related information 2-7 Image$$ errors 5-2 information 2-16, 2-19, 2-20 libraries defaults 2-16 including during link step 6-2 linker search path 2-16 scanning 2-16 load information 3-4 local symbols 2-16 memory attributes 2-20 memory map information 2-2, 2-11, 3-4 messages 2-16, 2-19, 2-20 output file 2-5, 2-8 output formats 2-5 output sections 3-3 overview of 2-2 partial linking 2-8 regions 3-3 RO section base address 2-9, 3-18 RW section base address 2-10 scatter-loading command-line option 2-6, 2-11 software version 2-8 sorting input sections 3-8 standard output stream 2-19 steering files 2-18, 4-9 Index-2 symbols 4-2, 5-2 hiding and renaming 2-18, 4-9 used in link step 2-18 syntax 2-8 undefined symbols 2-20 unused sections 2-12, 2-17 veneers 2-17 version number 2-5 via files 2-5, 2-20 $$ symbols 4-2 Linker options -edit 2-18, 4-9 -elf 2-8 -entry 2-12 -errors 2-19 -first 2-14 -help 2-8 -info 2-17 -keep 2-13 -last 2-15 -libpath 2-16, 6-4 -list 2-19 -locals 2-16 -mangled 2-19, 2-20 -nodebug 2-11 -nolocals 2-16 -noremove 2-12 -noscanlib 2-16 -output 2-8 -partial 2-8 -remove 2-12 -ro-base 2-9 -ropi 2-9 -rw-base 2-10 -rwpi 2-10 -scanlib 2-16 -scatter 2-11, 5-4 -split 2-10 -strict 2-20 -symbols 2-18 -symdefs 2-18 -unmangled 2-19 -unresolved 2-20 -verbose 2-19 -via 2-20 -vsn 2-8 -xreffrom 2-19 M Memory map describing to linker 5-7 overlaid 5-14 specifying 2-11 uninitialized 5-14 P Position independence 2-9 Profiler 8-2 S Scatter-loading description file 5-2 area syntax 5-15 execution region syntax 5-13 FIRST 5-17 LAST 5-17 load region syntax 5-11 pseudo-attributes 5-17 sections 5-7 synonyms in 5-17 error Image$$ZI$$Limit 5-2 linker command-line option 5-4 region matching 5-18 section placement 2-15 section-related symbols 4-4 symbols defined by linker 5-2 +FIRST 2-15 +LAST 2-15 Sections aligning 3-11 attributes 2-2 in region 2-2 input 3-3 multiple matches in scatterloading 5-18 placement of 2-14, 2-15, 3-8, 5-7, 5-17 by attribute 3-9 FIRST and LAST 3-10 in region 3-3 sorting rules 3-8 unused 2-12, 2-17 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI 0151A Index Steering files 2-18, 4-9 Symbols hiding and renaming 4-9 Image$$ undefined 5-2 in another image 4-5 input section-related 4-4 linker 2-18, 4-2, 4-9 region-related 4-2 scatter-loading 5-2 section-related 4-4 stack 4-3 undefined 2-20 ZI 4-2 $$ 4-2 Symdefs file 4-5 Symbols $$ symbols 4-2 T Thumb code 1-2 verneer 3-13 U Uninitialized memory 5-14 V Variables ARMLIB 6-4 Veneers ARM to ARM 3-13 ARM to Thumb 3-13 size 2-17 Thumb to ARM 3-13 Verneers placing 5-22 Via files 2-20 Z ZI symbols 4-2 ARM DUI 0151A Copyright © 2001 ARM Limited. All rights reserved. Index-3 Index Index-4 Copyright © 2001 ARM Limited. All rights reserved. ARM DUI 0151A