障害情報 Edit

目次 Edit

概要 Edit

問題に直面した時、すぐ解決できるように、障害情報を書き留めましょう。
解決できたら、その解決方法を書いておくと、みんなの役に立ちます!

オーバーライド(C++)リンクエラー Edit

障害内容 Edit

C++において、仮想関数がうまく動かない。
リンクエラーが出る。
リンクエラーを回避しようとすると、実行時、アボートする。

エラー文 Edit
undefined reference to ...

ちょっと忘れた。。

原因 Edit

標準ライブラリの実装やリンカスクリプトが原因。

解決方法 Edit

.rodata._ZTV6parent ・・・ vtable
.rodata._ZTI6parent ・・・ type_info
.rodata._ZTS6parent ・・・ なんだっけ・・?

これらを以下のようにリンクすれば、正常に動作する。はず。

.rodata :
{
	*(.rodata)
	*(.rodata.*)
}

しかし、これでは、type_info(C++の型に関するライブラリ)が無いといわれるため、標準ライブラリを実装する必要がある。

補足 Edit

C++のライブラリを実装するのは難しいので、

.rodata :
{
	*(.rodata)
	*(.rodata._ZTV*)
}

とすれば、vtableが使用でき、オーバーライドだけなら実装できる。

現在、標準ライブラリを実装できるように、頑張っています!

リンク時に__gxx_personality_v0と出る Edit

undefined reference to `__gxx_personality_v0'

GCC,G++でリンカスクリプトを使用してコンパイルするとundefined reference to `__gxx_personality_v0'と出てldが完了しない

リンカスクリプトに /DISCARD/ セクションを追加したらコンパイルが通った。

コンパイル時にライブラリを取り込まない設定などは分かりません


Since 2008 July. OS Project Wiki
リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS