質問するログイン新規登録
GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Q&A

解決済

1回答

649閲覧

GCC リンケージコマンド(ld)で、ライブラリ内のオブジェクトを指定したい。

yu-ima

総合スコア249

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

0グッド

0クリップ

投稿2023/07/17 01:45

0

0

実行モジュールを作成する(ld)コマンドで オブジェクトライブラリを指定してリンクすることは出来たのですが、
ライブラリ内の個々のオブジェクトを指定することは出来ないでしょうか?

[例] ライブラリ全体を指定する。
"${workspace_loc:/DbgTT724Lib/Release/libDbgTT724Lib.a}"    .....OK

[例] ライブラリ内のオブジェクト(xxxx.o)を指定したい。
"${workspace_loc:/DbgTT724Lib/Release/libDbgTT724Lib.a}(xxxx.o)"  ....NG

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2023/07/17 02:08

なぜそのようなことをしたいのでしょうか? ライブラリの中の必要なオブジェクトのみが抽出されてリンクされるので、そのような指定は通常は不要です。
otn

2023/07/17 03:23

個々のオブジェクト毎に、別のライブラリを優先したいと言うことですか? fooもbarも、xxx.a と yyy.a の両方にあるが、fooはxxx.aから barはyyy.aからということ??
matukeso

2023/07/17 03:38

ar -x で.aを.oにほどいたら。
yu-ima

2023/07/17 05:47 編集

皆さん返信ありがとうございます。 なぜ、ライブラリ内の一部を特別に指定したいかというと。 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を指定すれば良いとは思うのですが、ライブラリ内のオブジェクトを直接指定できればと思い質問させていただきました。
otn

2023/07/17 06:18

ldでライブラリの関数を実行モジュールのファイルに組み込まずに、実行時までライブラリーファイル上のままにしておき、 実行時にライブラリーファイルから動的にメモリーに読み込んで関数を実行したい というとなら、質問にお書きのこととは全く関係ありません。
yu-ima

2023/07/17 06:40

ldで作成するhexは、1つの完成された実行モジュールです。 その実行モジュールは、起動時にFlash上の起動処理部分に制御を移されます。 起動処理部分では本体部分を内部メモリーにコピーし、制御を内部メモリー上の本体にジャンプするようになっています。 ldはで、起動部分はflash上のアドレスに割り当て、本体部分は内部メモリー上に割り当てられるようになっています。 このldでの指定で、Flash上に割り当てる部分をxxxx.oと指定できるのですが、 オブジェクトライブラリに保存したオブジェクトyyyy.a(xxxx.o)を指直接定できないかな? という意味です。 分かりにくい説明で申し訳ありません。
otn

2023/07/17 07:19 編集

おそらく、プログラム実行に至る仕組みの理解が間違っているために、質問内容がおかしくなっています。 プログラムは実行時点ではメモリー上に無いとCPUはそれを実行できません。 ストレージ上の実行モジュールファイル名を指定してプログラムを起動した際に、 ケース1:プログラムを全て最初にメモリー上にロードしてから実行する ケース2:プログラムの一部は、ストレージ上のライブラリーファイルなど別ファイルに入っており、そのプログラムが必要となった時点でストレージ上の別ファイルからメモリー上にロードして実行する の2パターンがあります。 プログラムをストレージに置いたままでは実行できません。 コメントが理解できないときは、その旨を書いてください。
ikedas

2023/07/17 07:29 編集

yu-imaさん 質問文に、ライブラリを指定する場合にldに与えるオプションを表示していただけませんか。
ikedas

2023/07/17 07:28

otnさん フラッシュメモリ自体はEEPROMとしての用途もありますので、SSDなどのブロックデバイスを指しているとは限らないと思います。まあ質問者さんの勘違いの可能性もないわけではないですが。
otn

2023/07/17 07:40

あー、なるほど、EEPROMですか。それは思いつきませんでした。 質問を読み返すと、そんな気がしてきました。失礼しました。私のコメントは組み込み専用の特別な仕組みを考慮していませんでした。無視してください。
yu-ima

2023/07/17 14:15 編集

皆さん 返信ありがとうございました。  大変遅くなり申し訳ありません。 ldコマンドの仕様を理解していないために ご迷惑をおかけしました。 話は、 ld -o output.x in1.o in2.o .... inlib1.a inlib2.a ........ ldコマンドで、入力オブジェクト指定の部分にオブジェクト(.o)と、アーカイブ(.a)は指定できるのですが、 アーカイブ内のオブジェクトを直接できないでしょうか? 例えば、 yyyx.a(.xxx.o)のような記述で指定できないでしょうかという質問のつもりでした。
guest

回答1

0

ベストアンサー

このFlash上で動く部分は直接xxxx.oとして指定すれば、Flash上のアドレスに割り当てられるのですが、
このxxxx.oは一旦オブジェクトライブラリに保存してあり ライブラリを指定すれば、自動的にリンクは出来るのですが、内部メモリー上に割り当てられてしまいます

残念ながら、ライブラリの指定であなたの思うようなことはできません。
コード中の各モジュールのメモリ上の配置は、リンカスクリプトというスクリプトで指定します。

まずは、そのリンカスクリプトというのを学習することですね

投稿2023/07/17 11:40

y_waiwai

総合スコア88180

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu-ima

2023/07/17 14:22

回答ありがとうございました。 おっしゃる通りリンカースクリプトに関する質問でした。 なかなか理解できないため 質問のようなことは どのように記述すればできるでしょうか? という問いかけのつもりでした。 結論から言うと、記述できないようですね。
y_waiwai

2023/07/17 20:50

できますよ。 リンカスクリプトやその周辺技術について、基礎から説明するとなると本が一冊書けるほどの量になるため、ここでは説明できません まずは、MAPファイルを見て、各モジュールがどういう配置されてるのかを見てみてはどうでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問