我正在尝试在 Ubuntu 20.04 x86_64 环境中的 x86 平台上为旧版本的 QNX 构建 GCC 10.5。我从 GNU 的 FTP 服务器下载了
gcc-10.5.0.tar.xz
文件并运行了以下命令:
tar -xvf gcc-10.5.0.tar.xz
cd gcc-10.5.0
./contrib/download_prerequisites
cd ..
mkdir bin-qnx63-i386
cd bin-qnx63-i386
./../gcc-10.5.0/configure $(options)
make
这些是
$(options)
中的当前选项:
--host=x86_64-pc-linux-gnu
--target=i386-pc-nto-qnx6.3.0
--prefix=/usr/local/nyab
--program-prefix=nyab-
--disable-multilib
--enable-threads=posix
--enable-tls
--enable-version-specific-runtime-libs
--enable-languages=c,c++
--disable-libada
--disable-libgm2
--enable-default-pie
--enable-werror
--enable-checking
--enable-valgrind-annotations
--with-sysroot=/opt/qnx630/target/qnx6
此外,我已按照
此处的指示将
ar
、as
、ld
和 ranlib
复制到 /usr/local/nyab/i386-pc-nto-qnx6.3.0/bin
。初次运行失败后,我将 CRT 库从 SDK 复制到了 /usr/local/nyab/i386-pc-nto-qnx6.3.0/lib
,因为这似乎也是需要的。
此设置似乎一直有效,直到我到达失败的
i386-pc-nto-qnx6.3.0/libstdc++-v3
目录。看看 config.log
,问题似乎源于以下行:
/usr/local/nyab/i386-pc-nto-qnx6.3.0/bin/ld: cannot open /opt/qnx630/target/qnx6x86/lib/crtbegin.o: No such file or directory
正确的路径是
/opt/qnx630/target/qnx6/x86/lib
。
我尝试修改
--with-sysroot
选项以包含尾部斜杠,但这似乎没有效果。接下来,我创建了一个小 C 文件:
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
我使用失败命令的标志加上吐出附加信息的标志(针对 StackOverflow 格式化)将其传递给编译器:
/home/nyab/gcc/bin-qnx63-i386/./gcc/xgcc -B/home/nyab/gcc/bin-qnx63-i386/./gcc/ \
-B/usr/local/nyab/i386-pc-nto-qnx6.3.0/bin/ \
-B/usr/local/nyab/i386-pc-nto-qnx6.3.0/lib/ \
-isystem /usr/local/nyab/i386-pc-nto-qnx6.3.0/include \
-isystem /usr/local/nyab/i386-pc-nto-qnx6.3.0/sys-include \
-v -o /tmp/test -g -O2 /tmp/test.c
并发现 GCC 正在创建不正确的路径(为不正确的路径添加了换行符):
...
COLLECT_GCC_OPTIONS='-B' '/home/nyab/gcc/bin-qnx63-i386/./gcc/' '-B' '/usr/local/nyab/i386-pc-nto-qnx6.3.0/bin/' '-B' '/usr/local/nyab/i386-pc-nto-qnx6.3.0/lib/' '-isystem' '/usr/local/nyab/i386-pc-nto-qnx6.3.0/include' '-isystem' '/usr/local/nyab/i386-pc-nto-qnx6.3.0/sys-include' '-v' '-o' '/tmp/test' '-g' '-O2' '-mtune=generic' '-march=pentiumpro'
/home/nyab/gcc/bin-qnx63-i386/./gcc/collect2 -V -Y P,
/opt/qnx630/target/qnx6x86/lib
-Qy -m i386nto --dynamic-linker /usr/lib/ldqnx.so.2 -o /tmp/test /usr/local/nyab/i386-pc-nto-qnx6.3.0/lib/crt1.o /usr/local/nyab/i386-pc-nto-qnx6.3.0/lib/crti.o
/opt/qnx630/target/qnx6x86/lib/crtbegin.o
-L/home/nyab/gcc/bin-qnx63-i386/./gcc -L/usr/local/nyab/i386-pc-nto-qnx6.3.0/bin -L/usr/local/nyab/i386-pc-nto-qnx6.3.0/lib /tmp/ccb1wUOU.o -lgcc -lc -lgcc /usr/local/nyab/i386-pc-nto-qnx6.3.0/lib/crtend.o /usr/local/nyab/i386-pc-nto-qnx6.3.0/lib/crtn.o
...
我已确认
crtbegin.o
位于/usr/local/nyab/i386-pc-nto-qnx6.3.0/lib
中,尽管它是从/opt/qnx630/target/qnx6/x86/lib
复制的。有谁知道我哪里错了或者下一步要尝试什么?
简短回答
将
SYSROOT_SUFFIX_SPEC
中的<src-dir>/gcc/config/i386/nto.h
修改为/86
。
长答案
GCC 使用 spec 文件 来确定如何使用适当的命令行参数调用自身和其他程序。对
<src-dir>/gcc/gcc.c
的彻底调查将向您展示这些文件是如何创建或读入程序的。由于我们在链接器调用期间失败,因此 LINK_SPEC
定义在这里很重要。对于这个 QNX 版本,可以在 <src-dir>/gcc/config/i386/nto.h
中找到。重要的两行是:
...
%{!YP,*:%{p:-Y P,%R/lib} \
%{!p:-Y P,%R/lib}} \
...
之前链接的规范语言参考说
%R
是“target_system_root 和 target_sysroot_suffix 的串联”。 target_sysroot_suffix
实际上是在 nto.h
预处理器宏下的 SYSROOT_SUFFIX_SPEC
文件中定义的。将此定义与 mti-linux.h
和 st.h
中的其他定义交叉引用,nto.h
中的规范缺少开头的正斜杠。将值从 x86
更改为 /x86
将帮助您解决此问题。