Я гоняюсь за призраками? динамически связанные библиотеки в среде glib c exe в среде musl c - PullRequest
2 голосов
/ 21 февраля 2020

У меня есть библиотека поставщика с закрытым исходным кодом, которая была скомпилирована в среде glib c, скорее всего, в Debian или Ubuntu.

На работе нам трудно использовать альпийские изображения, которые являются средой c.

У меня есть изображение c на альпийском docker изображении. Тем не менее, при запуске исполняемого файла все еще ищут много основных библиотек musl.

Я использую этот образ в качестве базового образа, так как на нем есть glib c. https://hub.docker.com/r/frolvlad/alpine-glibc/

Я добавил /usr/glibc-compat/lib/ к LD_LIBRARY_PATH. Затем я запускаю следующую команду:

ldd /app/clidriver/bin/db2cli
        /lib64/ld-linux-x86-64.so.2 (0x7f636d9de000)
        libdb2.so.1 => /app/clidriver/lib//libdb2.so.1 (0x7f636b553000)
        libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f636d9de000)
        libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f636d9de000)
        libstdc++.so.6 => ../lib/libstdc++.so.6 (0x7f636b3ba000)
        libgcc_s.so.1 => ../lib/libgcc_s.so.1 (0x7f636b3a6000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f636d9de000)
        libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f636d9de000)
        libcrypt.so.1 => /usr/glibc-compat/lib//libcrypt.so.1 (0x7f636b36d000)
        librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f636d9de000)
        libpam.so.0 => /lib/libpam.so.0 (0x7f636b35e000)
        libxml2.so.2 => ./libxml2.so.2 (0x7f636b235000)
        libz.so.1 => /lib/libz.so.1 (0x7f636b21b000)
        liblzma.so.5 => ./liblzma.so.5 (0x7f636b1f8000)
Error relocating /app/clidriver/lib//libdb2.so.1: pthread_mutexattr_setkind_np: symbol not found
Error relocating /app/clidriver/lib//libdb2.so.1: pthread_attr_setaffinity_np: symbol not found
Error relocating /app/clidriver/lib//libdb2.so.1: __snprintf_chk: symbol not found
Error relocating /app/clidriver/lib//libdb2.so.1: __register_atfork: symbol not found
Error relocating /app/clidriver/lib//libdb2.so.1: __vsnprintf_chk: symbol not found
Error relocating /app/clidriver/lib//libdb2.so.1: sysctl: symbol not found
Error relocating /app/clidriver/lib//libdb2.so.1: backtrace: symbol not found
Error relocating /app/clidriver/lib//libdb2.so.1: getgrent_r: symbol not found
Error relocating /app/clidriver/lib//libdb2.so.1: __res_init: symbol not found
Error relocating /app/clidriver/lib//libdb2.so.1: dlvsym: symbol not found
Error relocating /usr/glibc-compat/lib//libcrypt.so.1: __stpncpy: symbol not found
Error relocating /usr/glibc-compat/lib//libcrypt.so.1: __open_nocancel: symbol not found
Error relocating /usr/glibc-compat/lib//libcrypt.so.1: __read_nocancel: symbol not found
Error relocating /usr/glibc-compat/lib//libcrypt.so.1: __snprintf: symbol not found
Error relocating /usr/glibc-compat/lib//libcrypt.so.1: __explicit_bzero_chk: symbol not found
Error relocating /usr/glibc-compat/lib//libcrypt.so.1: __libc_alloca_cutoff: symbol not found
Error relocating /usr/glibc-compat/lib//libcrypt.so.1: __close_nocancel: symbol not found
Error relocating /usr/glibc-compat/lib//libcrypt.so.1: errno: symbol not found
Error relocating /app/clidriver/bin/db2cli: __printf_chk: symbol not found
Error relocating /app/clidriver/bin/db2cli: __strncat_chk: symbol not found
Error relocating /app/clidriver/bin/db2cli: __vsprintf_chk: symbol not found
Error relocating /app/clidriver/bin/db2cli: __fprintf_chk: symbol not found

Похоже, libcrypt использует версию glib c -compat, но даже она не может найти определенные символы. Я не эксперт в этом вопросе низкого уровня, но есть ли способ заставить весь exe использовать определенные c версии библиотек?

1 Ответ

1 голос
/ 22 февраля 2020

Из FAQ по Musl:

Is musl compatible with glibc?
...
  Binary compatibility is much more limited, but it will steadily increase with new
  versions of musl. At present, some glibc-linked shared libraries can be loaded with musl,
  but all but the simplest glibc-linked applications will fail if musl is dropped-in
  in place of /lib/ld-linux.so.2.

Короче говоря: да, вы будете преследовать призраков, пытаясь запустить смесь DSIB, скомпилированных с GLIB C и Musl. Даже если вы заставите его работать сегодня, он, скорее всего, сломается завтра, когда поставщик отправит вам новую версию DSO, построенного на GLIB C, или когда вы поменяете некоторые из ваших собственных DSO, построенных на Musl.

You следует либо получить исходную лицензию, либо заставить поставщика создать версию DSO для Musl, либо создать все других ваших DSO и основной исполняемый файл для GLIB C.

...