【发布时间】:2021-05-22 10:27:04
【问题描述】:
我(到目前为止)未能成功地将 mosquitto 与 TLS 交叉编译用于嵌入式 armv7 设备。如果没有 TLS,交叉编译也可以正常工作。
嵌入式设备数据:
# cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 2 (v7l)
BogoMIPS : 548.86
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part : 0xc08
CPU revision : 2
Hardware : Generic AM33XX (Flattened Device Tree)
Revision : 0000
Serial : 0000000000000000
# openssl version -a
OpenSSL 1.1.1i 8 Dec 2020
not available
platform: linux-armv4
options: bn(64,32) rc4(char) des(long) idea(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DNDEBUG -DOPENSSL_TLS_SECURITY_LEVEL=0
OPENSSLDIR: "/usr/ssl"
ENGINESDIR: "/usr/lib/engines-1.1"
Seeding source: random-device ( "/dev/urandom" "/dev/random" "/dev/hwrng" "/dev/srandom" )
我从嵌入式设备经销商那里得到了交叉编译器,并安装在我的机器上:
$ mkdir /opt/advantech
$ cd /opt/advantech
$ git clone https://bitbucket.org/bbsmartworx/Toolchains.git
$ sudo dpkg -i Toolchains/deb/*.deb
### The cross compiler is saved under /opt/toolchain/gcc-conel-armv7-linux-gnueabi
接下来,下载与嵌入式设备 (1.1.1i) 中相同版本的 OpenSSL
$ wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz
$ tar xfz openssl-1.1.1i.tar.gz
$ cd openssl-1.1.1i
$ ./Configure linux-armv4 --cross-compile-prefix=/opt/toolchain/gcc-conel-armv7-linux-gnueabi/bin/armv7-linux-gnueabi- --prefix=/opt/arm/v7/openssl/ --openssldir=/opt/arm/v7/openssl shared
### I have also tried using the options I got when doing "openssl version -a" on the embedded device,
### but the final result is the same..
### ./Configure linux-armv4 --cross-compile-prefix=/opt/toolchain/gcc-conel-armv7-linux-gnueabi/bin/armv7-linux-gnueabi- --prefix=/opt/arm/v7/openssl/ --openssldir=/opt/arm/v7/openssl shared -DOPENSSL_USE_NODELETE -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DNDEBUG -DOPENSSL_TLS_SECURITY_LEVEL=0 -fPIC -pthread -Wa,--noexecstack -Wall -O3
$ make
$ make install
$ cd /opt/arm/v7/openssl/bin/
$ file openssl
openssl: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.12.10, stripped
$ ls -la openssl
-rwxr-xr-x 1 eh eh 554356 Feb 19 09:36 openssl
### The file size on my machine does NOT matches the one on the embedded device:
$ ssh root@embedded-device
# ls -la /usr/bin/openssl
-rwxr-xr-x 1 root root 535796 Dec 17 10:36 /usr/bin/openssl
# exit
Connection to embedded-device closed.
在交叉编译器的 sysroot 中移动 OpenSSLs 包含和库:
$ cd /opt/toolchain/gcc-conel-armv7-linux-gnueabi/sysroot/usr/lib
$ sudo cp -P /opt/arm/v7/openssl/lib/libcrypto* .
$ sudo cp -P /opt/arm/v7/openssl/lib/libssl* .
$ cd /opt/toolchain/gcc-conel-armv7-linux-gnueabi/sysroot/usr/include
$ sudo cp -r /opt/arm/v7/openssl/include/openssl .
下载mosquitto并交叉编译
$ wget https://mosquitto.org/files/source/mosquitto-2.0.7.tar.gz
$ tar xvfz mosquitto-2.0.7.tar.gz
$ cd mosquitto-2.0.7
$ make CC=/opt/toolchain/gcc-conel-armv7-linux-gnueabi/bin/armv7-linux-gnueabi-gcc CXX=/opt/toolchain/gcc-conel-armv7-linux-gnueabi/bin/armv7-linux-gnueabi-g++ AR=/opt/toolchain/gcc-conel-armv7-linux-gnueabi/bin/armv7-linux-gnueabi-ar LD=/opt/toolchain/gcc-conel-armv7-linux-gnueabi/bin/armv7-linux-gnueabi-ld
$ file src/mosquitto
src/mosquitto: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.12.10, stripped
$ file lib/libmosquitto.so.1
lib/libmosquitto.so.1: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, stripped
将交叉编译的 mosquitto 和 lib 传输到嵌入式设备:
$ scp src/mosquitto root@embedded-device:/opt/mosquitto/bin/.
$ scp lib/libmosquitto.so.1 root@embedded-device:/usr/lib/.
$ ssh root@embedded-device
# cd /opt/mosquitto/bin/
# ./mosquitto
./mosquitto: symbol lookup error: ./mosquitto: undefined symbol: ENGINE_load_builtin_engines, version OPENSSL_1_1_0
如前所述,当我将 mosquitto 的 config.mk 修改为不使用 TLS 和 TLS_PSK 时,它可以在嵌入式设备上正常工作。
config.mk:
WITH_TLS:=yes # when set to "no", no errors on embedded device
WITH_TLS_PSK:=yes # when set to "no", no errors on embedded device
WITH_CJSON:=no # is always set to no
我应该如何交叉编译 OpenSSL 以 100% 匹配嵌入式设备上安装的版本?
不能在嵌入式设备上更改 OpenSSL。
【问题讨论】:
-
1) 您的
mosquitto-conf文件中是否定义了任何tls_engine 语句? 2) 在您的目标上执行的ls -ail /usr/lib/engines-1.1wheb 的输出是什么? 3) 你试过用CFLAGS=-DOPENSSL_NO_ENGINE编译mosquitto 吗? -
1) 是的。我有一个通过 mqtts 连接的网桥连接,端口 8883.. 我在那里添加了
bridge_cafile、bridge_certfile、bridge_keyfile并有bridge_insecure false2)ls: /usr/lib/engines-1.1: No such file or directory3) 它编译了.. mosquitto 运行!让我尝试连接到 8883。(我会在测试完成后立即回信) -
HI @Frant
CFLAGS=-DOPENSSL_NO_ENGINE解决了这个问题!非常感谢。 -
我很高兴听到这个消息。在这种情况下,如果您不介意,我会在accept 添加您可能想要的答案 - 这应该不会花很长时间。
-
是的..请发布答案。再次感谢,你刚刚度过了我的周末! (过去两天我一直在与交叉编译器作斗争)
标签: openssl cross-compiling embedded-linux mosquitto