1

我在让 DMD 2.061 处理我的 Ubuntu 12.10 配置时遇到问题。

当我第一次使用以下脚本安装它时

if grep -qE "^deb http://d-apt.googlecode.com/files /" /etc/apt/sources.list; then
    echo "Already there";
else
    echo 'deb http://d-apt.googlecode.com/files /' | sudo tee -a /etc/apt/sources.list;
fi

sudo apt-get update -q=2;
sudo apt-get --yes --allow-unauthenticated install d-apt-keyring;
sudo apt-get update -q=2;

sudo apt-get install -y dmd;
sudo apt-get install -y libgtkd-dev libgtkd-doc;
sudo apt-get install -y libtango-dev libtango-doc;
sudo apt-get install -y libdcollections-dev libdcollections-doc;
sudo apt-get install -y liborange-dmd-dev liborange-dmd-doc;
sudo apt-get install -y libderelict-dev;
sudo apt-get install -y libgl3n-dev libgl3n-doc;
sudo apt-get install -y libdsqlite-dev libdsqlite-doc;
sudo apt-get install -y libspiritd-dev libspiritd-doc;
sudo apt-get install -y libdstats-dev libdstats-doc;
sudo apt-get install -y libmsgpack-dmd-dev libmsgpack-dmd-doc;
sudo apt-get install -y vibe vibe-doc;

一切正常。

但...

然后突然在我从一些 Ubuntu PPA 安装了我最喜欢的软件后,代码dmd 会生成段错误。由于我使用了很多额外的 PPA,因此要找出导致崩溃的 PPA 并不容易。我已经在默认(未修改)用户上尝试过这个。

具体命令

strace -f dmd -run f.d

其中f.d包含

import std.stdio;
void main(string args[])
{
  auto x = 0b10;
  writeln(x);
}

崩溃为

getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
brk(0)                                  = 0x1908000
brk(0x1929000)                          = 0x1929000
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV (core dumped) +++

接下来我尝试比较 dmd 使用的所有动态库的 sha1sum,然后是我的程序:

linux-vdso.so.1 =>  (0x00007ffff53ff000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f87f0ba0000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f87f0983000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f87f0686000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f87f0470000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f87f00b1000)
/lib64/ld-linux-x86-64.so.2 (0x00007f87f0ecf000)

到我的电视系统上默认安装的没有额外 PPA 的那些。

事实证明,情况/usr/lib/x86_64-linux-gnu/libstdc++.so.6有所/lib/x86_64-linux-gnu/libgcc_s.so.1不同。

然后我将这些文件复制到我的原始系统并使用

LD_PRELOAD=libstdc++.so.6:libgcc_s.so.1

但是......我仍然得到同样的段错误......我迷路了。否则到底是什么导致了这个问题?我应该开始比较 dmd 和我的程序读取的文件(由 strace 收集)吗?

我的系统与 gcc、g++ 一起在其他地方工作。所以我发布这个是希望我的配置可能发现了从 DMD 生成的代码中的一个漏洞。

最后,我在失败的系统上打印一些关于编译器版本的默认值

dummy@lappis:~$ gcc --version
gcc-4.7.real (Ubuntu/Linaro 4.7.2-5ubuntu1) 4.7.2

dummy@lappis:~$ dpkg -S /usr/bin/gcc-4.7
diversion by hardening-wrapper from: /usr/bin/gcc-4.7
diversion by hardening-wrapper to: /usr/bin/gcc-4.7.real
gcc-4.7, hardening-wrapper: /usr/bin/gcc-4.7

在我的工作中(没有额外 PPA 的 Ubuntu 12.10)

per@buddha:~$ gcc --version
gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
    Copyright © 2012 Free Software Foundation, Inc.

根据gdb rdmd运行f.d它崩溃gc_init()

Program received signal SIGSEGV, Segmentation fault.
0x0000000000417fec in gc_init ()
(gdb) where
#0  0x0000000000417fec in gc_init ()
#1  0x0000000000416a22 in rt.dmain2._d_run_main() ()
#2  0x0000000000416546 in rt.dmain2._d_run_main() ()
#3  0x00000000004164fd in _d_run_main ()
#4  0x000000000041633b in main ()`

我终于尝试从源代码构建 dmd 但具有相同的段错误结果。

4

1 回答 1

2

这听起来像是我之前在 Gentoo 上使用 Hardened GCC 时遇到的问题。

这是错误跟踪器: http ://d.puremagic.com/issues/show_bug.cgi?id=5278

您可以通过使用此补丁重新编译 DMD,然后将“-cflag=-fno-pie”添加到 /linux/bin64/dmd.conf 文件(或与新编译的 dmd 二进制文件相关的任何位置)中的 DFLAGS 来解决此问题.

或者,找到一种使用非硬化 GCC 进行 D 编译的方法。您也许可以将自己的 GCC 副本与 Ubuntu 的包装分开,然后说服 DMD 使用您的副本而不是 Ubuntu 的副本。很抱歉忘记了细节,我已经有一段时间没有和这个人打架了。

于 2013-01-14T01:58:19.903 回答