编译一个32位二进制文​​件,在64位Debian wheezy多拱主机上使用ssl

时间:2014-08-15 08:42:12

标签: linux gcc openssl debian 32bit-64bit

我试图编译一个在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&amp; 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 个答案:

答案 0 :(得分:3)

根据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