我在使用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但具有相同的segfaulting结果。
答案 0 :(得分:2)
这听起来像我之前在Gentoo上使用Hardened GCC的问题。
以下是错误跟踪器: http://d.puremagic.com/issues/show_bug.cgi?id=5278
您可以通过使用this patch重新编译DMD然后将“-cflag = -fno-pie”添加到/linux/bin64/dmd.conf文件中的DFLAGS(或者相对于它的任何地方)来解决此问题。你新编译的dmd二进制文件。)
或者,找到一种方法来使用非强化GCC进行D编译。您可以构建自己的GCC副本,与Ubuntu的包装分开,然后说服DMD使用您的副本而不是Ubuntu。我为忘记细节而道歉,自从我与这个细节斗争以来已经有一段时间了。