ldd
перечисляет разделяемые библиотеки, которые требуются для его аргумента. С опцией -v
отображается вся доступная информация, включая символы версий.
Строки вида
linux-vdso.so.1 => (0x00007fffa3dff000)
librt.so.1 => /lib64/librt.so.1 (0x00007fea7a7b2000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fea7a4ab000)
список библиотек, требуемых libAtlasUtilsPB.so
, и способы их разрешения; в вашем случае все необходимые библиотеки найдены. linux-vdso.so.1
особенная, это виртуальная библиотека , предоставляемая ядром.
Строки вида
libgcc_s.so.1 (GCC_3.0) => /lib64/libgcc_s.so.1
libm.so.6 (GLIBC_2.2.5) => /lib64/libm.so.6
libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
перечисляет символы версии, требуемые libAtlasUtilsPB.so
, и опять же, как они разрешаются. Именно здесь ldd
не удается разрешить элементы, на что он указывает как указанием «не найдено» здесь, так и выводом сообщений об ошибках в начале своего вывода.
GLIBC_...
, GLIBCXX_...
и т. д. — это символы версий, которые используются в некоторых библиотеках (, включая библиотеку GNU C и библиотеки GCC ), для определения требуемых версий и управления обратной совместимостью. Двоичный (исполняемый файл или библиотека )обычно требуют нескольких версий в зависимости от символов, которые он действительно использует из целевой библиотеки. Чтобы удовлетворить требования данного двоичного файла, вам необходимо предоставить библиотеку, которая поддерживает все требуемые версии — , т. е. библиотеку, соответствующую как минимум самому старшему символу версии в списке требований.
Причина, по которой может потребоваться несколько версий, заключается в том, что каждый импортированный объект (, функция и т. д. )может иметь версию, и данный двоичный файл может связываться с несколькими версиями во всех функциях, которые он использует. Например, выбрав пример с двумя версиями в моей системе, /lib/x86_64-linux-gnu/libgcc_s.so.1
, ldd -v
показывает
/lib/x86_64-linux-gnu/libgcc_s.so.1:
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libgcc_s.so.1
требуется два символа версии из libc.so.6
. Чтобы понять почему, нам нужно взглянуть на содержащиеся в нем неопределенные символы — это символы, которые ему нужно импортировать :
.
$ objdump -T /lib/x86_64-linux-gnu/libgcc_s.so.1|grep -F '*UND*'
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 dl_iterate_phdr
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 free
0000000000000000 w D *UND* 0000000000000000 __pthread_key_create
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 abort
0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 strlen
0000000000000000 w D *UND* 0000000000000000 pthread_getspecific
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 memset
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 calloc
0000000000000000 w D *UND* 0000000000000000 pthread_key_create
0000000000000000 w D *UND* 0000000000000000 __gmon_start__
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.14 memcpy
0000000000000000 w D *UND* 0000000000000000 pthread_once
0000000000000000 w DF *UND* 0000000000000000 GLIBC_2.2.5 pthread_mutex_unlock
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 malloc
0000000000000000 w D *UND* 0000000000000000 pthread_setspecific
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 realloc
0000000000000000 w D *UND* 0000000000000000 _Jv_RegisterClasses
0000000000000000 w D *UND* 0000000000000000 _ITM_registerTMCloneTable
0000000000000000 w DF *UND* 0000000000000000 GLIBC_2.2.5 __cxa_finalize
0000000000000000 w DF *UND* 0000000000000000 GLIBC_2.2.5 pthread_mutex_lock
Здесь перечислены несколько версий символов (с GLIBC_2.2.5
или GLIBC_2.14
во втором -последнем столбце ),и мы можем видеть здесь, что версии совпадают с теми, которые мы видели с ldd
. Почему мы получаем символы нескольких версий? Вот тут-то и появляется обратная совместимость. Версия 2.2.5 является базовой для управления версиями символов в библиотеке GNU C; любая функция, которая присутствовала в версии 2.2.5, относится к этой версии. В версии 2.13 библиотеки GNU C поведение memcpy
было изменено; это сломало ряд программ, поэтому в версии 2.14 обратно совместимая версия -была добавлена с необязательным тегом версии GLIBC_2.2.5
, а новая версия добавлена с тегом версии GLIBC_2.14
. Таким образом, старые двоичные файлы, созданные с использованием более ранних версий библиотеки C, используют старую версию memcpy
, а двоичные файлы, созданные с использованием версии 2.14 и более поздних, используют новую версию memcpy
.
Та же история применима к libstdc++.so.6
, но со многими другими изменениями с обновленными номерами версий; Подробная информация содержится в руководстве libstdc++
.
В вашем случае вам нужно, чтобы libstdc++.so.6
соответствовало GLIBCXX_3.4.18
, , то есть версии, предоставленной GCC 4.8.0 или более поздней версии, и версии 2.14 библиотеки GNU C.
Вы не можете легко создавать двоичные файлы на RHEL 7 и запускать их на RHEL 6 (, поэтому основная версия отличается ). Вам лучше пересобрать свою программу на RHEL 6...
Вам необходимо убедиться, что раздел gentoo действительно смонтирован при запуске grub-mkconfig
. Выходные данные следующих инструментов помогают определить это:
lsblk
mount
df
Если вам нужно копнуть глубже, закройте журнал журнала в одном окне терминала и запустите os -prober от имени пользователя root в другом.
Окно 1:sudo journalctl -fn0
Окно 2:sudo os-prober
Команда grub-mkconfig
использует утилиту os -prober для поиска журналов других операционных систем и os -prober в журнале Arch, так что это предоставит всю информацию, которая вам понадобится для выясните, почему он не находит gentoo, если раздел фактически смонтирован.
На основе вывода http://codepad.org/zFCNfwoK, упомянутого в комментариях...
os-prober
находит Gentoo на /dev/nvme0n1p9
, но, видимо, следующим шагом будет linux-boot-prober
. Он запустит тестовые сценарии, расположенные в /usr/lib/linux-boot-probes
.
Похоже, что /usr/lib/linux-boot-probes/mounted/90fallback
должен уметь обнаруживать ядро и файлы initramfs Gentoo, если они расположены либо в корневом каталоге, либо в подкаталоге boot
подкаталога -файловой системы /dev/nvme0n1p9
, предполагая, что тип файловой системы какой-то GRUB умеет читать. Но Gentoo можно установить в UEFI несколькими возможными способами, и некоторые из них поместят ядро + initramfs в системный раздел EFI, который в вашем случае будет /dev/nvme0n1p1
.
Похоже, по крайней мере, на моем Debian 10 os-prober
могут потребоваться обновления, чтобы охватить больше случаев установки UEFI.
Пожалуйста, запустите efibootmgr -v
. Создал ли Gentoo загрузочную запись NVRAM для себя? Его можно использовать, чтобы узнать, где находится ядро Gentoo (или загрузчик, если он использует его вместо того, чтобы полагаться на заглушку EFI в ядре ).
(Идея :Кто-то мог бы написать сценарий для os-prober
для работы в системах UEFI, который будет проходить через все зарегистрированные загрузчики NVRAM -и использовать file
, чтобы выяснить, соответствует ли указанный -загрузочный файл выглядит как ядро Linux. Это должно охватывать довольно много случаев, когда заглушка EFI ядра используется вместо отдельного загрузчика.)