Вопрос или проблема
Я пытаюсь собрать исполняемый файл, который связывается с libcrypto и libpthread. Оба они указаны как -lcrypto -lpthread (в таком порядке) в Makefile. Я скопировал обе библиотеки в путь к библиотекам и указал этот путь с помощью -L. Но, когда я выполняю ldd для исполняемого файла, libpthread отсутствует.
l
inux-vdso.so.1 (0x00007fff388ea000)
libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007551a1e00000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007551a1a00000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007551a2317000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007551a26cb000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007551a1600000)
/lib64/ld-linux-x86-64.so.2 (0x00007551a2701000)
Запуск команды nm на исполняемом файле показывает, что некоторые символы pthread отсутствуют.
U pthread_attr_destroy@GLIBC_2.2.5
U pthread_attr_init@GLIBC_2.2.5
U pthread_condattr_destroy@GLIBC_2.2.5
U pthread_condattr_init@GLIBC_2.2.5
U pthread_condattr_setclock@GLIBC_2.34
U pthread_cond_destroy@GLIBC_2.3.2
U pthread_cond_init@GLIBC_2.3.2
U pthread_cond_signal@GLIBC_2.3.2
U pthread_cond_timedwait@GLIBC_2.3.2
U pthread_cond_wait@GLIBC_2.3.2
U pthread_create@GLIBC_2.34
U pthread_join@GLIBC_2.34
U pthread_mutex_destroy@GLIBC_2.2.5
U pthread_mutex_init@GLIBC_2.2.5
U pthread_mutex_lock@GLIBC_2.2.5
U pthread_mutex_unlock@GLIBC_2.2.5
U pthread_sigmask@GLIBC_2.32
Вывод команды readelf -d на исполняемом файле также не содержит libpthread.
0x0000000000000001 (NEEDED) Shared library: [libcrypto.so.3]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
Наше программное обеспечение имеет сборку на машине RHEL. Эта сборка показывает libpthread и некоторые другие библиотеки. Почему она не работает на стандартном Ubuntu 24.04?
Ответ или решение
Чтобы определить, почему ваши исполняемые файлы не показывают libpthread
в выводе команды ldd
, мы можем рассмотреть несколько моментов:
-
Порядок линковки библиотек: Ваша команда линковки указывает на
-lcrypto
и-lpthread
, но важно понимать, что порядок имеет значение. Еслиlibcrypto
ссылается на функциональностьlibpthread
, библиотекаlibpthread
должна быть размещена позже в списке команд линковки, чтобы быть правильно учтённой. Убедитесь, что вашMakefile
упоминает-lpthread
после-lcrypto
, чтобы гарантировать, что все необходимые зависимости будут включены. -
Линковщик и зависимости: Некоторые компиляторы или линковщики могут не добавлять
libpthread
автоматически, если они не обнаруживают явных ссылок на функции из этой библиотеки в вашем коде. Убедитесь, что в вашем коде действительно используются функции изpthread
, такие какpthread_create
,pthread_join
и т.д. Если в вашем коде нет таких ссылок, линковщик может проигнорироватьlibpthread
. -
Проверка зависимостей библиотек: Ваша библиотека
libcrypto
может не зависеть отlibpthread
в текущей конфигурации или версии. Вы можете использовать командуldd /путь/к/libcrypto.so.3
для проверки, есть ли в ней явные ссылки наlibpthread
. Если нет, то линковщик не будет включатьlibpthread
в ваш исполняемый файл. -
Использование
nm
иreadelf
: Убедитесь, что все необходимые функции изpthread
действительно потребуются в вашем исполняемом файле. Если некоторые функции остаются неопределенными, возможно, вам нужно будет пересобрать и убедиться, что используемые вами библиотеки устраняют все подобные неопределённости. Также стоит проверить, если вreadelf -d
отсутствуетlibpthread
, это подчеркивает, что библиотека не добавлена в зависимые библиотеки вашего исполняемого файла. -
Версии и платформа: Вы упомянули, что ваша сборка на RHEL показывает наличие
libpthread
. Возможно, различия в версиях библиотек или in ld (линковщик) между RHEL и Ubuntu 24.04 могут также играть роль. Версии библиотек могут различаться, и вам стоит проверить, как они развиваются в каждой из экосистем и если есть какие-либо специфические флаги или опции, необходимые для совместимости. -
Принудительное добавление: Если вы уверены, что функции
pthread
необходимы, вы можете попробовать принудительно добавить-lpthread
в команду линковки, даже не полагаясь только на зависимости.
Проверьте и исправьте эти аспекты, и это должно помочь вам решить проблему отсутствия libpthread
в выводе команды ldd
вашего исполняемого файла.