Renesas Synergy™

FAQ 104123 : リロケータブルファイル(*.rel)とライブラリファイル(*.lib)の違いを教えて下さい。

回答

どちらも、複数のオブジェクトファイル(*.obj)を1つのファイルにまとめたものです。
アブソリュートファイル(*.abs)を生成する際のリンケージエディタの動作が異なります。

[ライブラリファイル]
リンク時、あるオブジェクトファイル(*1)から参照されるシンボル(関数または変数)の定義が他のどのオブジェクトファイルからも見つからなかった場合、リンケージエディタはリンクオプションで指定されたライブラリファイルの中から未定義シンボルを探してリンクします。
このとき、モジュール単位(ライブラリファイルを構成するオブジェクトファイル単位)でリンクされ、参照されるシンボルが全く無いモジュールはリンクされません。
このため、リンケージエディタの最適化がOFFであっても、未参照シンボルを削除でき、ROMサイズが削減できる可能性があります。
しかし、同名のシンボルが複数のライブラリファイル、あるいはオブジェクトファイルに存在するような場合には、アプリケーションの不具合の元にもなりますので、どのシンボルが使用されたのか注意する必要があります。
どのモジュールのシンボルがリンクされたかは、リンケージリスト(*.map)を参照することで確認できます。
(*1) アブソリュートファイルを生成する際には、1つ以上のオブジェクトファイルをリンクする必要があります。

[リロケータブルファイル]
ライブラリファイルと異なり、リロケータブルファイルに含まれるモジュールは全てリンクされます。
このため、未参照シンボルが削除されません(ただし、リンケージエディタの未参照シンボル削除最適化を使用することができます)。
同名のシンボルが複数のリロケータブルファイルに存在する場合には、リンク時にduplicatesymbolエラーが発生するため、複数のシンボルが存在していたことを確認できます。

適用製品

SuperHファミリ用C/C++コンパイラパッケージ
H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ
他にご質問がございましたら、リクエストを送信してください