一、遇见bug
最近在学习程序编译、装载等内容,复现书中的小实验时,发现使用
实验环境:centos6、gcc4.4.7、链接器和系统libc库都是2.12
gcc -static -fno-builtin hello.c
链接报错:
ld: can not find -lc
collect2: ld returned 1 exit status
二、尝试
回过头来看着两句报错提示,很明显就是缺少 libc.a 静态目标文件,collect2 是链接器 ld 的包装,本质就是链接报错,目前的系统已经不会默认安装静态库,我在自己的本机搜索 libc.a 确实也没有搜到
当时直接在网上以 ld: can not find -lc 位关键词使劲搜,压根没有发现任何结果,后来过几天转变思路,直接搜 linux 缺少 libc.a 文件,发现还是不行,再换英文 libc.a not found ,在 stackoverflow 发现了相似情况并给出了解决方案
三、解决
解决方案一:本来我想直接在本机编译一个 libc.a 的但是,源码也没有找到,好再可以直接安装这个库,更简单
解决方案二:直接安装
yum install glibc-static
我的centos6使用的是yum命令,新的centos好像是用 dnf 安装,ubuntu使用 apt ,包名的应该就是这个。
安装完这个包之后,再搜 libc.a 文件就有了,hello.c 文件也静态编译成功! (glibc-static 这个包不仅包含 libc.a 标准库,还给安装了一堆 .a 的静态目标打包文件)