2015-09-17 72 views
1

我有问题将我的应用程序链接到共享对象。我已经干净地构建了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) 

据我已经能够给谷歌,当你建立针对新的可能发生这种情况一个库的版本,而不是你试图运行的版本。但在这里并不是这样(除非我的主持人的图书馆正在玩弄我看不到的伎俩)。

另外:

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 

然而,这些文件都没有在同一时间建立在同一个文件夹中。

我已经试过:

LD_LIBRARY_PATHLIBRARY_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/

INFACT解决这个问题,所以现在,如果我理解正确的话,好像libthrift.so始建于buildroot的时候,就用我的本地/lib库而不是被buildroot的自身内置的那些的。

回答

2

原来是buildroot中的host-thrift包中的一个错误。 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 

,并且解决了这一问题。

+0

那么,发生了什么事是你的主机上安装了Boost库,所以Buildroot拿起那些而不是它在$(HOST_DIR)中构建的那个?如果是这样,你的改变似乎是正确的,你能否向Buildroot邮件列表提交补丁?谢谢! –

+0

是的,这就是发生了什么事。我会尝试提交一个补丁。 – anorm