rootfs中同时存在libc.so.6和libc.so

时间:2019-03-19 12:43:35

标签: yocto glibc libc rootfs

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

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

有人可以帮助我吗?

1 个答案:

答案 0 :(得分: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中,然后在{{ 1}}(如果找不到),最后在动态加载器libc_nonshared.a中)。它用于实现某些功能,例如,在较新版本的glibc中,调用方敏感函数ld-linux-x86-64.so.2(必须静态链接,因此它放置在pthread_atfork中,而不是libc_nonshared.a中。 )。链接描述文件通常是由libc.so.6gcc命令隐式调用的,但是有时,您会看到包含g++的命令行,而这些命令行拾取了-lc脚本(动态链接时。)

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