Free Pascal /C++プロジェクトが混在しています。i386、FPC2.4.4上のDebian 5.0( "Lenny")。プログラムを実行すると、最初のcout<<呼び出しでクラッシュします。おかしなことに、それはしばらくの間機能していました。いくつかのOSアップデートはおそらくそれを壊しました。分離された問題は次のとおりです。
p.pas:
{$L c.o}
program p;
uses initc;
procedure Hello; cdecl; external name 'Hello';
begin
Hello;
end.
c.cpp:
#include <iostream>
//void * __dso_handle; //You might need to uncomment that
extern "C" void Hello()
{
std::cout << "Hello world";
}
Makefile:
p : c.o p.pas Makefile
fpc p.pas -k-lstdc++
c.o : c.cpp
g++ -c c.cpp
作成、実行、セグメンテーション違反。まったく新しいDebianVMを試してみました-同じ結果です。
クラッシュはbasic_fstream::セントリー::sentry()内で発生します。cout彼らは、このクラッシュの場所は、初期化されていないグローバルオブジェクトと一致していると主張しています。これは奇妙なinitcことです。Pascal側から使用すると、グローバルC++変数が確実に初期化されると思いました。
何かアイデアはありますか?どういうわけか、リンクしているlibstdc ++のバージョン(libstdc ++。so.6.0.10)でしょうか?
編集:それはますます奇妙になります。pCentOS 5.3ボックスで同じバイナリ()を実行します-宣伝どおりに機能します。おそらくそれは共有ライブラリバージョンに関するものです...私はさまざまなLinucesに関するいくつかの統計を収集しに行きます。
EDIT2:私が気づいたことの1つ:ldd pDebianボックスで行うと、次のようになります。
linux-gate.so.1 => (0xb77a6000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb76a6000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb754b000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7524000)
/lib/ld-linux.so.2 (0xb77a7000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7517000)
そして、それが機能するCentOSボックスで同じことをすると:
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7ec2000)
libc.so.6 => /lib/libc.so.6 (0xb7d69000)
libm.so.6 => /lib/libm.so.6 (0xb7d40000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7d34000)
/lib/ld-linux.so.2 (0xb7fb7000)
i686/cmovしたがって、すべてのCライブラリ(C ++ライブラリだけでなく)はディレクトリから取得されます。Debianマシンにもがあり/lib/libc.so.6、のマシンとは異なりcmovます。cmovそのディレクトリとの取引は何ですか?そして、なぜ同じ名前のlibcの2つの異なるコピーがあるのでしょうか。
編集:CentOSでも、グローバルコンストラクターは呼び出されません-アドホックグローバルオブジェクトでテストされただけです。何らかの理由でsentry()でクラッシュすることはありません。結局、これはFPCの問題のようです。この動作に関するバグレポートがFPCにあります。