c++ - 免费的 Pascal/C++ 项目在 cout::sentry 中崩溃

标签 c++ g++ freepascal libstdc++

我有一个混合的 Free Pascal/C++ 项目。在 i386、FPC 2.4.4 上的 Debian 5.0(“Lenny”)。当我运行该程序时,它会在第一个 cout<< 崩溃称呼。有趣的是,它曾经工作了一段时间;一些操作系统更新可能破坏了它。这是孤立的问题:

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";
}

生成文件:

p : c.o p.pas Makefile
    fpc p.pas -k-lstdc++

c.o : c.cpp
    g++ -c c.cpp

制作、运行、段错误。在全新的 Debian VM 上尝试过 - 结果相同。

崩溃发生在 basic_fstream::sentry::sentry() 中。他们声称这个崩溃位置与全局 cout 一致对象未被初始化。这很奇怪 - 我想使用 initc从 Pascal 端确保全局 C++ 变量已初始化。

有什么想法吗?它会不会是我要链接的 libstdc++ 版本(它是 libstdc++.so.6.0.10)?

编辑:它变得越来越奇怪。我在 CentOS 5.3 机器上运行相同的二进制文件 ( p ) - 它像宣传的那样工作。所以可能是关于共享库版本...我会去收集更多关于不同 Linux 的统计数据。

EDIT2:我注意到一件事:当我做 ldd p 时在我的 Debian 机器上,这是我得到的:

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)

所以所有的 C 库(只是 C++ 库除外)都来自 i686/cmov目录。 Debian 机器也有 /lib/libc.so.6 , 它与 cmov 中的不同.那有什么关系 cmov目录?为什么两个不同的 libc 拷贝具有相同的名称?

编辑:即使在 CentOS 上,也不会调用全局构造函数 - 只是使用临时全局对象进行测试。由于某种原因,它不会在 sentry() 中崩溃。看起来这毕竟是 FPC 问题。有一个 bug report在关于此行为的 FPC 中。

最佳答案

事实上,我尝试明确链接到一个静态 c.o(具有所有不同版本的 libstdc++。所以我可以在我的盒子上找到)并且我遇到了同样的失败:

Runtime error 216 at $00007F3B9C9EFAD1
  $00007F3B9C9EFAD1

我很快就会尝试旧的安装。 更新 也无法使链接 c.o 在 Maverick 上工作(gcc 4.4.5 和 fpc 2.4.0-2ubuntu1.10.10)。

只有在更改为动态链接后,我才让它在我的 Natty box 上运行:

在 p.pas 中:

{$L c.so}

生成文件

p : c.so p.pas Makefile
    fpc p.pas

c.so : c.cpp
    g++ -shared -fPIC c.cpp -o $@

运行

$ LD_LIBRARY_PATH=$PWD
$ ./p
Hello world

关于c++ - 免费的 Pascal/C++ 项目在 cout::sentry 中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174998/

相关文章:

c++ - 使用 g++ 时使用 extern "C"{ 对 C++ 代码的影响

c++ - boost 程序选项不适用于 GLIBCXX_DEBUG

delphi - 为什么 Delphi 和 Free Pascal 通常更喜欢有符号整数数据类型而不是无符号整数数据类型?

c++ - 从基类调用继承类的重载函数

c++ - C++中结构数组的memset

c++ - 销毁然后使用相同的变量构造新对象

assembly - x64 代码中的对齐问题,Free Pascal

C++:全局容器未被修改

c++ (g++-4.x) 模板问题

windows - 调试器错误 193 拉撒路