GCCのスタティックリンクの順番は大事

gccでライブラリをリンクするときは引数の順番をちゃんとしないとエラーになる。gccはリンクする際に引数の順番にライブラリを読んでいきそこで見つからない関数(どこか他のライブラリにあるはず)を見つけるとそれを「見つからないテーブル」に登録する。ライブラリを読み込む中でこの見つからないテーブルにある関数が見つかるとそれを解決する。問題は再帰的にやってくれないことで発生する。どうやら速度上の問題でそうなっているらしい。ライブラリの依存関係が相互依存する場合は同じライブラリを2回指定して回避する。

これはあくまでライブラリをリンクするときでオブジェクトファイルをリンクするときには当てはまらない。

実験

func.c

main.c

再帰的に検索する

-Wl,–start-group-Wl,–end-groupでライブラリを括るとこの問題が解決できるが先にも書いたように遅くなる場合がある。

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)