読者です 読者をやめる 読者になる 読者になる

共有オブジェクトの中のスタティックリンクライブラリの中のstaticなオブジェクト

分かりにくいバグでふと思い出した、EmpireTohu開発初期に遭遇した性質の悪いバグを現実逃避がてらにメモ。
実行ファイル(.exeとか)と共有オブジェクト(.dllとか.soとか)が同じスタティックリンクライブラリをリンクしており、そのライブラリの中にstaticなオブジェクトがある場合、そのオブジェクトに変更を加える操作をやるとたまにSegる、というもの。Linux限定だったかも。
知っていればすぐに思い当たりそうだけど、知らなかった上に「必ず」ではなく「たまに」Segるという性質の悪さにより3日くらい悩まされた。
結局実行ファイルに該当のスタティックリンクライブラリを全部丸ごと含めるようにし(-Wl,--whole-archive libhoge.a)、共有オブジェクト側は実行ファイル側から提供されるインターフェースを通してのみライブラリ内のオブジェクトを操作できる、という風にして解決している。ダイナミックリンクライブラリ化する方がいいんだろうけど、面倒なので未だそのまま。