LINUX.ORG.RU

История изменений

Исправление Bass, (текущая версия) :

В качестве резюме (влруг кому интересно?): эксперименты с patchelf ни к чему толковому не привели. Всё работает для программы уровня «hello, world», но для ELF-файлов, имеющих сложные зависимости, всё далеко не так однозначно.

Проблема в том, что при замене libc.so.6 на более старый вариант необходимо заменять на более старые и прочие зависимости, а это целый ворох из libX11, libXt, libXp, libXdmcp и т. д.

В результате путь поиска libc.so.6, конечно, меняется, но в выводе ldd наблюдаем ошибки:

$ ldd libawt.so 
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.28' not found (required by /usr/lib/i386-linux-gnu/libX11.so.6)
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.28' not found (required by /usr/lib/i386-linux-gnu/libxcb.so.1)
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.25' not found (required by /lib/i386-linux-gnu/libuuid.so.1)
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.28' not found (required by /lib/i386-linux-gnu/libuuid.so.1)
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.25' not found (required by /usr/lib/i386-linux-gnu/libbsd.so.0)
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.28' not found (required by /lib/i386-linux-gnu/librt.so.1)
        linux-gate.so.1 (0xf7fc9000)
        libmlib_image.so => not found
        libjvm.so => not found
        libXp.so.6 => /usr/lib/i386-linux-gnu/libXp.so.6 (0xf7b28000)
        libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0xf7abf000)
        libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xf7aaa000)
        libXtst.so.6 => /usr/lib/i386-linux-gnu/libXtst.so.6 (0xf7aa2000)
        libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xf7954000)
        libm.so.6 => /lib/i386-linux-gnu/glibc-2.24/libm.so.6 (0xf78fe000)
        libdl.so.2 => /lib/i386-linux-gnu/glibc-2.24/libdl.so.2 (0xf78f8000)
        libjava.so => not found
        libc.so.6 => /lib/i386-linux-gnu/glibc-2.24/libc.so.6 (0xf7737000)
        libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xf7732000)
        libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xf7727000)
        libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xf770a000)
        libXi.so.6 => /usr/lib/i386-linux-gnu/libXi.so.6 (0xf76f7000)
        libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xf76c9000)
        /lib/ld-linux.so.2 (0xf7fca000)
        libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xf76c0000)
        libbsd.so.0 => /usr/lib/i386-linux-gnu/libbsd.so.0 (0xf76a1000)
        libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xf769a000)
        librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf768f000)
        libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf766c000)

Ну и при запуске, конечно, segmentation fault. Так что единственный выход – либо контейнер, либо виртуальная машина.

Исходная версия Bass, :

В качестве резюме (влруг кому интересно?): эксперименты с patchelf ни к чему толковому не привели. Всё работает для программы уровня «hello, world», но для ELF-файлов, имеющих сложные зависимости, всё далеко не так однозначно.

Проблема в том, что при замене libc.so.6 на более старый вариант необходимо заменять на более старые и прочие зависимости, а это целый ворох из libX11, libXt, libXp, libXdmcp и т. д.

В результате путь поиска libc.so.6, конечно, меняется, но в выводе ldd наблюдаем ошибки:

$ ldd libawt.so 
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.28' not found (required by /usr/lib/i386-linux-gnu/libX11.so.6)
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.28' not found (required by /usr/lib/i386-linux-gnu/libxcb.so.1)
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.25' not found (required by /lib/i386-linux-gnu/libuuid.so.1)
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.28' not found (required by /lib/i386-linux-gnu/libuuid.so.1)
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.25' not found (required by /usr/lib/i386-linux-gnu/libbsd.so.0)
./libawt.so: /lib/i386-linux-gnu/glibc-2.24/libc.so.6: version `GLIBC_2.28' not found (required by /lib/i386-linux-gnu/librt.so.1)
        linux-gate.so.1 (0xf7fc9000)
        libmlib_image.so => not found
        libjvm.so => not found
        libXp.so.6 => /usr/lib/i386-linux-gnu/libXp.so.6 (0xf7b28000)
        libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0xf7abf000)
        libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xf7aaa000)
        libXtst.so.6 => /usr/lib/i386-linux-gnu/libXtst.so.6 (0xf7aa2000)
        libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xf7954000)
        libm.so.6 => /lib/i386-linux-gnu/glibc-2.24/libm.so.6 (0xf78fe000)
        libdl.so.2 => /lib/i386-linux-gnu/glibc-2.24/libdl.so.2 (0xf78f8000)
        libjava.so => not found
        libc.so.6 => /lib/i386-linux-gnu/glibc-2.24/libc.so.6 (0xf7737000)
        libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xf7732000)
        libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xf7727000)
        libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xf770a000)
        libXi.so.6 => /usr/lib/i386-linux-gnu/libXi.so.6 (0xf76f7000)
        libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xf76c9000)
        /lib/ld-linux.so.2 (0xf7fca000)
        libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xf76c0000)
        libbsd.so.0 => /usr/lib/i386-linux-gnu/libbsd.so.0 (0xf76a1000)
        libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xf769a000)
        librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf768f000)
        libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf766c000)

Ну и при запуске, конечно, segmentation fault. Так что единственный выход – либо контейнер, либо виртуальная машина.