ldd не показывает libpthread

Вопрос или проблема

Я пытаюсь собрать исполняемый файл, который связывается с 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, мы можем рассмотреть несколько моментов:

  1. Порядок линковки библиотек: Ваша команда линковки указывает на -lcrypto и -lpthread, но важно понимать, что порядок имеет значение. Если libcrypto ссылается на функциональность libpthread, библиотека libpthread должна быть размещена позже в списке команд линковки, чтобы быть правильно учтённой. Убедитесь, что ваш Makefile упоминает -lpthread после -lcrypto, чтобы гарантировать, что все необходимые зависимости будут включены.

  2. Линковщик и зависимости: Некоторые компиляторы или линковщики могут не добавлять libpthread автоматически, если они не обнаруживают явных ссылок на функции из этой библиотеки в вашем коде. Убедитесь, что в вашем коде действительно используются функции из pthread, такие как pthread_create, pthread_join и т.д. Если в вашем коде нет таких ссылок, линковщик может проигнорировать libpthread.

  3. Проверка зависимостей библиотек: Ваша библиотека libcrypto может не зависеть от libpthread в текущей конфигурации или версии. Вы можете использовать команду ldd /путь/к/libcrypto.so.3 для проверки, есть ли в ней явные ссылки на libpthread. Если нет, то линковщик не будет включать libpthread в ваш исполняемый файл.

  4. Использование nm и readelf: Убедитесь, что все необходимые функции из pthread действительно потребуются в вашем исполняемом файле. Если некоторые функции остаются неопределенными, возможно, вам нужно будет пересобрать и убедиться, что используемые вами библиотеки устраняют все подобные неопределённости. Также стоит проверить, если в readelf -d отсутствует libpthread, это подчеркивает, что библиотека не добавлена в зависимые библиотеки вашего исполняемого файла.

  5. Версии и платформа: Вы упомянули, что ваша сборка на RHEL показывает наличие libpthread. Возможно, различия в версиях библиотек или in ld (линковщик) между RHEL и Ubuntu 24.04 могут также играть роль. Версии библиотек могут различаться, и вам стоит проверить, как они развиваются в каждой из экосистем и если есть какие-либо специфические флаги или опции, необходимые для совместимости.

  6. Принудительное добавление: Если вы уверены, что функции pthread необходимы, вы можете попробовать принудительно добавить -lpthread в команду линковки, даже не полагаясь только на зависимости.

Проверьте и исправьте эти аспекты, и это должно помочь вам решить проблему отсутствия libpthread в выводе команды ldd вашего исполняемого файла.

Оцените материал
Добавить комментарий

Капча загружается...