我用Yocto生成了rootfs,发生了一件有线事情,我的rootfs中同时存在libc.so.6和libc.so(/usr/lib/libc.so和/lib/libc.so.6) 。但是它们是不同的对象(未链接到单个对象),这将导致我用Yocto sdk编译失败。
我知道我的libc.so与libsqlite3-dev一起安装,但是我不知道哪个配方真正生成libc.so。
有人可以帮助我吗?
答案 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.6
或gcc
命令隐式调用的,但是有时,您会看到包含g++
的命令行,而这些命令行拾取了-lc
脚本(动态链接时。)
链接脚本仅在构建时使用。如果映像包含libc.so
之类的开发库,则必须包含libsqlite3-dev
(或提供libc6-dev
链接程序脚本的任何程序包),因为libc.so
不是可用于在没有glibc的情况下链接新程序和共享对象。