编译期间出现分段错误 - 从哪里开始?

编译期间出现分段错误 - 从哪里开始?

我现在有一个需要解决的特定问题,但我真的很想知道解决此类问题的好策略 - 编译其他人的代码时出现分段错误,所以我很高兴获得特定或一般类型的答案。

详情

我正在尝试安装开放式SSLSynology DS412+ 上的 1.0.1g。的版本海湾合作委员会我的 (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(我现在已经尝试了几个版本),但每次它似乎都失败了良好生产规范的一部分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 还没有达到完全要求。我可以设置一个虚拟机,为 ipkg 构建一个二进制文件并将其放在 DS412 上吗?以前没有做过类似的事情,我不知道它的可行性如何。

非常感谢任何帮助或见解。

答案1

我不认为你能够做你想做的事。这些设备类型的设备(例如 Synology)经常使用精简版本的工具(例如 Bash 等)。这些精简版本可能缺少功能,这似乎是您的问题,因为它从非标准位置引入 Bash,即/opt/bin/bash

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

在尝试自己构建这个之前,我会先浏览一下他们的网站或论坛,看看 OpenSSL 是否作为二进制包提供,您可以简单地升级到该包,而不必尝试自己构建它。

答案2

  1. 最后两行看起来很可疑

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

    配置的任何选项(通常)都以--.

  2. 64 位 - 您确定您使用的发行版是 64 位吗?处理器是64位的吗?内核是否在 64 位设备上运行?顺便说一下,使用 64 位代码和 1GB RAM 并没有多大好处。由于某些数据类型和对齐方式的大小较大,它实际上会消耗更多的内存。

  3. 错误

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

    建议问题出在哪里 - 查找源代码gen-fac并尝试在调试器中运行它。

  4. 最后但并非最不重要的一点是,您不能使用ipkg install openssl或任何正确的语法来安装分发包吗?

相关内容