DMD在Ubuntu12.10 64位上生成的可执行SEGFULTS,带有加固GCC

DMD在Ubuntu12.10 64位上生成的可执行SEGFULTS,带有加固GCC,gcc,segmentation-fault,d,dmd,gnu-toolchain,Gcc,Segmentation Fault,D,Dmd,Gnu Toolchain,我在使用DMD2.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;

我在使用DMD2.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_.so.1
有所不同

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

LD_PRELOAD=libstdc++.so.6:libgcc_.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
在我的工作中(Ubuntu12.10没有额外的PPA)

根据
gdb-rdmd
f.d
一起运行,它在
gc_init()
中崩溃:


我终于尝试从源代码构建dmd,但结果相同。

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

以下是bug追踪器:

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


或者,找到一种使用非硬化GCC进行D编译的方法。您可能能够独立于Ubuntu的包装构建自己的GCC副本,然后说服DMD使用您的副本而不是Ubuntu的副本。我很抱歉忘记了细节,我已经有一段时间没有跟这个打过架了。

你能在
gdb
下运行这个程序,并在发生故障时使用
where
命令获取堆栈跟踪吗?@CyberShadow:我已经按照你的意愿添加了堆栈跟踪。它在
gc_init()
中崩溃。也许libphobos2已经过时了?我建议尝试删除与d-apt.googlecode.com相关的所有内容,并使用d网站上的官方软件包进行安装。关于从源代码重建问题:安装的文件只包含构建d程序所需的声明,而不包含运行时本身(类似于头文件)。您需要指明Druntime源代码的路径,而不是已安装的声明。Ubuntu包
强化包装器
通过重新映射gcc和ld快捷方式导致了问题。只要用
sudo apt-get-remove-harding-wrapper
删除它,事情就会恢复正常。
per@buddha:~$ gcc --version
gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
    Copyright © 2012 Free Software Foundation, Inc.
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 ()`