引导 GCC 使用不正确的搜索路径

问题描述 投票:0回答:1

我正在尝试在 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
复制的。有谁知道我哪里错了或者下一步要尝试什么?

gcc qnx gcc10
1个回答
0
投票

简短回答

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
将帮助您解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.