在 64 位 Debian wheezy 多架构主机上编译使用 ssl 的 32 位二进制文​​件

Posted

技术标签:

【中文标题】在 64 位 Debian wheezy 多架构主机上编译使用 ssl 的 32 位二进制文​​件【英文标题】:Compiling a 32bit binary that uses ssl on a 64bit Debian wheezy multi-arch host 【发布时间】:2014-10-09 00:30:40 【问题描述】:

我正在尝试在 debian wheezy 64 位主机上编译使用 openssl 的 32 位二进制文​​件。

我遵循了我认为添加 i386 架构和安装 libssl1.0.0:i386 的推荐方法。

只是一个简单的测试程序链接失败:

#include <openssl/ssl.h>
int main(void)

    SSL_load_error_strings();
    return 0;


$ gcc -m32 -lssl -o test -Wall test.c
/usr/bin/ld: cannot find -lssl
collect2: error: ld returned 1 exit status

没有 -m32 的相同命令可以正常工作。

我确实有一个 32 位的 libssl:

$ locate libssl | grep i386
/usr/lib/i386-linux-gnu/libssl.so.1.0.0
/usr/lib/i386-linux-gnu/i586/libssl.so.1.0.0
/usr/lib/i386-linux-gnu/i686/cmov/libssl.so.1.0.0

添加 --verbose 显示链接器命令:

/usr/lib/gcc/x86_64-linux-gnu/4.7/collect2 --sysroot=/ --build-id --no-add-needed --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/gcc/x86_64- linux-gnu/4.7/../../../../lib32/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib32/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.7/32/crtbegin.o -L/usr/lib/i386-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.7/32 -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../ ../../i386-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib32 -L/lib/i386-linux- gnu -L/lib/../lib32 -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib32 -L/usr/lib/gcc/x86_64-linux-gnu/4.7 - L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../i386-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../ ../.. -L/lib/i386-linux-gnu -L/usr/lib/i386-linux-gnu -lssl /tmp/ccI9DoNH.o -lgcc --as-needed -lgcc_s --no-as-需要 -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.7/32/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib32/crtn.o

这似乎表明它正在搜索 /usr/lib/i386-linux-gnu/,这是 libssl.so.1.0.0 所在的位置。

根据file,这些文件似乎都是有效的:

/usr/lib/i386-linux-gnu/libssl.so.1.0.0:           ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x56052e2cdbad1207690499400909c6c87209735a, stripped
/usr/lib/i386-linux-gnu/i586/libssl.so.1.0.0:      ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x620bde79657c57fe5ef098d3648ccc2ce4bdb232, stripped
/usr/lib/i386-linux-gnu/i686/cmov/libssl.so.1.0.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x89b973943dfc314c56231d48eddad5fe785f6b12, stripped

我想尝试的另一件事是安装 libssl-dev:i386,但尝试安装它想删除 64 位 gcc 和 g++ 编译器和 64 位 libssl-dev,这让我认为这不是正确的做法(并且可能会阻止我构建 64 位二进制文​​件):

# apt-get install libssl-dev:i386 
<..>
The following packages will be REMOVED:
  build-essential cpp g++ g++-multilib gcc gcc-multilib libssl-dev lib tool
<..>

我试过用谷歌搜索;我发现其他人有同样的问题,但没有解决方案。

【问题讨论】:

【参考方案1】:

根据askubuntu debian wheezy libssl-dev package in wheezy is broken / not multi arch compatible。它似乎在测试中得到修复(jessie),也可能在 Ubuntu 14.04 中得到修复(也许更早的 ubuntu 也是如此)。

以下至少修复了链接器错误:

cd /usr/lib/i386-linux-gnu/
ln -s libssl.so.1.0.0  libssl.so 
ln -s libcrypto.so.1.0.0 libcrypto.so

【讨论】:

出于好奇,您为什么会退回到 i386? x86_64 使用链接寄存器,因此它消除了整个类的漏洞,因为没有要覆盖的堆栈指针。 在这种情况下,客户端有一大堆代码还不是 64 位安全的。 :( 最终它会被移过来。 哦,伙计。很抱歉听到这个消息。这个问题太老了,编译器不再默认启用 64 位可移植性警告(如 /WP64)。

以上是关于在 64 位 Debian wheezy 多架构主机上编译使用 ssl 的 32 位二进制文​​件的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu无法安装ia32-libs库,提示没有可用的软件包

Debian Wheezy 删除安静参数后不显示启动消息

升级debian stable(wheezy)的iceweasel(firefox).

sh 在Kali Linux(或任何其他基于Wheezy的Debian版本)上安装docker

sh 在Raspberry Pi上安装tmux 2.0(Debian 7.8)Raspbian Wheezy

sh 在Raspberry Pi上安装tmux 2.0(Debian 7.8)Raspbian Wheezy