LInux下编译发生的libc相关错误

原创 2015年07月06日 17:23:29

在某主机上编译程序,发生有找不到libc的问题,自己写了个简单的hello world程序,编译也失败,报错如下:

# gcc -o 1 1.c

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status


于是找一下该主机上所有的libc文件:

# find  /  -name  libc.so*
/usr/lib/x86_64-redhat-linux5E/lib64/libc.so
/lib/i686/nosegneg/libc.so.6
/lib/libc.so.6
/lib64/libc.so.6



# ll /lib64/libc.so.6 
lrwxrwxrwx. 1 root root 12 May 13 11:10 /lib64/libc.so.6 -> libc-2.12.so
# ll /lib/libc.so.6 
lrwxrwxrwx. 1 root root 12 May 13 11:14 /lib/libc.so.6 -> libc-2.12.so


发现/usr/lib64目录下确实没有libc.so文件,于是建立一个到/lib64/libc.so.6的软连接:

# ln -s /lib64/libc.so.6 /usr/lib64/libc.so
# ll /usr/lib64/libc.so*
lrwxrwxrwx 1 root root  16 Jul  6 17:29 /usr/lib64/libc.so -> /lib64/libc.so.6


再次编译,上面的错误不报了,但是又出现了新的错误:
# gcc -o 1 1.c
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start':
(.text+0x12): undefined reference to  `__libc_csu_fini'crt1.o
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start':
(.text+0x19): undefined reference to  `__libc_csu_init'
collect2: ld returned 1 exit status


网上找了好多资料,始终解决不了,于是找了一台配置一模一样的机器,在两个机器上用相同的命令编译:

#gcc -v -save-temps -o 1 1.c

将两台机器上生成的中间文件1.s, 1.i, 1.o一一对比,发现完全一样,所以错误只能出现在链接阶段了:

 /usr/libexec/gcc/x86_64-redhat-linux/4.4.7/collect2 --eh-frame-hdr --build-id -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o 1 /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../.. 1.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtend.o /usr/lib/gccrtbegin.oc/x86_64-redhat-linux/4.4.7/../../../../lib64/crtn.o


将两台机器上的链接过程中使用到的文件:crt1.o,crtbegin.o,crtend.o,crti.o,crtn.o一一对比,也是完全一样。


至此,所有的原因都排查之后,只能回到原始的错误:libc.so的问题,所以,找到那台配置一样的机器上的/usr/lib64/libc.so,发现他是一个文本文件,是ld使用的链接脚本:

# cat /usr/lib64/libc.so 
/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a  AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )

至此,终于找到了真正的原因,将该文件复制到问题主机,编译成功!!!

版权声明:本文为博主原创文章,未经博主允许不得转载。

gcc 简单的 hello-world 到底连接了什么

gcc hello 到底连接了什么 ------------------------------------------------------------ 源代码: ----------------...
  • hejinjing_tom_com
  • hejinjing_tom_com
  • 2014年06月19日 14:14
  • 5696

程序员自我修养-是否真的要main函数??

首先c语言程序是否真的需要一个main函数? double foo() { return 1.0; } double g=foo(); int main() { return0; } ...
  • hotmocha
  • hotmocha
  • 2012年07月20日 11:22
  • 2729

error:/usr/bin/ld:skipping incompatible ./libxxxx.so when searching for -lxxxx

转自: http://www.scalachina.com/home.php?mod=space&uid=1&do=blog&id=106 第一次在CentOS(64bit)下编译时出现如...
  • cloudeagle_bupt
  • cloudeagle_bupt
  • 2015年10月23日 16:29
  • 3233

Linux——gcc编译时In function `_start':(.text+0x**):

gcc编译会出现如下问题: In function `_start':(.text+0x****): undefined reference to `main'.... 下面是该类问题的解决方法:...
  • u012627502
  • u012627502
  • 2015年03月04日 19:02
  • 3162

linux 编译glibc

一、简介 glibc是gnu发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,...
  • yunlianglinfeng
  • yunlianglinfeng
  • 2016年11月15日 14:51
  • 1725

libc编译及问题解决

目标: 编译出libc库文件,进行替换验证; 下载源码: https://www.gnu.org/software/libc/ 编译: mkdir libc cd libc tar -xzf gli...
  • hds_yx
  • hds_yx
  • 2016年07月18日 15:24
  • 656

Linux/CentOS 升级C基本运行库CLIBC的注意事项(当想解决GLIBC_2.x找不到的编译问题)

在你准备升级GLIBC库之前,你要好好思考一下, 你真的要升级GLIBC么? 你知道你自己在做什么么?...
  • officercat
  • officercat
  • 2014年09月24日 10:32
  • 56714

linux编译glibc和提醒"libc.so.6: version `GLIBC_2.14' not found"系统的glibc版本太低

【linux】提示"libc.so.6: version `GLIBC_2.14' not found",系统的glibc版本太低 0.以下在系统CentOS 6.3 x86_64上操作 1.试图...
  • earbao
  • earbao
  • 2016年11月15日 02:17
  • 1250

linux下编译clang, libc++, libc++abi,以及第二遍自举编译

最新的mint16,附带gcc4.8.1 第一步:用gcc编译clang 1. 下载llvm+clang最新版本。具体见http://clang.llvm.org/...
  • heartszhang
  • heartszhang
  • 2013年12月29日 11:52
  • 7765

【库】/lib64/libc.so.6: version `GLIBC_2.14' not found问题

在arm-linux交叉编译工具链的制作(基于S3C2440)一文中制作好的交叉编译工具链,在Red Hat中执行时报错:/lib64/libc.so.6: version `GLIBC_2.14' ...
  • dengjin20104042056
  • dengjin20104042056
  • 2016年12月10日 22:23
  • 1771
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LInux下编译发生的libc相关错误
举报原因:
原因补充:

(最多只允许输入30个字)