リンクエラーが出てしまいます

[戻る]
さかな 2004/01/16(金) 10:19:19
お世話になっております。また質問ですが、よろしくお願いします。
開発環境は、Windows2000、VC++6.0 SP5、MFCです。

あるソフトの拡張を行っているのですが、リンクでエラーが出てしまいます。
エラー番号も出ていないので、MSDNライブラリでも調べられず、何が何やらさっぱりです…。
エラーメッセージは次のようなものです。

リンク中...
LINK : error : Internal error during ReadSymbolTable
  ExceptionCode            = C0000005
  ExceptionFlags           = 00000000
  ExceptionAddress         = 00462730
  NumberParameters         = 00000002
  ExceptionInformation[ 0] = 00000000
  ExceptionInformation[ 1] = 0059B0B8
CONTEXT:
  Eax    = FFFFFFFF  Esp    = 0012E6B0
  Ebx    = 00000001  Ebp    = 00599008
  Ecx    = 0AD4E25E  Esi    = 00000417
  Edx    = 000000C5  Edi    = 412519B0
  Eip    = 00462730  EFlags = 00010206
  SegCs  = 0000001B  SegDs  = 00000023
  SegSs  = 00000023  SegEs  = 00000023
  SegFs  = 00000038  SegGs  = 00000000
  Dr0    = 0012E6B0  Dr3    = 00000001
  Dr1    = 00599008  Dr6    = 0AD4E25E
  Dr2    = 000018AA  Dr7    = 0000836A
link.exe の実行エラー
ツールの実行がユーザーによって中止されました。

ワークスペース中に7プロジェクトあり、現在拡張しているのはそのうちの1つなので、
他のプロジェクトとのリンクでのエラーです。
拡張しているプロジェクト単体のビルドでは、エラーはでません。

長くなってしまいましたが、少しでも手がかりになるようなことがあれば
ぜひ教えてください。よろしくお願いします。

2004/01/16(金) 16:59:59
>リンク中...
>LINK : error : Internal error during ReadSymbolTable
Internal error なのでリンカー内部のエラーだといっています
つまり、リンカーの作業でオブジェクトファイルなどでの名前の解決ができない等という
エラーとは違うものでしょう ReadingSymbolTable 中に発生したと言っていますから
シンボルテーブルが壊れたとか何とかが原因で例外が発生したのでしょう
>  ExceptionCode            = C0000005
これはアクセス違反を指すようなので対象のテーブルが壊れているか、暴走か何かで
メモリーの内容がおかしくなっているか、スタックがいかれたかといったことがおきたと
推測できます

SP が IP や BP よりも小さいことや、CS が DS や SS とは別の値なのが気になります

内部エラーなのですからマイクロソフトに調査依頼か障害(バグ)報告かをするのがいい
かもしれません

メモリー不足でおきたとすれば、メモリーの増設かページファイルの拡張かで解決するかも
しれません
クリーンビルドするか、拡張しているプロジェクト単体のビルドの後ブートしなおして
メモリーがきれいな状態で他のプロジェクトとのリンクを試してみるといいかもしれません

何か参考になったでしょうか

さかな 2004/01/17(土) 16:27:07
島さん、ご回答ありがとうございます。
なるほど、なかなか直しにくい問題のようですね…。

> >  ExceptionCode            = C0000005
> これはアクセス違反を指すようなので対象のテーブルが壊れているか、暴走か何かで
> メモリーの内容がおかしくなっているか、スタックがいかれたかといったことがおきたと
> 推測できます

なるほど。ええと、さらに質問になってしまうのですが、プロジェクトでアクセスを
規定するような設定はできるのでしょうか?
もしできるなら、それにひっかかっているのかも…。

> SP が IP や BP よりも小さいことや、CS が DS や SS とは別の値なのが気になります

すいません、何のことかわかりません…。

> 内部エラーなのですからマイクロソフトに調査依頼か障害(バグ)報告かをするのがいい
> かもしれません

そんなにおおごとだったとは…。

> メモリー不足でおきたとすれば、メモリーの増設かページファイルの拡張かで解決するかも
> しれません
> クリーンビルドするか、拡張しているプロジェクト単体のビルドの後ブートしなおして
> メモリーがきれいな状態で他のプロジェクトとのリンクを試してみるといいかもしれません

メモリは250Mあるので、足りていると思うのですが…。
何回かクリーンビルドしているのですが、同じエラーが出ます。
ブート後もやってみましたが、同じでした。
また、プロジェクト単体でビルドし、その後リンクすると一見うまくいったように見えるのです
が、実行では“メモリが足りません”とかメッセージが出て終了してしまいます。

一度、アクセス違反のスジを洗ってみて、それでもダメなら何か他のアプローチを
考えることにします。

あと、もしさしつかえなければでいいのですが、上記のようなリンクエラーメッセージ
の内容(ExceptionCodeなど)はどのように調べるのかも教えていただければ幸いです。

では、よろしくお願いします。

