yocto - libc.so.6 和 libc.so 都存在于 rootfs 中
问题描述
我使用 Yocto 生成了我的 rootfs,然后发生了一件连线的事情,libc.so.6 和 libc.so 都存在于我的 rootfs 中(/usr/lib/libc.so 和 /lib/libc.so.6)。但它们是不同的对象(不链接到单个对象),这将导致我使用 Yocto sdk 编译失败。
我知道我的 libc.so 与 libsqlite3-dev 一起安装,但我不知道哪个配方真正生成了 libc.so。
谁能帮我?
解决方案
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
org++
命令隐式调用,但偶尔,您会看到包含 的命令行-lc
,并且这些命令行会拾取libc.so
脚本(动态链接时)。
链接描述文件仅在构建时使用。如果您的映像包含诸如 之类的开发库libsqlite3-dev
,则必须包含libc6-dev
(或任何提供libc.so
链接器脚本的包),因为libsqlite3-dev
在没有 glibc 的情况下无法用于链接新程序和共享对象。
推荐阅读
- javascript - React Hooks - 更新父组件而不触发无限循环
- laravel - 控制器的视图中没有显示错误消息
- java - How to verify service.methodA called in service.methodB from controller test?
- python - 计算excel文件中的电子邮件(python)
- oracle - ORA-06550: 必须声明标识符
- vba - 将块插入到 (p1,p2) 点的中点并划分 (p1,p2) 距离并插入块
- javascript - 面临文本缩进第二行和更多行的问题
- angular - 如何将 propertiesArray 初始化为数组
- javascript - 如何在 QML 的自定义 ComboBox 中突出显示所选项目?
- gpu - 使用 rtx 3080 进行简单的 F64 模拟