И libc.so.6, и libc.so существуют в rootfs - PullRequest
1 голос
/ 19 марта 2019

Я использовал Yocto для генерации моих rootfs, и произошел сбой, и libc.so.6, и libc.so существовали в моих rootfs (/usr/lib/libc.so и /lib/libc.so.6),Но это разные объекты (не связанные с одним объектом), что приведет к сбою компиляции с помощью Yocto SDK.

Я знаю, что мой libc.so установлен вместе с libsqlite3-dev, но я незнаете, какой рецепт действительно генерирует libc.so.

Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 19 марта 2019

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.

...