我正在尝试为我们的代码库设置静态分析,该代码库是为基于ARM的CPU交叉编译的。看来clang提供的scan-build是最好的开源解决方案之一。当我运行scan-build时,这就是我得到的。
$ scan-build-3.8 --use-cc=arm-linux-gnueabi-gcc --analyzer-target=arm-linux-gnueabi make
scan-build: Using '/usr/lib/llvm-3.8/bin/clang' for static analysis
echo "(Version file)"
(Version file)
/opt/sysroots/x86_64-linux/usr/libexec/arm-linux-gnueabi/gcc/arm-linux-gnueabi/6.3.0/real-ld: cannot find crti.o: No such file or directory
/opt/sysroots/x86_64-linux/usr/libexec/arm-linux-gnueabi/gcc/arm-linux-gnueabi/6.3.0/real-ld: cannot find crtbeginS.o: No such file or directory
/opt/sysroots/x86_64-linux/usr/libexec/arm-linux-gnueabi/gcc/arm-linux-gnueabi/6.3.0/real-ld: cannot find -lgcc
/opt/sysroots/x86_64-linux/usr/libexec/arm-linux-gnueabi/gcc/arm-linux-gnueabi/6.3.0/real-ld: cannot find -lgcc_s
/opt/sysroots/x86_64-linux/usr/libexec/arm-linux-gnueabi/gcc/arm-linux-gnueabi/6.3.0/real-ld: cannot find -lc
/opt/sysroots/x86_64-linux/usr/libexec/arm-linux-gnueabi/gcc/arm-linux-gnueabi/6.3.0/real-ld: cannot find -lgcc
/opt/sysroots/x86_64-linux/usr/libexec/arm-linux-gnueabi/gcc/arm-linux-gnueabi/6.3.0/real-ld: cannot find -lgcc_s
/opt/sysroots/x86_64-linux/usr/libexec/arm-linux-gnueabi/gcc/arm-linux-gnueabi/6.3.0/real-ld: cannot find crtendS.o: No such file or directory
/opt/sysroots/x86_64-linux/usr/libexec/arm-linux-gnueabi/gcc/arm-linux-gnueabi/6.3.0/real-ld: cannot find crtn.o: No such file or directory
collect2: error: ld returned 1 exit status
显然,Linker正试图找到一些文件但没有找到它。我通过运行此命令更深入地了解了链接器如何获取文件。
$ /opt/sysroots/x86_64-dspg-linux/usr/libexec/arm-linux-gnueabi/gcc/arm-linux-gnueabi/6.3.0/real-ld crti.o --verbose
这会打印很多数据,这是我觉得有趣的。
SEARCH_DIR("=/opt/dspg/v2.4.0-rc2/sysroots/x86_64-dspg-linux/usr/arm-dspg-linux-gnueabi/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");
我的crti.o
未位于上述任何路径中,因此ld
失败。
现在的问题。当scan-build调用链接器时,它如何通知搜索目录,我可以更改它吗?