web-dev-qa-db-ja.com

コンパイル中のセグメンテーション違反-どこから始めればよいですか?

私は今解決する必要のある特定の問題を抱えていますが、このタイプの問題に取り組むための良い戦略を本当に知りたいです-他の人のコードをコンパイルするときのセグメンテーション違反なので、特定のタイプまたは一般的なタイプの答えに満足しています。

詳細

Synology DS412 +に OpenSSL 1.0.1gをインストールしようとしています。 [〜#〜] gcc [〜#〜] のバージョン(v4.2.1)には64ビットがコンパイルされていません。OpenSSLは次のように文句を言います。

$ ./config --prefix=/opt         \
           --openssldir=/etc/ssl \
           --libdir=lib          \
           shared                \
           zlib-dynamic
$ make

をちょきちょきと切る!

cryptlib.c:1: sorry, unimplemented: 64-bit mode not compiled in
cryptlib.c: In function 'OPENSSL_ia32cap_loc':
cryptlib.c:677: warning: dereferencing type-punned pointer will break strict-ALi
asing rules
make[1]: *** [cryptlib.o] Error 1

だから、GCC 4.8.2をインストールしようとしています(私は今いくつかのバージョンを試しました)そしてそれが-で失敗するように見えるたびに [〜#〜] gmp [〜#〜]makeの一部。私はGMPをダウンロードして、それをコンパイルしてみることにしました。

$ ./configure --prefix=/opt --build=i386-pc-linux-gnu
$ make

./gen-fac 32 0 >fac_table.h || (rm -f fac_table.h; exit 1)
/opt/bin/bash: line 1: 20507 Segmentation fault      (core dumped) ./gen-fac 32
0 > fac_table.h
make: *** [fac_table.h] Error 1

私はCプログラマーではなく、これは私のコードでもないので、Valgrindを使ってコアを検査する可能性は低いです。私はこれをライブラリのコンパイルで何度も経験しましたが、Cを学ぶことは私の優先リストに載っているものではありません。 ...に代わるものはありますか?

  • 学習C
  • フォーラム/メーリングリストで質問する

私がアクセスできる唯一のパッケージマネージャーはipkgであり、それは完全な召集に達していないGCCを提供しました。 VMをセットアップし、ipkgのバイナリをビルドして、DS412に配置できますか?以前にそのようなことをしたことがないので、それがどれほど実現可能かはわかりません。

どんな助けや洞察も大歓迎です。

2
iain

私はあなたがあなたが望むことをすることができるだろうとは思わない。 Synologyなどのこれらのアプライアンスタイプのデバイスは、Bashなどのツールのストリップダウンバージョンを使用することがよくあります。これらのストリップダウンバージョンには、非標準の場所からBashをプルしているため、問題と思われる機能が不足している可能性があります。 /opt/bin/bash

https://www.synology.com/en-us/products/overview/DS412%2B

これを自分でビルドする前に、彼らのWebサイトまたはフォーラムで、OpenSSLが自分でビルドする代わりにアップグレードできるバイナリパッケージとして提供されているかどうかを確認します。

2
slm
  1. 最後の2行は疑わしいようです

    $ ./config --prefix=/opt         \
           --openssldir=/etc/ssl \
           --libdir=lib          \
           shared                \
           zlib-dynamic
    

    configureのオプションは(通常)--で始まります。

  2. 64ビット-使用しているディストリビューションが64ビットであると確信していますか?プロセッサは64ビットですか?カーネルはデバイスで64ビットで実行されていますか?ちなみに、1GBのRAMだけで64ビットコードを使用してもあまりメリットはありません。一部のデータ型のサイズと配置が大きいため、実際には少し多くのメモリを消費します。

  3. エラー

    /opt/bin/bash: line 1: 20507 Segmentation fault  (core dumped)
        ./gen-fac 32 0 > fac_table.h
    

    問題がどこにあるかを示唆します-gen-facのソースを探し、デバッガーで実行してみてください。

  4. 最後になりましたが、ipkg install opensslや、配布パッケージをインストールするための正しい構文を使用できませんか?

2
peterph