Исправить жестко запрограммированное динамическое связывание исполняемого файла

Хотя для схожих задач можно использовать grep, awk и sed, каждая из них имеет свои сильные и слабые стороны.

Awk лучше всего подходит для табличных данных или когда вам нужно выполнить вычисления и т. Д.

Sed отлично справляется с заменой текста.

Grep лучше всего подходит для выбора строк из входных данных, поэтому я ожидал, что это будет быстрее, чем awk для этой задачи. Возможно, если вы объедините 3 команды grep в одну, вы увидите именно это. Прямо сейчас grep находится в невыгодном положении, так как ему нужно запускаться 3 раза, а второй и третий должны ждать ввода от первого. Это может объяснить, почему результат приходит с задержкой. Хотя я в этом не уверен.

4
09.06.2018, 14:11
1 ответ

No tengo el mismo binario que tienes pero hice una pequeña prueba y parece que patchelfpuede funcionar aquí. Tengo un binario hellocompilado con -Wl,-rpath=/home/ja/c/hello-puts/make/liby libtest.socomo dependencia:

$ ldd hello
        linux-vdso.so.1 (0x00007ffedb4f0000)
        libtest.so => /home/ja/c/hello-puts/make/lib/libtest.so (0x00007f04a2437000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f04a200f000)
        /lib64/ld-linux-x86-64.so.2 (0x0000564a42e36000)

Ejecuto patchelfcon --make-needed-absoluteusando patchelfdehttps://github.com/dezgeg/patchelf/:

$ patchelf --make-needed-absolute hello
$ ldd hello
        linux-vdso.so.1 (0x00007fff9baa3000)
        /home/ja/c/hello-puts/make/lib/libtest.so (0x00007f81bd0e2000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f81bccba000)
        /lib64/ld-linux-x86-64.so.2 (0x0000556714bb5000)

Creo que eso es lo que tienes. Copié helloa otra máquina y:

$ ldd./hello
        linux-vdso.so.1 =>  (0x00007fff92e7d000)
        /home/ja/c/hello-puts/make/lib/libtest.so => not found
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff381c9b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff382065000)

Primero eliminé una dependencia necesaria libtest.so:

$ patchelf --remove-needed /home/ja/c/hello-puts/make/lib/libtest.so hello
$ ldd hello
        linux-vdso.so.1 =>  (0x00007ffdcedfb000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f60705c5000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f607098f000)

Intenté ejecutar hello, comenzó, pero debido a un enlace diferido realizado por el intérprete solo se mostró la primera línea de la salida esperada:

$./hello
hello world
./hello: symbol lookup error:./hello: undefined symbol: foo

Agregué libtest.sonuevamente pero sin una ruta absoluta:

$ patchelf --add-needed libtest.so hello
$ ldd hello
        linux-vdso.so.1 =>  (0x00007ffda155c000)
        libtest.so => not found
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffbdb8c3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ffbdbc8d000)

Copié libtest.soa $PWDy pude iniciarhello:

$ LD_LIBRARY_PATH=../hello
hello world
inside foo()
11
27.01.2020, 20:48

Теги

Похожие вопросы