Невозможно связать общий объект

У меня проблемы с привязкой моего приложения к общему объекту. Я чисто собрал buildroot, включая пакеты host-thrift и host-openssl.

ldd --verbose libthrift.so дает следующее:

./libthrift.so: /home/ano/workspace/source/open-source/buildroot/output/host/usr/lib/libcrypto.so.1.0.0: no version information available (required by ./libthrift.so)
./libthrift.so: /home/ano/workspace/source/open-source/buildroot/output/host/usr/lib/libssl.so.1.0.0: no version information available (required by ./libthrift.so)
./libthrift.so: /home/ano/workspace/source/open-source/buildroot/output/host/usr/lib/libssl.so.1.0.0: no version information available (required by ./libthrift.so)
    linux-vdso.so.1 =>  (0x00007ffda06bc000)
    libssl.so.1.0.0 => /home/ano/workspace/source/open-source/buildroot/output/host/usr/lib/libssl.so.1.0.0 (0x00007f0c37c10000)
    libcrypto.so.1.0.0 => /home/ano/workspace/source/open-source/buildroot/output/host/usr/lib/libcrypto.so.1.0.0 (0x00007f0c377d9000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0c375bb000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f0c3723f000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0c36f39000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0c36b74000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0c3695d000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0c36759000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f0c38129000)

    Version information:
    ./libthrift.so:
        libgcc_s.so.1 (GCC_3.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libstdc++.so.6 (CXXABI_1.3.1) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (GLIBCXX_3.4.9) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (CXXABI_1.3) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libpthread.so.0 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libpthread.so.0
        libcrypto.so.1.0.0 (OPENSSL_1.0.0) => not found
        libssl.so.1.0.0 (OPENSSL_1.0.1) => not found
        libssl.so.1.0.0 (OPENSSL_1.0.0) => not found
    /home/ano/workspace/source/open-source/buildroot/output/host/usr/lib/libssl.so.1.0.0:
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /home/ano/workspace/source/open-source/buildroot/output/host/usr/lib/libcrypto.so.1.0.0:
        libdl.so.2 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libdl.so.2
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.7) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libpthread.so.0:
        ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
        ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
        libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /usr/lib/x86_64-linux-gnu/libstdc++.so.6:
        ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
        libgcc_s.so.1 (GCC_4.2.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_3.3) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_3.0) => /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.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.18) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.17) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libm.so.6:
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
    /lib/x86_64-linux-gnu/libc.so.6:
        ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
    /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
    /lib/x86_64-linux-gnu/libdl.so.2:
        ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
        libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6

Что указывает на то, что есть что-то подозрительное:

./libthrift.so: /home/ano/workspace/source/open-source/buildroot/output/host/usr/lib/libcrypto.so.1.0.0: no version information available (required by ./libthrift.so)
./libthrift.so: /home/ano/workspace/source/open-source/buildroot/output/host/usr/lib/libssl.so.1.0.0: no version information available (required by ./libthrift.so)
./libthrift.so: /home/ano/workspace/source/open-source/buildroot/output/host/usr/lib/libssl.so.1.0.0: no version information available (required by ./libthrift.so)

Насколько я мог, Google может случиться, когда вы создаете новую версию библиотеки, а не ту, с которой пытаетесь запустить. Но здесь дело не в этом (если только библиотеки моего хоста не разыграют меня, я не вижу).

Также:

libcrypto.so.1.0.0 (OPENSSL_1.0.0) => not found
libssl.so.1.0.0 (OPENSSL_1.0.1) => not found
libssl.so.1.0.0 (OPENSSL_1.0.0) => not found

Тем не менее, эти файлы находятся в одной папке, созданной одновременно.

Что я пробовал:

1.

Играть с LD_LIBRARY_PATH а также LIBRARY_PATH не влияет на проблему, так как libthrift.so построен с помощью rpath:

readelf -a libthrift.so | grep PATH
0x000000000000000f (RPATH)              Library rpath: [/home/ano/workspace/source/open-source/buildroot/output/host/usr/lib]

2.

Проверка типов файлов:

> file libthrift.so
libthrift.so: symbolic link to `libthrift-0.9.2.so'

> file libthrift-0.9.2.so
libthrift-0.9.2.so: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=2dd133dea99a83cd5a8a9873e91503df3b7d7359, not stripped

> file libssl.so.1.0.0 
libssl.so.1.0.0: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=52c9028d053f16d05b6e1ff35605019182c8b28d, not stripped

3. (новая информация)

Скопировал мой местный /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 а также /lib/x86_64-linux-gnu/libssl.so.1.0.0 в /home/ano/workspace/source/open-source/buildroot/output/host/usr/lib/,

Это на самом деле решило проблему, так что теперь, если я правильно понимаю, похоже, что когда libthrift.so был собран в buildroot, он использовал мой локальный /lib библиотеки вместо тех, что были собраны самим buildroot.

1 ответ

Оказалось, ошибка в host-thrift пакет в buildroot. host-thrift объявил зависимость host-boost но не уточнил --with-boost а также --with-boost-libdir Параметры конфигурации для сборки хоста.

Я поставил HOST_THRIFT_CONF_OPTS чтобы:

HOST_THRIFT_CONF_OPTS = --with-sysroot=$(HOST_DIR) \
    --with-boost \
    --with-boost-libdir=$(HOST_DIR)/usr/lib \
    --disable-tests \
    --disable-tutorial

и это решило проблему.

Другие вопросы по тегам