Несмотря на то, что установлен rpath, одна dll не найдена

ldd не может найти dll, которая присутствует в определении rpath. Найдены некоторые другие библиотеки (проверьте /./../lib/*)

Вот вывод ldd (мы видим, что 2 dll находятся в ../lib, но не libexpat.so.0:

root @ hyperstream: / DT / local / ADE-trunk4 / build-ADE-Desktop-Default / bin # ldd ./ade_admin linux-vdso.so.1 => (0x00007ffeb9796000) libadeversion.so => ​​/ DT / local / ADE -trunk4 / build-ADE-Desktop-Default / bin /./../ lib / libadeversion.so (0x00007f31abaef000) libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f31ab8ca000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f31ab6ac000) libaprutil-1.so.0 => / DT / local / ADE-trunk4 / build-ADE-Desktop-Default / bin / ./../lib/libaprutil-1.so.0 (0x00007f31ab58c000) libapr-1.so.0 => / DT / local / ADE-trunk4 / build-ADE-Desktop- По умолчанию / bin / ./../lib/libapr-1.so.0 (0x00007f31ab460000) libavahi-client.so.3 => / usr / lib / x86_64-linux-gnu / libavahi- client.so.3 (0x00007f31ab24d000) libavahi-common.so.3 => /usr/lib/x86_64-linux-gnu/libavahi-common.so.3 (0x00007f31ab041000) libdl.so.2 => / lib / x86_64- Linux-GNU / libdl.so.2 (0x00007f31aae3d000) libstdc ++. so.6 => / usr / lib / x86_64-linux- gnu / libstdc ++. so.6 (0x00007f31aaab5000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f31aa7ac000) libgcc_s.so.1 => / lib / x86_64-linux-gnu / libgcc_s.so.1 (0x00007f31aa595000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f31aa1cc000) /lib64/ld-linux-x86-64.so.2 (0x0000560d30a76000) < strong> libexpat.so.0 => не найдено librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f31a9fc4000) […]

root @ hyperstream: / DT / local / ADE-trunk4 / build-ADE-Desktop-Default / bin # file ../lib/libexpat.so.0 ../lib/libexpat.so.0: ELF 64-битный LSB общий объект, x86-64, версия 1 (SYSV), динамически связанный, BuildID [sha1] = 762de704943d03033d01a9725216d6b05d0740f5, без удаления

Здесь rpath:

root @ hyperstream: / DT / local / ADE-trunk4 / build-ADE-Desktop-Default / bin # readelf -d ade_admin | grep ‘R. * PATH’ 16: 0x000000000000001d (RUNPATH) Путь выполнения библиотеки: [$ {ORIGIN} /../ lib]

Теперь убийственный факт: он работает с clang 3.8, но терпит неудачу с gcc 6.3 (ubuntu 16.10)

Очевидно, добавление LD_LIBRARY_PATH = .. / lib заставит его снова работать, но цель rpath состояла в том, чтобы избежать его установки

root @ hyperstream: / DT / local / ADE-trunk4 / build-ADE-Desktop-Default / bin # export LD_LIBRARY_PATH = .. / lib root @ hyperstream: / DT / local / ADE-trunk4 / build-ADE-Desktop-Default / bin # ldd ./ade_admin linux-vdso.so.1 => (0x00007ffea23b6000) libadeversion.so => ​​../lib/libadeversion.so (0x00007f78c6474000) libuuid.so.1 => / lib / x86_64-linux-gnu / libuuid.so.1 (0x00007f78c624f000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f78c6031000) libaprutil-1.so.0 =>. ./lib/libaprutil-1.so.0 (0x00007f78c5f11000) libapr-1.so.0 => ../lib/libapr-1.so.0 (0x00007f78c5de5000) libavahi-client.so.3 => / usr / lib / x86_64-linux-gnu / libavahi-client.so.3 (0x00007f78c5bd2000) libavahi-common.so.3 => /usr/lib/x86_64-linux-gnu/libavahi-common.so.3 (0x00007f78c59c6000) libdl. so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f78c57c2000) libstdc ++. so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f78c543a000) libm. так.6 => / lib / x86_64-linux-gn u / libm.so.6 (0x00007f78c5131000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f78c4f1a000) libc.so.6 => / lib / x86_64-linux-gnu / libc.so.6 (0x00007f78c4b51000) /lib64/ld-linux-x86-64.so.2 (0x0000559fdceab000) libexpat.so.0 =>. ./lib/libexpat.so.0 ( 0x00007f78c492a000)

Любая идея ?

См. также:  Почему в двоичных файлах ELF байты инвертируются группами по два

С Уважением

Лоран

Просто чтобы вы знали, DLL — это специфичное для Windows имя разделяемой библиотеки. В мире Linux / Unix мы просто называем их разделяемыми библиотеками или SO (произносится ess ohs). Увидеть RPATH и DLL в одном предложении странно, потому что в Windows нет эквивалента RPATH.   —  person rafal98    schedule 05.07.2021

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. rafal98

    Я просто нахожу объяснение: clang поместил в раздел [НЕОБХОДИМО] ВСЕХ бинарных библиотек elf (даже библиотеки, явно не включенные мной, но упомянутые в разделе [НЕОБХОДИМО] библиотеки, которую я включаю

    пример из gcc:

    readelf -d my_prog
    
    Dynamic section at offset 0x9cb548 contains 46 entries:
      Tag        Type                         Name/Value
     0x0000000000000001 (NEEDED)             Shared library: [libadeversion.so]
     0x0000000000000001 (NEEDED)             Shared library: [libuuid.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [libsqlite3.so]
     0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
     0x0000000000000001 (NEEDED)             Shared library: [libaprutil-1.so.0]
     0x0000000000000001 (NEEDED)             Shared library: [libapr-1.so.0]
     0x0000000000000001 (NEEDED)             Shared library: [libavahi-client.so.3]
     0x0000000000000001 (NEEDED)             Shared library: [libavahi-common.so.3]
     0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
     0x0000000000000001 (NEEDED)             Shared library: [libaio.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [lib_adm64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_dict64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_rdm64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_dbr64.so]
     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]
     0x000000000000001d (RUNPATH)            Library runpath: [${ORIGIN}/../lib/:$ORIGIN/../lib/:../lib/]
    

    из clang:

    readelf -d my_prog
    
    Dynamic section at offset 0xa7bae8 contains 54 entries:
      Tag        Type                         Name/Value
     0x0000000000000001 (NEEDED)             Shared library: [libadeversion.so]
     0x0000000000000001 (NEEDED)             Shared library: [libuuid.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [libsqlite3.so]
     0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
     0x0000000000000001 (NEEDED)             Shared library: [libaprutil-1.so.0]
     0x0000000000000001 (NEEDED)             Shared library: [libexpat.so.0]
     0x0000000000000001 (NEEDED)             Shared library: [libapr-1.so.0]
     0x0000000000000001 (NEEDED)             Shared library: [libavahi-client.so.3]
     0x0000000000000001 (NEEDED)             Shared library: [libavahi-common.so.3]
     0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
     0x0000000000000001 (NEEDED)             Shared library: [libaio.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [libcrypt.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [lib_adm64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_dict64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_rdm64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_rpc64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_sql64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_rdbc64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_rm64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_ncp64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_cmp64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_repfltr64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_expat64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_cncp64.so]
     0x0000000000000001 (NEEDED)             Shared library: [lib_dbr64.so]
     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]
     0x000000000000001d (RUNPATH)            Library runpath: [${ORIGIN}/../lib/:$ORIGIN/../lib/:../lib/]
    

    И одна dll включает недостающую libexpat:

    readelf -d ../lib/libaprutil-1.so.0 
    
    Dynamic section at offset 0x1e698 contains 29 entries:
      Tag        Type                         Name/Value
     0x0000000000000001 (NEEDED)             Shared library: **[libexpat.so.0]**
     0x0000000000000001 (NEEDED)             Shared library: [libapr-1.so.0]
     0x0000000000000001 (NEEDED)             Shared library: [libuuid.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [libcrypt.so.1]
     0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
     0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
     0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
     0x000000000000000e (SONAME)             Library soname: [libaprutil-1.so.0]
    

    но RUNPATH используется только двоичным файлом, а не dll (у которого также может быть собственный RUNPATH).

    2 решения: — добавить RUNPATH в libaprutil-1.so.0, чтобы принудительно включить библиотеку из «.» — явно добавить все недостающие dll в мою сборку

    Надеюсь, это поможет

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

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: