Компиляция ловушки LD_PRELOAD для использования в chroot - PullRequest
1 голос
/ 21 октября 2019

Я знаю, что обычно мы не хотим иметь статическую ссылку на libc по соображениям совместимости, но у меня есть приложение, которое будет работать внутри Docker, и использование LD_PRELOAD получит выполнение для подключения функции libc (для целей анализа).

Когда я создаю это, я получаю динамически связанную, поэтому.

# arm-linux-gnueabi-gcc -fPIC -shared  -o libpreload-arm.so libpreload.c -ldl

# arm-linux-gnueabi-readelf -a libpreload-arm.so | grep Shared
  Type:                              DYN (Shared object file)
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]

Примечание. Я кросс-компилирую для ARM, поскольку среда в моем chroot является системой ARM,и qemu-user-arm запустит все это.

Я копирую необходимые библиотеки в chroot, как показано ниже:

# cp libpreload-arm.so /usr/local/lib/libpreload.so 
# cp `arm-linux-gnueabi-gcc -print-file-name=libc.so.6` /tmp/chroot/lib/
# arm-linux-gnueabi-readelf -a /tmp/chroot/lib/libc.so.6 | grep Shared
  Type:                              DYN (Shared object file)
 0x00000001 (NEEDED)                     Shared library: [ld-linux.so.3]
# cp `arm-linux-gnueabi-gcc -print-file-name=ld-linux.so.3` /tmp/chroot/lib/

Запуск этого, однако, обеспечивает такой результат:

# chroot /tmp/chroot /bin/sh -c "env -i HOME=/root PWD=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin LD_PRELOAD=/usr/local/lib/libpreload.so sh"
/bin/sh: '/lib/libc.so.6' library contains unsupported TLS
/bin/sh: '/lib/libc.so.6' library contains unsupported TLS
/bin/sh: can't load library 'libc.so.6'

Кажется, что-то несовместимо с моей средой бега, но я не могу понять, что именно. Обратите внимание, что я предпочел бы не создавать вручную всю папку / tmp / chroot, поскольку я копирую в систему, которую я хочу максимально эмулировать, в эту папку.

Таким образом, кажется, что мояОпции - это один из следующих вариантов - ни один из которых я не могу заставить работать: 1) Создайте libpreload-arm.so без динамических ссылок, скопируйте его и запустите 2) Создайте libpreload-arm.so с динамическим либкингом,скопируйте его и связанные библиотеки, и рассмотрите несовместимости

Любая поддержка будет принята с благодарностью.

...