GCC 和 binutils build - C 编译器无法创建可执行文件
GCC & binutils build - C compiler cannot create executables
我正在尝试构建 gcc-5.3 和 binutils-2.26。我是这样做的:
mkdir gcc; cd gcc
wget http://path/to/gcc-5.3.0.tar.bz2
wget http://path/to/binutils-2.26.tar.bz2
tar xf gcc-5.3.0.tar.bz2
tar xf binutils-2.26.tar.bz2
cd gcc-5.3.0
contrib/download_prerequisites
for file in ../binutils-2.26/*; do ln -s "${file}"; done
cd ..
mkdir build
mkdir dist
cd build
../gcc-5.3.0/configure --prefix=/home/teamcity/gcc/dist --disable-multilib --with-system-zlib --enable-languages=c,c++,fortran --program-suffix=-mine
make
这似乎可以构建第一阶段的可执行文件; prev-gas
、prev-gcc
、prev-ld
都带有看似合理的可执行文件。但是下一阶段失败了:
Configuring stage 2 in ./intl
configure: loading cache ./config.cache
checking whether make sets $(MAKE)... yes
checking for a BSD-compatible install... /usr/bin/install -c
checking whether NLS is requested... yes
checking for msgfmt... /usr/bin/msgfmt
checking for gmsgfmt... /usr/bin/msgfmt
checking for xgettext... /usr/bin/xgettext
checking for msgmerge... /usr/bin/msgmerge
checking for x86_64-unknown-linux-gnu-gcc... /home/teamcity/gcc/build/./prev-gcc/xgcc -B/home/teamcity/gcc/build/./prev-gcc/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/lib/ -isystem /home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/include -isystem /home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/sys-include -L/home/teamcity/gcc/build/./ld
checking for C compiler default output file name...
configure: error: in `/home/teamcity/gcc/build/intl':
configure: error: C compiler cannot create executables
See `config.log' for more details.
config.log 的相关位似乎是这样的:
configure:2978: checking for C compiler default output file name
configure:3000: /home/teamcity/gcc/build/./prev-gcc/xgcc -B/home/teamcity/gcc/build/./prev-gcc/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unkn
own-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/lib/ -isystem /home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/include -isystem /home/teamcity/gcc/dist/x86_64-unknown-l
inux-gnu/sys-include -L/home/teamcity/gcc/build/./ld -g -O2 -gtoggle -static-libstdc++ -static-libgcc conftest.c >&5
/home/teamcity/gcc/build/./prev-gcc/as: 106: exec: /home/teamcity/gcc/build/./gas/as-new: not found
这看起来像预期找到 gas/as-new
的 prev-gcc,但实际上是 prev-gas/as-new
。
是否有一些解决方法? ln -s prev-gas gas
安全吗?我有点希望这会在以后引起问题。 gcc 和 binutils 这两个版本不能一起构建吗?
这是我在 Ubuntu 14.04 Azure VM 上自行尝试后编辑的答案。
以下方法对我有用:
- 构建并安装 binutils 2.26;为了本次讨论的目的,
假设它安装在 /opt/gcc-5.3.0.
- 使用
/root/objdir/../gcc-5.3.0/configure --prefix=/opt/gcc-5.3.0
--enable-languages=c,c++ --disable-multilib --with-ld=/opt/gcc-5.3.0/bin/ld --with-as=/opt/gcc-5.3.0/bin/as
在构建目录中配置 gcc-5.3.0 假设 gcc-5.3.0 和构建目录 objdir
在同一位置
水平。
- 在
objdir
构建目录中执行 make
,然后执行 make install
。
验证新建gcc
使用的ld
是新binutils中的ld
:
/opt/gcc-5.3.0/bin/gcc -print-prog-name=ld
输出应该是,在这个例子中:
/opt/gcc-5.3.0/bin/ld
另一个测试:重命名系统 ld
,在我的例子中是 /usr/bin/ld
;新建的 gcc 应该仍然可以工作。
当然,这适用于 ld
和 as
。
将 AS 和 LD 环境变量设置为指向 binutils 包中新建的二进制文件不起作用:-print-prog-name=...
仍然显示默认工具,removing/renaming 默认工具导致 gcc失败。
因此,实现此目的的最佳方法是先构建 binutils,然后使用 --with-ld
和 --with-as
选项来 configure
。如果你也想确保新构建的 binutils 用于构建 GCC,你可能希望将它们放在系统提供的工具之前的 PATH 中,或者你甚至可以重命名系统提供的工具以使其远离图片。
感谢您检查另一个邮件列表以验证一起构建 GCC 和 binutils 不起作用,除非它们从源代码管理中拉出,我想该选项在使用下载的 tarball 时不适用。总体而言,这是一个有趣的练习。
我正在尝试构建 gcc-5.3 和 binutils-2.26。我是这样做的:
mkdir gcc; cd gcc
wget http://path/to/gcc-5.3.0.tar.bz2
wget http://path/to/binutils-2.26.tar.bz2
tar xf gcc-5.3.0.tar.bz2
tar xf binutils-2.26.tar.bz2
cd gcc-5.3.0
contrib/download_prerequisites
for file in ../binutils-2.26/*; do ln -s "${file}"; done
cd ..
mkdir build
mkdir dist
cd build
../gcc-5.3.0/configure --prefix=/home/teamcity/gcc/dist --disable-multilib --with-system-zlib --enable-languages=c,c++,fortran --program-suffix=-mine
make
这似乎可以构建第一阶段的可执行文件; prev-gas
、prev-gcc
、prev-ld
都带有看似合理的可执行文件。但是下一阶段失败了:
Configuring stage 2 in ./intl
configure: loading cache ./config.cache
checking whether make sets $(MAKE)... yes
checking for a BSD-compatible install... /usr/bin/install -c
checking whether NLS is requested... yes
checking for msgfmt... /usr/bin/msgfmt
checking for gmsgfmt... /usr/bin/msgfmt
checking for xgettext... /usr/bin/xgettext
checking for msgmerge... /usr/bin/msgmerge
checking for x86_64-unknown-linux-gnu-gcc... /home/teamcity/gcc/build/./prev-gcc/xgcc -B/home/teamcity/gcc/build/./prev-gcc/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/lib/ -isystem /home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/include -isystem /home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/sys-include -L/home/teamcity/gcc/build/./ld
checking for C compiler default output file name...
configure: error: in `/home/teamcity/gcc/build/intl':
configure: error: C compiler cannot create executables
See `config.log' for more details.
config.log 的相关位似乎是这样的:
configure:2978: checking for C compiler default output file name
configure:3000: /home/teamcity/gcc/build/./prev-gcc/xgcc -B/home/teamcity/gcc/build/./prev-gcc/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unkn
own-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/lib/ -isystem /home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/include -isystem /home/teamcity/gcc/dist/x86_64-unknown-l
inux-gnu/sys-include -L/home/teamcity/gcc/build/./ld -g -O2 -gtoggle -static-libstdc++ -static-libgcc conftest.c >&5
/home/teamcity/gcc/build/./prev-gcc/as: 106: exec: /home/teamcity/gcc/build/./gas/as-new: not found
这看起来像预期找到 gas/as-new
的 prev-gcc,但实际上是 prev-gas/as-new
。
是否有一些解决方法? ln -s prev-gas gas
安全吗?我有点希望这会在以后引起问题。 gcc 和 binutils 这两个版本不能一起构建吗?
这是我在 Ubuntu 14.04 Azure VM 上自行尝试后编辑的答案。
以下方法对我有用:
- 构建并安装 binutils 2.26;为了本次讨论的目的, 假设它安装在 /opt/gcc-5.3.0.
- 使用
/root/objdir/../gcc-5.3.0/configure --prefix=/opt/gcc-5.3.0 --enable-languages=c,c++ --disable-multilib --with-ld=/opt/gcc-5.3.0/bin/ld --with-as=/opt/gcc-5.3.0/bin/as
在构建目录中配置 gcc-5.3.0 假设 gcc-5.3.0 和构建目录objdir
在同一位置 水平。 - 在
objdir
构建目录中执行make
,然后执行make install
。
验证新建gcc
使用的ld
是新binutils中的ld
:
/opt/gcc-5.3.0/bin/gcc -print-prog-name=ld
输出应该是,在这个例子中:
/opt/gcc-5.3.0/bin/ld
另一个测试:重命名系统 ld
,在我的例子中是 /usr/bin/ld
;新建的 gcc 应该仍然可以工作。
当然,这适用于 ld
和 as
。
将 AS 和 LD 环境变量设置为指向 binutils 包中新建的二进制文件不起作用:-print-prog-name=...
仍然显示默认工具,removing/renaming 默认工具导致 gcc失败。
因此,实现此目的的最佳方法是先构建 binutils,然后使用 --with-ld
和 --with-as
选项来 configure
。如果你也想确保新构建的 binutils 用于构建 GCC,你可能希望将它们放在系统提供的工具之前的 PATH 中,或者你甚至可以重命名系统提供的工具以使其远离图片。
感谢您检查另一个邮件列表以验证一起构建 GCC 和 binutils 不起作用,除非它们从源代码管理中拉出,我想该选项在使用下载的 tarball 时不适用。总体而言,这是一个有趣的练习。