実行モジュールを作成する(ld)コマンドで オブジェクトライブラリを指定してリンクすることは出来たのですが、
ライブラリ内の個々のオブジェクトを指定することは出来ないでしょうか?
[例] ライブラリ全体を指定する。
"${workspace_loc:/DbgTT724Lib/Release/libDbgTT724Lib.a}" .....OK
[例] ライブラリ内のオブジェクト(xxxx.o)を指定したい。
"${workspace_loc:/DbgTT724Lib/Release/libDbgTT724Lib.a}(xxxx.o)" ....NG
なぜそのようなことをしたいのでしょうか?
ライブラリの中の必要なオブジェクトのみが抽出されてリンクされるので、そのような指定は通常は不要です。
個々のオブジェクト毎に、別のライブラリを優先したいと言うことですか?
fooもbarも、xxx.a と yyy.a の両方にあるが、fooはxxx.aから barはyyy.aからということ??
ar -x で.aを.oにほどいたら。
皆さん返信ありがとうございます。
なぜ、ライブラリ内の一部を特別に指定したいかというと。
CPUにrenesasのRZ-A1L用のプログラムをrenesas e2studio(gcc)を使用して作成しているのですが、
RZ-A1Lでは、Flashメモリー上にプログラムを置き 起動時に内部メモリーにコピーして動作します。
この時、起動時の処理としてはFlash上を動作し、本体を内部メモリーにコピーして動きます。
このFlash上で動く部分は直接xxxx.oとして指定すれば、Flash上のアドレスに割り当てられるのですが、
このxxxx.oは一旦オブジェクトライブラリに保存してあり ライブラリを指定すれば、自動的にリンクは出来るのですが、内部メモリー上に割り当てられてしまいます。
そこでリンク時にライブラリ内のオブジェクトという形で使用したいのです。 yyyy.a(xxxx.o)
で、この指定方法がわからないのです。 ....指定できるかどうかもわかりません。
勿論、リンクの前処理としてライブラリからxxxx.oを抽出しておいて、リンクでxxxx.oを指定すれば良いとは思うのですが、ライブラリ内のオブジェクトを直接指定できればと思い質問させていただきました。
ldでライブラリの関数を実行モジュールのファイルに組み込まずに、実行時までライブラリーファイル上のままにしておき、
実行時にライブラリーファイルから動的にメモリーに読み込んで関数を実行したい
というとなら、質問にお書きのこととは全く関係ありません。
ldで作成するhexは、1つの完成された実行モジュールです。
その実行モジュールは、起動時にFlash上の起動処理部分に制御を移されます。 起動処理部分では本体部分を内部メモリーにコピーし、制御を内部メモリー上の本体にジャンプするようになっています。
ldはで、起動部分はflash上のアドレスに割り当て、本体部分は内部メモリー上に割り当てられるようになっています。
このldでの指定で、Flash上に割り当てる部分をxxxx.oと指定できるのですが、 オブジェクトライブラリに保存したオブジェクトyyyy.a(xxxx.o)を指直接定できないかな?
という意味です。
分かりにくい説明で申し訳ありません。
おそらく、プログラム実行に至る仕組みの理解が間違っているために、質問内容がおかしくなっています。
プログラムは実行時点ではメモリー上に無いとCPUはそれを実行できません。
ストレージ上の実行モジュールファイル名を指定してプログラムを起動した際に、
ケース1:プログラムを全て最初にメモリー上にロードしてから実行する
ケース2:プログラムの一部は、ストレージ上のライブラリーファイルなど別ファイルに入っており、そのプログラムが必要となった時点でストレージ上の別ファイルからメモリー上にロードして実行する
の2パターンがあります。
プログラムをストレージに置いたままでは実行できません。
コメントが理解できないときは、その旨を書いてください。
yu-imaさん
質問文に、ライブラリを指定する場合にldに与えるオプションを表示していただけませんか。
otnさん
フラッシュメモリ自体はEEPROMとしての用途もありますので、SSDなどのブロックデバイスを指しているとは限らないと思います。まあ質問者さんの勘違いの可能性もないわけではないですが。
あー、なるほど、EEPROMですか。それは思いつきませんでした。
質問を読み返すと、そんな気がしてきました。失礼しました。私のコメントは組み込み専用の特別な仕組みを考慮していませんでした。無視してください。
皆さん 返信ありがとうございました。 大変遅くなり申し訳ありません。
ldコマンドの仕様を理解していないために ご迷惑をおかけしました。
話は、
ld -o output.x in1.o in2.o .... inlib1.a inlib2.a ........
ldコマンドで、入力オブジェクト指定の部分にオブジェクト(.o)と、アーカイブ(.a)は指定できるのですが、 アーカイブ内のオブジェクトを直接できないでしょうか?
例えば、 yyyx.a(.xxx.o)のような記述で指定できないでしょうかという質問のつもりでした。

回答1件
あなたの回答
tips
プレビュー