【问题标题】:Both libc.so.6 and libc.so exist in rootfslibc.so.6 和 libc.so 都存在于 rootfs 中
【发布时间】:2019-08-10 00:02:14
【问题描述】:

我使用 Yocto 生成了我的 rootfs,然后发生了一件连线的事情,libc.so.6 和 libc.so 都存在于我的 rootfs 中(/usr/lib/libc.so 和 /lib/libc.so.6) .但是它们是不同的对象(不链接到单个对象),这将导致我使用 Yocto sdk 编译失败。

我知道我的 libc.so 与 libsqlite3-dev 一起安装,但我不知道真正生成 libc.so 的配方。

谁能帮帮我?

【问题讨论】:

    标签: yocto glibc libc rootfs


    【解决方案1】:

    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 (
      /lib/x86_64-linux-gnu/libc.so.6
      /usr/lib/x86_64-linux-gnu/libc_nonshared.a
      AS_NEEDED ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 )
    )
    

    它指示链接编辑器(ld,在构建期间链接时调用,即不是动态链接器)首先在共享对象 libc.so.6 中查找符号,如果不能,则在 libc_nonshared.a 中查找符号找到它,最后在动态加载器中,ld-linux-x86-64.so.2)。这用于实现某些功能,例如在较新版本的 glibc 中,调用者敏感函数 pthread_atfork(必须静态链接,因此它放在 libc_nonshared.a 而不是 libc.so.6)。链接描述文件通常由gcc 或g++ 命令隐式调用,但偶尔,您会看到包含-lc 的命令行,并且那些会选择libc.so 脚本(动态链接时)。

    链接描述文件仅在构建时使用。如果您的映像包含诸如libsqlite3-dev 之类的开发库,则必须包含libc6-dev(或任何提供libc.so 链接器脚本的包),因为libsqlite3-dev 不能用于链接新程序和共享对象没有 glibc。

    【讨论】:

    • 谢谢。但 libc.so 已安装到 rootfs /usr/lib。而且我查了一下,/* GNU ld script 使用共享库,但是有些函数只在静态库中,所以次要试试。 */ OUTPUT_FORMAT(elf32-littlearm) 组 ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux-armhf.so.3 ) )。就像你说的那样。但是当我使用sdk编译我的应用程序时,它仍然显示libc.so.6 not found。
    • 非常感谢,您说得对。 libc.so 指示在 /lib 中查找 libc.so.6,但我真正的 ld 是 topdir/lib,这导致找不到 libc.so.6。所以我必须删除 topdir。
    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2014-05-22
    • 2015-07-21
    • 2021-07-27
    • 2012-06-07
    相关资源
    最近更新 更多