2004/01/17(土) 16:59:09
>メモリは250Mあるので、足りていると思うのですが…。
仮想記憶についてご理解が足りないと思わせるお返事です
主記憶とハードディスク上の退避領域(ページファイル)との両者の大きさをあわせた
分が仮想記憶で提供可能な記憶量ですから
>>メモリー不足でおきたとすれば、メモリーの増設かページファイルの拡張かで解決するかも
>>しれません
と書いたのですがお判り頂けなかったようで残念です
ところで、足りていると判断する理由は何でしょうか?
もしかしてリンクという作業についてよくお判りでないのではないのでしょうか?

>また、プロジェクト単体でビルドし、その後リンクすると一見うまくいったように見えるので>が、実行では“メモリが足りません”とかメッセージが出て終了してしまいます。
でしたら総記憶量が足りないと思えます。マザーボード(チップセットやBIOSや)の制限
がありますからどれだけメモリーが増設できるかわかりませんが主記憶の増設とページ
ファイルの拡張とをお試しになってはいかがでしょうか

前回も述べたように Exception Code はリンクエラーの番号ではありません
例外(Windows の構造的例外)について調べてください

さかな 2004/01/18(日) 00:43:37
島さん、ご回答ありがとうございます。
すみません、私の理解が不足していたために、失礼なことを申してしまったようで…。

主記憶とページファイルについては少し聞いたことはありますが、それがリンクと
どう関わっているのか、また、リンクという作業自体も詳しく理解しているわけでは
ありません。
私が拡張する前は、ビルドもリンクも何事もなく、うまくいっていたもので、
たった2、3のクラス(枠のみ)を加えたのみだったので、それでメモリ不足に
なるとは考えつかなかったもので…。
本当に申し訳ありませんでした。

増設できる主記憶が今手元にないので、ひとまず、仮想記憶を増やして(372-744M→744-
2000M)クリーンビルドしてみましたが、先ほどと同じようなリンクエラーが出てしまい、だめ
でした。(先ほどとは少しだけ違うところがありました)エラーコードは以下のようなものです。

---
リンク中...
LINK : error : Internal error during ReadSymbolTable
  ExceptionCode            = C0000005
  ExceptionFlags           = 00000000
  ExceptionAddress         = 00462730
  NumberParameters         = 00000002
  ExceptionInformation[ 0] = 00000000
  ExceptionInformation[ 1] = 097314B0
CONTEXT:
  Eax    = FFFFFFFF  Esp    = 0012E6B0
  Ebx    = 00000001  Ebp    = 0972F400
  Ecx    = 0AD4E25E  Esi    = 00000417
  Edx    = 000000C5  Edi    = 412519B0
  Eip    = 00462730  EFlags = 00010206
  SegCs  = 0000001B  SegDs  = 00000023
  SegSs  = 00000023  SegEs  = 00000023
  SegFs  = 00000038  SegGs  = 00000000
  Dr0    = 0012E6B0  Dr3    = 00000001
  Dr1    = 0972F400  Dr6    = 0AD4E25E
  Dr2    = 00000000  Dr7    = 00000000
link.exe の実行エラー
ツールの実行がユーザーによって中止されました。
---

後は、主記憶を手に入れて増設してみたいと思います。
私の理解が不足しているせいで、ご迷惑をおかけしました。
今後ともよろしくご指導願います。

2004/01/18(日) 02:31:35
メモリー不足だと断定しているわけではなく、可能性があるということです。
ですから失礼などと感じてすらいません(そのように受け取られるとしたら
私の表現力が拙(つたな)いという事です)し、迷惑を被(こうむ)っても
いません。

ですから、メモリーを増設した結果解決しなくても、私を恨まないで下さい

>クリーンビルドしてみましたが、先ほどと同じようなリンクエラーが出てしまい、だめ
>でした。(先ほどとは少しだけ違うところがありました)エラーコードは以下のような
>ものです。
確かに幾つか異なるようですが、基本的な部分は変わっていないようです
(というよりも Dr0 〜 Dr7 の値がどういう意味かは私には判りません)
特に BP 以外同じ値だということの方が注意を引きます
  IP と SP とが同じということはほぼ同一の条件で例外がおきているらしいと
  思えます。にもかかわらず、 BP が違っているのはどういうことなんでしょう?
  例外が発生する以前にスタックが壊れているということなんでしょうか?

>>また、プロジェクト単体でビルドし、その後リンクすると一見うまくいったように見えるの
>>ですが、実行では“メモリが足りません”とかメッセージが出て終了してしまいます。
と前回書いてらっしゃいますから、この方法(プロジェクト単体でビルドし、その後リンク
する)でプログラムを作成してみてはいかがでしょうか
又、デバッグビルドでなくリリースビルドならどうなりますか

他に考えられるのは SP (サービスパック)はどこまで当てているか調べるとか
VC++ 7.1 に開発環境を移行してみるとかいったことも考えてみたほうがいいかも
しれませんね

渋木宏明(ひどり) [E-Mail] [HomePage] 2004/01/18(日) 03:04:07
>他に考えられるのは SP (サービスパック)はどこまで当てているか調べるとか
>VC++ 7.1 に開発環境を移行してみるとかいったことも考えてみたほうがいいかも
>しれませんね

