在某主机上编译程序,发生有找不到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 ) )

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

LInux下编译发生的libc相关错误的更多相关文章

  1. linux下编译qt5.6.0静态库——configure配置

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  2. linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  3. linux下编译原理分析

    linux下编译hello.c 程序,使用gcc hello.c,然后./a.out就能够执行:在这个简单的命令后面隐藏了很多复杂的过程,这个过程包含了以下的步骤: ================= ...

  4. linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  5. linux下编译运行TIGL Viewer步骤

    linux下编译运行TIGL Viewer步骤(仅为了正确编译安装的话直接跳到步骤3) 1. linux发行版选择:由于linux发行版众多,不同版本包含的库版本可能存在差别,因此需要选择正确的版本. ...

  6. Linux 下运行 C++ 程序出现 “段错误(核心已转储)”

    Linux下写C++程序出现“段错误(核心已转储)”的问题: 段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它 ...

  7. linux安装软件的几种方法----linux下编译安装软件的一般步骤

    linux安装软件的几种方法: 一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root用户: 3.cd so ...

  8. linux下编译gcc6.2.0

    linux下编译gcc6.2.0 在archlinx的下gcc已经更新到6.2.1了,win10的WSL下还是gcc4.8.官方源没有比较新的版本,于是自己编译使用. GCC6的几个新特性 GCC 6 ...

  9. LINUX下编译安装PHP各种报错大集合

    本文为大家整理汇总了一些linux下编译安装php各种报错大集合 ,感兴趣的同学参考下. nginx1.6.2-mysql5.5.32二进制,php安装报错解决: 123456 [root@clien ...

随机推荐

  1. springmvc 使用poi解析excel并通过hibernate连续插入多条数据 实际数据库只能保存最后一条

    有一个原始数据的excel表 用poi解析之后通过hibernate插数据库 结果 后来发现,有人说 果断尝试 问题解决 但是这好像并不是真正解决问题,只是解决了一个现象 因为有人说 https:// ...

  2. poi操作word,简单写docx

    参考博客: https://www.cnblogs.com/guilty/p/3977016.html 在HWPF中换行符是"\013",在XWPF中是run.addBreak() ...

  3. 006-使用python编写一个猜数字的程序

    题目:随机生成一个数字,共有三次机会对该数字进行猜测. #功能点# 1.猜错的时候给出提示,告诉用户输入的值是大了还是小了# 2.最多提供三次机会# 3.随机生成需要猜的数字答案 编写思路: 1.刚开 ...

  4. 常用命令6--文件搜索命令4-grep

    查找不包含size字符串的文件.

  5. WordPress不同分类使用不同的文章模板

    倡萌昨天分享的 Custom Post Template 和 Single Post Template 可以让你自定义每篇文章的文章模板,今天来说说WordPress不同分类使用不同的文章模板. 方法 ...

  6. pip list报错:DEPRECATION: The default format will switch to columns in the future.

    一.现象: pip list 显示出以下错误:     DEPRECATION: The default format will switch to columns in the future. Yo ...

  7. 2016年中国独角兽企业估值榜 TOP300

    2016年中国独角兽企业估值榜 TOP300[完整榜单] 类型:品牌资讯/名企动态 阅读:6735次 来源: 中商情报网 我要评论   摘要:独角兽公司是什么?独角兽公司指的是那些估值达到10亿美元以 ...

  8. ArcGISTiledMapServiceLayer

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>第一 ...

  9. Least Common Multiple (最小公倍数,先除再乘)

      思路: 求第一个和第二个元素的最小公倍数,然后拿求得的最小公倍数和第三个元素求最小公倍数,继续下去,直到没有元素 注意:通过最大公约数求最小公倍数的时候,先除再乘,避免溢出   #include ...

  10. 如何高效地在github上找开源项目学习?

    1.高级条件组合(精确搜索) in:readme 微服务 stars:>1000 in:readme spring security stars:>3000 in:name python  ...