zoukankan      html  css  js  c++  java
  • LInux下编译发生的libc相关错误

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

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

  • 相关阅读:
    java Random 随机重排
    java Random 带权重的随机选择
    java 枚举
    springboot docker 部署
    docker 国内镜像加速
    BigDecimal使用
    java继承实现的基本原理
    MySQL 数据类型
    Knockout: 让ViewModel从htm中剥离出去。
    常用代码之五:RequireJS, 一个Define需要且只能有一个返回值/对象,一个JS文件里只能放一个Define.
  • 原文地址:https://www.cnblogs.com/gqtcgq/p/7247158.html
Copyright © 2011-2022 走看看