【问题标题】:Are all ARMs created equal?所有的 ARM 都是平等的吗?
【发布时间】:2021-06-30 12:24:04
【问题描述】:

我有一个来自旧硬件 (W315 from Moxa) 的工具链,当我在其库文件上运行 file 时,我得到了这个:

[bf@localhost arm-linux-gnueabi]$ file /usr/local/arm-linux/lib/libssl.so.0.9.8 
/usr/local/arm-linux/lib/libssl.so.0.9.8: ELF 32-bit LSB shared object, ARM, version 1 (ARM), dynamically linked, not stripped

如您所见,这个 OpenSSL 库相当陈旧,不支持(至少)我需要的 TLSv1.2。因此,我试图找到该库的较新版本的 ARM 二进制文件。我从 Debian 找到了 1.0.0,但签名略有不同:

[bf@localhost arm-linux-gnueabi]$ file libssl.so.1.0.0 
libssl.so.1.0.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=83c83f5d3da36759c7adc837405b28539569d26e, stripped

它们都是 32 位和 ELF,但我不确定“ARM”部分是否具有可比性。

我可以在我的应用程序中使用那个 1.0.0 库吗?如果没有,我应该在寻找正确的二进制文件时寻找什么?

来自cat /proc/cpuinfo的结果:

root@Moxa:/home/fabs# cat /proc/cpuinfo
Processor   : ARM922Tid(wb) rev 1 (v4l)
BogoMIPS    : 76.59
Features    : swp half thumb 
CPU implementer : 0x66
CPU architecture: 4
CPU variant : 0x0
CPU part    : 0x526
CPU revision    : 1
Cache type  : VIVT write-back
Cache clean : cp15 c7 ops
Cache lockdown  : format B
Cache format    : Harvard
I size      : 16384
I assoc     : 2
I line length   : 16
I sets      : 512
D size      : 16384
D assoc     : 2
D line length   : 16
D sets      : 512

Hardware    : Moxa CPU development platform
Revision    : 0000
Serial      : 0000000000000000

【问题讨论】:

  • 您可能应该为您的目标交叉编译最近的 openssl (1.1.1k),因为不再支持 1.1.0、1.0.2、1.0.0。在您的 W315 系统上,命令 uname -a 的输出是什么?
  • @Frant Linux Moxa 2.6.9-uc0 #4 Mon Jul 12 13:16:33 CST 2010 armv4tl unknown。我认为构建一个更新的 openssl 会很棘手。
  • cat /proc/cpuinfo 的输出?我会为您提供正确的程序。
  • @Frant 查看更新的问题
  • ARM 绝对不是生来平等的。上面写着v4l,但看起来应该是armv5t。您需要确保二进制文件是为旧的东西制作的,和/或您必须重新编译它。您的系统不太可能拥有最先进的工具链,最近放弃了对 armv4 的支持(不确定 armv5),您可能需要一段时间才能担心它可能会发挥作用,并且您需要使用较旧的 gcc,例如 8。 x 或 9.x 或更早版本。 (一般在 5.x.x 之后输出质量变差了)

标签: arm embedded libraries


【解决方案1】:

不,他们不是。但是您可以使用以下过程为您的平台构建一个最新/受支持/安全的 openssl 版本:

# openssl
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
tar zxf openssl-1.1.1k.tar.gz

# a toolchain I know is working for arm922t according to gcc documentation
wget "https://releases.linaro.org/components/toolchain/binaries/latest-6/arm-linux-gnueabi/gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabi.tar.xz" -O gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabi.tar.xz
mkdir -p /opt/arm/6
tar Jxf gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabi.tar.xz -C /opt/arm/6

# building
cd openssl-1.1.1k
./Configure linux-generic32 --cross-compile-prefix=/opt/arm/6/gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- --prefix=/opt/openssl-1.1.1k --openssldir=/opt/openssl-1.1.1k

编辑Makefile,并替换

CFLAGS=-Wall -O3

作者:

CFLAGS=-Wall -O3 -march=armv4t -mcpu=arm922t

然后:

make install

ls -gG /opt/openssl-1.1.1k/bin/
    total 576
-rwxr-xr-x 1   6214 Jun 30 12:53 c_rehash
-rwxr-xr-x 1 579740 Jun 30 12:53 openssl

ls -gG /opt/openssl-1.1.1k/lib
    total 6432
drwxr-xr-x 2    4096 Jun 30 12:53 engines-1.1
-rw-r--r-- 1 3312034 Jun 30 12:53 libcrypto.a
lrwxrwxrwx 1      16 Jun 30 12:53 libcrypto.so -> libcrypto.so.1.1
-rwxr-xr-x 1 2152072 Jun 30 12:53 libcrypto.so.1.1
-rw-r--r-- 1  603100 Jun 30 12:53 libssl.a
lrwxrwxrwx 1      13 Jun 30 12:53 libssl.so -> libssl.so.1.1
-rwxr-xr-x 1  502704 Jun 30 12:53 libssl.so.1

file /opt/openssl-1.1.1k/bin/openssl
/opt/openssl-1.1.1k/bin/openssl: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=7b0e69c478f4c7390d416247f95ac60d9a632bd8, with debug_info, not stripped

如果需要,您可以通过在配置命令末尾添加-static 选项来构建静态版本:

./Configure linux-generic32 --cross-compile-prefix=/opt/arm/6/gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- --prefix=/opt/openssl-1.1.1k --openssldir=/opt/openssl-1.1.1k -static

【讨论】:

  • 非常感谢,我来得很慢,但是当尝试使用 /usr/local/arm-linux/bin/arm-linux-gcc -o helloworld libssl.a libcrypto.a helloworld.c 编译我的应用程序时,我在 SSL_library_init() 上得到一个未定义的引用。 API 和 0.9.8 有区别吗?
  • 另一个问题似乎是这个工具链生成的二进制文件不能在我的设备上运行。 (动态链接时出现“找不到文件”,静态链接时出现“分段错误”;即使对于简单的“Hello World”程序也是如此)。
  • 我使用了我现有的工具链,并设法构建了.so 文件。将它们复制到设备上,并做一些包含文件的魔术,我让它工作了。非常感谢!
  • @Bart Friederichs:我猜你的SSL_library_init() 相关问题的答案是肯定的。我将下载工具链并尝试找出为什么 gcc 6 无法为您的系统构建可执行文件 - 这可能与您的系统使用的 glibc 版本有关。
  • 没有。 SSL_library_init 调用在ssl.h 文件中定义。我使用 0.9.8 头文件来构建 1.1.1k 库。在我修复它之后,它起作用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2011-06-12
  • 2013-09-02
  • 2017-12-04
  • 1970-01-01
相关资源
最近更新 更多