66327


諸事情により詳しいソースや手順については記述できないのですが  
先日ABIのみが共通の亜種コンパイラを複数利用してC/C++ソースをバラバラにコンパイル&リンクした所  
リンク時に__dso_handleが複数定義されているというエラーが発生しました

当然ながら滅茶苦茶な方法だったので上記問題は別途解決済みなのですが、__dso_handleの存在がイマイチ理解できずモヤモヤしています

ご存じの方居ればお教えいただけると助かります  
(リンクに使用したコンパイラはGCC系統のもので、ターゲットプラットフォームはlinux系です)


CC BY-SA 4.0
2020-05-04T08:56:03.033
66280
2020-05-05T12:46:10.937
2020-05-04T09:07:41.577
24599
24599
question
gcc
__dso_handleとは何でしょうか？


自己解決しました  
どうやら動的共有オブジェクト(DSO)毎にhiddenオブジェクトとして定義される、一種のDSO識別用ユニークIDのような物のようであり  
主にデストラクタ関数実行時に用いられているようです  
(DSO毎に異なればどのアドレスを格納しても良いらしいです。再配置後の先頭アドレスが多いのかな)

1.最初に、DSOは__cxa_atexitを利用して自身のデストラクタ関数とそのユニークID(__dso_handleの値)を登録し、  
2.対象動的オブジェクトがアンロードされ__cxa_finalize関数が呼び出されると  
登録されているユニークIDを頼りにデストラクタ関数を検索し呼び出します

hiddenオブジェクトとして定義されている__dso_handleはデストラクタの登録に用いられる他  
__cxa_finalizeのラップ関数を作成し、atexitへ渡すことにより終了時呼び出しをする時等に用いられていそうです

私がぶつかった問題は、何かしらの手順ミスにより  
動的ライブラリ内__dso_handleの属性が変化してしまったのだと推測しています

参考  
[Itanium C++ ABIドキュメント](https://itanium-cxx-abi.github.io/cxx-
abi/abi.html#dso-dtor)  
[__cxa_finalize関数](https://refspecs.linuxbase.org/LSB_3.2.0/LSB-Core-
generic/LSB-Core-generic/baselib---cxa_finalize.html)  
[__cxa_atexit関数](https://refspecs.linuxbase.org/LSB_3.2.0/LSB-Core-
generic/LSB-Core-generic/baselib---cxa-atexit.html)  
[darwin-crt3.c(atexit実装例確認ソース)](https://github.com/RTEMS/gnu-mirror-
gcc/blob/master/libgcc/config/darwin-crt3.c)  
[crtftuff.c(__dso_handleとatexitへ渡すラッパ関数の使用例確認ソース)](https://github.com/gcc-
mirror/gcc/blob/master/libgcc/crtstuff.c)

解説が思うように見当たらなかったので(探し方がヘタなだけ？)  
今後悩んだ方の参考になれば幸いです


CC BY-SA 4.0
2020-05-05T11:12:31.693
66327
2020-05-05T12:46:10.937
2020-05-05T12:46:10.937
24599
24599
66280
answer