如何解决clang ASAN 交叉编译忽略 sysroot 用于 --whole-archive
我使用 debian x86_64 进行交叉编译,并通过使用 --sysroot
指向目标架构的完整文件系统(即 /cache/arm64
或 /cache/armel
)来同时针对 aarch64 和 armv6l。我使用 qemu-debootstrap
创建 /cache/arm64
和 /cache/armel
debian 系统,在这些系统上包含必要的 *-dev 包,然后通过简单地将整个缓存系统声明为系统根 (--sysroot=/cache/arm64
)。这对 gcc-8
很有效,但我在使用 address-sanitizer 与 clang-7
交叉编译时遇到问题。
例如,对于 aarch64,链接器会抱怨:
/usr/bin/aarch64-linux-gnu-ld: cannot find /usr/lib/llvm-7/lib/clang/7.0.1/lib/linux/libclang_rt.asan-aarch64.a: No such file or directory
libclang_rt.asan-aarch64.a
来自 libclang-common-7-dev:
dpkg -S /usr/lib/llvm-7/lib/clang/7.0.1/lib/linux/libclang_rt.asan-aarch64.a
libclang-common-7-dev: /usr/lib/llvm-7/lib/clang/7.0.1/lib/linux/libclang_rt.asan-aarch64.a
这个包和文件安装在arm64系统上。使用 clang -v
我可以看到链接器正在尝试使用 --whole-archive /usr/lib/llvm-7/lib/clang/7.0.1/lib/linux/libclang_rt.asan-aarch64.a
,但我需要它来使用 --whole-archive /cache/arm64/usr/lib/llvm-7/lib/clang/7.0.1/lib/linux/libclang_rt.asan-aarch64.a
。 --sysroot
选项会更改链接器中的所有 -L
选项,但不会更改此 --whole-archive
选项。
我可以手动更改链接器命令以完成编译。但是,我还有更多问题。
似乎没有使用/cache/arm64/lib/aarch64-linux-gnu/
,而是在主机系统上使用了/lib/aarch64-linux-gnu/
。如果我 rsync
所有 /cache/arm64/lib/aarch64-linux-gnu/
文件在主机上/lib/aarch64-linux-gnu/
,并且还手动更改链接器命令,那么它“成功”,除了当我 {{ 1}} 进入目标系统:
chroot
我采用这种 # chroot /cache/arm64 /bin/bash
# ./binary
==13339==Sanitizer CHECK failed: /build/llvm-toolchain-7-whi4O5/llvm-toolchain-7-7.0.1/projects/compiler-rt/lib/sanitizer_common/sanitizer_procmaps_common.cc:83 ((data_.proc_self_maps.mmaped_size)) > ((0)) (0,0)
方法的动机仅仅是因为它很简单。它避免了 --sysroot
并将库加载到主机上。此外,对于 libclang-common-7-dev 中的 dpkg --add-architecture arm64
,如果我愿意,我无法加载 libclang_rt.asan-aarch64.a
;它与 libclang-common-7-dev:arm64
包冲突:
clang
我的 apt install libclang-common-7-dev:arm64
Reading package lists... Done
Building dependency tree... Done
The following additional packages will be installed:
gcc-8-base:arm64 libbsd0:arm64 libbsd0 libc6:arm64 libedit2:arm64 libffi6:arm64 libgcc1:arm64
libidn2-0:arm64 libllvm7:arm64 libstdc++6:arm64 libtinfo6:arm64 libunistring2:arm64 zlib1g:arm64
Suggested packages:
glibc-doc:arm64 locales:arm64
The following packages will be REMOVED:
clang-7 libclang-common-7-dev
The following NEW packages will be installed:
gcc-8-base:arm64 libbsd0:arm64 libc6:arm64 libclang-common-7-dev:arm64 libedit2:arm64 libffi6:arm64
libgcc1:arm64 libidn2-0:arm64 libllvm7:arm64 libstdc++6:arm64 libtinfo6:arm64 libunistring2:arm64
zlib1g:arm64
选项:clang-7
另请注意:我将源代码编译为程序集,将程序集编译为对象,然后将对象编译为二进制文件。我执行这些步骤主要是出于好奇来保留中间文件。当我这样做不是作为交叉编译时,我没有问题。所以,我不应该认为这很重要,但我会提到它以防万一。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。