あと、別のマシンでビルドしてみるとか。

このエラーは通常リンカが出力するエラーとは異なり、リンク作業中にかなり致命的な
エラーが発生していることをレポートするものです。

ビルドを行っている環境に何か問題があるのかもしれませんし、リンカのバグという線
も考えられます。

wood 2004/01/18(日) 05:40:46
>たった2、3のクラス(枠のみ)を加えたのみだったので
どう言う加え方したのか、参考にお聞かせ願えませんか
たとえば 構造体やUNION、追加したとか
char型で4K超えるエリア確保追加したとか

コーディング内容によって、ページングサイズ超えると障害を引き起こしやすく
なる例がありますよ

コンパイル環境にプロセッサーパック使っていませんか
標準提供以外の他社(MS以外)ライブラリーやネットで拾ってきたもの
のリンクしてませんか

最適化オプション指定してませんか
コンパイル時からの最適化オプションはずすと直るケースもあるよ

リンクだけ別にオーディナルリンクに変えてバッチでリンクしてみるのも
ひとつの手ですね

OSのサービスパックは更新してますか?
環境変数 TMPの指し示すドライブに十分な空きありますか
最低でも、リンク対象になるOBJ、LIB、DLLのファイルサイズ合計の
3倍以上
確かコンソールアプリで3PASS(結構昔の話ですけど)だったはず
ターゲットがWindowアプリの場合、それ以上のPASSが実行されるはず
なのでそれぞれの中間(TEMP)領域が必要なはずです

実行時のメモリ不足については、タスクマネージャを監視しながらデバック実行
すればある程度、原因になっているステップが見当つくものですがね
やってみたことありますか

ほかにインストール時の注意なんですけど
VCインストール後にOFFICEのインストールなんてしてませんよね
Office2000までは後からインストールしてあったりすると、障害引き起こしやすいし
Win2000の場合、Administratora以外でサービスパック(OS、Visual Studio)
当てたりすると重要なモジュール置き換えできなかったりします
この辺はどうですか?

仮想メモリの常駐サイズは通常 物理メモリサイズ*1.25を最低とし
最大 物理メモリサイズ*3くらいで十分なものです
CPUタイプ(intel セレロンン、P3,P4、AMD)によって多少違うみたいですけど

Visual Studioを実行していない状態での「タスクマネージャ」・「利用可能 物理メ
モリ」はどのくらいになってますか?

さかな 2004/01/21(水) 15:39:38
[[解決]]
みなさま、いろいろなアドバイスありがとうございます。

> >たった2、3のクラス(枠のみ)を加えたのみだったので
> どう言う加え方したのか、参考にお聞かせ願えませんか

ClassWizardを用いてCViewクラスの継承クラスを加えました。
自動的に作成されるメンバ関数のみで、他は変数、関数とも付け加えていません。

試しに、クラスを1つだけ加えてみました。(加え方は前と同じで、CViewの継承クラスです)
そうすると、
---
nafxcwd.lib(oledoctg.obj) : fatal error LNK1143: ファイルが無効であるか、 または壊れて
います: comdat セクション 0x17 のシンボルがありません。
link.exe の実行エラー
---
と出たので、どうやらnafxcwd.libのファイルが壊れていたようです。

また、別のマシンでビルドするとうまくいきました。

VC++6.0をアンインストールし、再インストールしてSP5を当てなおすことで解決しました。
てっきりプログラムが悪いと思っていたので、お騒がせして申し訳ありませんでしたm(_ _)m

> VCインストール後にOFFICEのインストールなんてしてませんよね
> Office2000までは後からインストールしてあったりすると、障害引き起こしやすいし

たぶんこれをやったような気がします。知りませんでした。
勉強になりました。ありがとうございます。

これを機に、リンカや開発環境に関しても勉強したいと思います。
みなさま、どうもありがとうございました。
また稚拙な質問をしてしまうかもしれませんが、これからもよろしくお願い致します。

2004/01/22(木) 00:09:03
>と出たので、どうやらnafxcwd.libのファイルが壊れていたようです。
>
>また、別のマシンでビルドするとうまくいきました。
>
>VC++6.0をアンインストールし、再インストールしてSP5を当てなおすことで解決しました。
>てっきりプログラムが悪いと思っていたので、お騒がせして申し訳ありませんでしたm(_ _)m

前回の症状とは異なる(前回はファイルが壊れているとは報告していない)のでこのファイルが
壊れていることだけが原因だったかどうかははっきりしませんが、症状がおさまってよかった
ですね。クラスを追加した時点前後にHDにどういう変更(変化)があったかが判ると何か
ヒントが得られるかもしれませんね

さかな 2004/01/22(木) 01:09:08
島さん、いろいろなアドバイスありがとうございました。

そうですね、結局アンインスト、再インストで解決したので、原因は特定できないですね(汗
HD等もこれからチェックするようにします。
どうもありがとうございました。またよろしくお願いします。

古いスレッドには追加発言できません。