1

Ubuntu 12.10 の構成で DMD 2.061 を動作させるのに問題があります。

次のスクリプトを使用して最初にインストールするとき

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

しかし...私はまだ同じsegfaultを取得しています...そして、私は迷っています。そうでなければ、一体何がこの問題を引き起こす可能性がありますか? 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 を再コンパイルし、/linux/bin64/dmd.conf ファイル (または、新しくコンパイルした dmd バイナリに関連する場所) の DFLAGS に「-cflag=-fno-pie」を追加することで回避できます。 .

または、D コンパイルに強化されていない GCC を使用する方法を見つけてください。Ubuntu のパッケージとは別に GCC の独自のコピーを作成し、DMD に Ubuntu の代わりにあなたのコピーを使用するよう説得できるかもしれません。詳細を忘れて申し訳ありません。これと戦ってからしばらく経ちました。

于 2013-01-14T01:58:19.903 に答える