环境
WSL Ubuntu 22.04.2 LTS
gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
问题
问题一 cc1 命令找不到
cc1 命令在 /usr/lib/gcc/x86_64-linux-gnu/11/cc1 里,注意不同操作系统等可能 cc1 的位置不一样,可以使用 find 或者 locate 命令搜索。
通过下面命令,创建一个软链接可以全局暴露 cc1
sudo ln -s /usr/lib/gcc/x86_64-linux-gnu/11/cc1 /usr/bin/cc1
参考http://bbs.chinaunix.net/thread-696784-1-1.html
问题二 ld 命令链接 main.o swap.o 失败
我原来使用的命令忽略了书本里的提示 [ system object files and args ]
# 书中
ld -o p [ system object files and args ] /tmp/main.o /tmp/swap.o
# 我实际用的命令
ld -o p /tmp/main.o /tmp/swap.o
使用 gcc
命令链接 *.o 是没问题的,
即以下命令正确
gcc -o p /tmp/main.o /tmp/swap.o
于是通过gcc的 --verbose 参数
gcc --verbose -o p /tmp/main.o /tmp/swap.o
可以发现在gcc在链接的时候还链接了多个 system object files。
于是更正后的链接指令为
ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 \
/usr/lib/x86_64-linux-gnu/crt1.o \
/usr/lib/x86_64-linux-gnu/crti.o \
/usr/lib/gcc/x86_64-linux-gnu/11/crtbeginS.o \
/usr/lib/gcc/x86_64-linux-gnu/11/crtendS.o \
hello.o -lc /usr/lib/x86_64-linux-gnu/crtn.o
-o a.out
其他
gcc
命令是 编译驱动程序(compiler driver),
会调用cpp
、cc1
、as
、ld
等组成的 工具链(Toolchain)