arm - 交叉编译中的 libtool:仅在 arm 目标上重新链接问题;i386/x86_64/aarch64 目标没问题
问题描述
我在我的项目(MiniMyth2)中添加了额外的目标:arm 和 aarch64(MiniMyth2 使用交叉编译来为给定平台构建 mythtv 设备)。
我有很好的交叉编译(和工作设备):i386、x86_64 和 aarch64。
所有目标都使用完全相同的包、构建系统、makefile 等构建。要选择目标,我只更改:交叉编译目标字符串和 gcc/ld 标志。
这适用于 i386、x86_64 和 aarch64 - 但不适用于 ARM 目标。
然而,在 ARM 上,我有许多软件包因 libtool 重新链接而失败。通常失败是这样的:
make[11]: Entering directory `/home/piotro/minimyth-dev/script/gtk/glib/work/main.d/glib-2.53.1/gmodule'
//home/piotro/minimyth-dev/images/build/usr/bin/mkdir -p '/home/piotro/minimyth-dev/images/main/usr/lib'
//home/piotro/minimyth-dev/images/build/bin/bash ../libtool --mode=install //home/piotro/minimyth-dev/images/build/usr/bin/install -c libgmodule-2.0.la '/home/piotro/minimyth-dev/images/main/usr/lib'
libtool: warning: relinking 'libgmodule-2.0.la'
libtool: install: (cd /home/piotro/minimyth-dev/script/gtk/glib/work/main.d/glib-2.53.1/gmodule; //home/piotro/minimyth-dev/images/build/bin/bash "/home/piotro/minimyth-dev/script/gtk/glib/work/main.d/glib-2.53.1/libtool" --tag CC --mode=relink armv7a-minimyth-linux-gnueabihf-gcc -Wall -Wstrict-prototypes -Werror=declaration-after-statement -Werror=missing-prototypes -Werror=implicit-function-declaration -Werror=pointer-arith -Werror=init-self -Werror=format=2 -Werror=missing-include-dirs -fvisibility=hidden -pipe -pipe -march=armv7-a -O2 -flto -Wl,-Bsymbolic-functions -Wl,-z,nodelete -Wl,--export-dynamic -version-info 5301:0:5301 -export-dynamic -Wl,--as-needed -pipe -pipe -march=armv7-a -O2 -flto -o libgmodule-2.0.la -rpath /usr/lib libgmodule_2_0_la-gmodule.lo -ldl ../glib/libglib-2.0.la -inst-prefix-dir /home/piotro/minimyth-dev/images/main)
libtool: relink: armv7a-minimyth-linux-gnueabihf-gcc -shared -fPIC -DPIC .libs/libgmodule_2_0_la-gmodule.o -ldl -L/home/piotro/minimyth-dev/images/main/usr/lib -L/usr/lib -lglib-2.0 -lpcre -lpthread -march=armv7-a -O2 -flto -Wl,-Bsymbolic-functions -Wl,-z -Wl,nodelete -Wl,--export-dynamic -Wl,--as-needed -march=armv7-a -O2 -flto -Wl,-soname -Wl,libgmodule-2.0.so.0 -o .libs/libgmodule-2.0.so.0.5301.0
/usr/lib/libgcc_s.so: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status
libtool: error: error: relink 'libgmodule-2.0.la' with the above command before installing it
make[11]: *** [install-libLTLIBRARIES] Error 1
当然 /usr/lib/libgcc_s.so 不会被识别为 x86_64 架构(我在其上交叉编译的操作系统是 x86_64),而目标是 ARM。
但是: 为什么 libtool relinking 正在寻找 /usr/lib/libgcc_s.so 在 ARM 目标上重新链接期间 - 而不是在 i386、x86_64 和 aarch64 目标上?
我的交叉构建过程中目标之间的唯一区别是:目标字符串和 gcc/ld 标志:
NAME: cross-compilation target (in glibc, etc):
c3 -> i586-minimyth-linux-gnu
c3-2 -> i586-minimyth-linux-gnu
pentium-mmx -> i586-minimyth-linux-gnu
atom -> x86_64-minimyth-linux-gnu
x86-64 -> x86_64-minimyth-linux-gnu
armv7 -> armv7a-minimyth-linux-gnueabihf
armv8 -> aarch64-minimyth-linux-gnu
gcc/ld lfags:
c3 -> -march=atom -mtune=atom -O2 -mfpmath=sse -ftree-vectorize -mmovbe
c3-2 -> -march=c3-2 -mtune=c3-2 -Os -mfpmath=sse
pentium-mmx -> -march=pentium-mmx -mtune=generic -Os
atom -> -march=atom -mtune=atom -O2 -mfpmath=sse -ftree-vectorize -mmovbe
x86-64 -> -march=x86-64 -mtune=generic -O3 -mfpmath=sse
armv7 -> -march=armv7-a -O2
armv8 -> -march=armv8-a -O2
和 gcc 通用的:-pipe -flto
ld 对所有人通用:-Wl,--as-needed -pipe -flto
休息(包、makefile 等完全一样)
gcc 是 7.3.0,glibc 是 2.27,binutils 是 2.28.1
解决方案
看起来这个问题中的问题是交叉编译环境中 libtool 的众所周知的问题。
Yocto 项目的人似乎解决了许多 libtool 交叉编译问题。
以下来自 Yocto 项目的补丁允许我将整个项目交叉编译到所有 4 个目标(arm、aarch64、i386 和 x86_64):
推荐阅读
- mysql - 需要 SQL 中的函数来帮助我获取部分数字
- php - 使用导航栏的 PHP 导航
- node.js - 对于 2GB 大小的应用程序,npm run build 花费的时间太长
- ruby-on-rails - Rails Active Storage 文件静态路径
- reactjs - React Lazy 加载的组件丢失它的状态(被卸载)
- ruby-on-rails - 如何限制来自后端的输入字符
- python - 如何在没有已知身高的情况下使用 python selenium 向下滚动?
- javascript - 页面完全硬刷新 - Ctrl+shift+r
- javascript - Spring Boot 删除映射数组作为参数
- c++ - 流输入如何在 C++ 中使用 cin 工作?