我现在有一个需要解决的特定问题,但我真的很想知道解决此类问题的好策略 - 编译其他人的代码时出现分段错误,所以我很高兴获得特定或一般类型的答案。
详情
我正在尝试安装开放式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
最后两行看起来很可疑
$ ./config --prefix=/opt \ --openssldir=/etc/ssl \ --libdir=lib \ shared \ zlib-dynamic
配置的任何选项(通常)都以
--
.64 位 - 您确定您使用的发行版是 64 位吗?处理器是64位的吗?内核是否在 64 位设备上运行?顺便说一下,使用 64 位代码和 1GB RAM 并没有多大好处。由于某些数据类型和对齐方式的大小较大,它实际上会消耗更多的内存。
错误
/opt/bin/bash: line 1: 20507 Segmentation fault (core dumped) ./gen-fac 32 0 > fac_table.h
建议问题出在哪里 - 查找源代码
gen-fac
并尝试在调试器中运行它。最后但并非最不重要的一点是,您不能使用
ipkg install openssl
或任何正确的语法来安装分发包吗?