LINUX.ORG.RU

Не подхватывается вручную собранная glibc в кастомной директории

 , ,


0

1

Есть устройство на arm с предустановленной glibc 2.28. Пытаюсь собрать программу с использованием SDL2, у которой множество зависимостей. Все зависимости установлены в /mnt/SDCARD/miyoo/lib/custom и нормально подватываются при установке LD_LIBRARY_PATH, однако, среди этих зависимостей есть libsystemd, которая требует glibc версии не ниже 2.30. glibc нужной версии так же есть в /mnt/SDCARD/miyoo/lib/custom, но libsystemd как будто ее не видит. Пробовал как уже готовые версии glibc, поставляемые через различные пакеты apt для armhf, так и собранную вручную, но ничего не помогает:

./test: /lib/libc.so.6:
version `GLIBC_2.30' not found (required by /mnt/SDCARD/miyoo/lib/custom/libsystemd.so.0)

Пробовал даже вручную прописать RUNPATH в libsystemd, вот так:

Dynamic section at offset 0x7a000 contains 37 entries:
  Tag        Type                         Name/Value
 0x0000001d (RUNPATH)                    Library runpath: [/mnt/SDCARD/miyoo/lib/custom/]
 0x00000001 (NEEDED)                     Shared library: [librt.so.1]
 0x00000001 (NEEDED)                     Shared library: [liblzma.so.5]
 0x00000001 (NEEDED)                     Shared library: [libzstd.so.1]
 0x00000001 (NEEDED)                     Shared library: [liblz4.so.1]
 0x00000001 (NEEDED)                     Shared library: [libgcrypt.so.20]
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x00000001 (NEEDED)                     Shared library: [ld-linux-armhf.so.3]
 0x0000000e (SONAME)                     Library soname: [libsystemd.so.0]

Но и это не помогло. С самим компилятором все нормально, hello world на целевом устройстве отрабатывает как надо. glibc тоже собрана, вроде, правильно. Конфигурировал вот такой командой:

CC=arm-linux-gnueabihf-gcc ../configure arm-linux-gnueabi --target=arm-linux-gnueabihf --with-float=hard --prefix=/usr/lib/arm-linux-gnueabihf/ --with-headers=/usr/arm-linux-gnueabihf/include:/usr/include --disable-werror

И вот еще вывод objdump -f для моей либы:

libc.so.6:     file format elf32-little
architecture: UNKNOWN!, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x0001ac39

и для предустановленной 2.28:

libc-2.28.so:     file format elf32-little
architecture: UNKNOWN!, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x0001785c

И лог при LD_DEBUG=all:

       893:	file=libc.so.6 [0];  needed by ./test [0] --- вот так ищет libc.so.6
       893:	find library=libc.so.6 [0]; searching
       893:	 search path=/mnt/SDCARD/miyoo/lib/custom		(LD_LIBRARY_PATH)
       893:	  trying file=/mnt/SDCARD/miyoo/lib/custom/libc.so.6
       893:	 search path=/lib/tls/v7l/neon/vfp:/lib/tls/v7l/neon:/lib/tls/v7l/vfp:/lib/tls/v7l:/lib/tls/neon/vfp:/lib/tls/neon:/lib/tls/vfp:/lib/tls:/lib/v7l/neon/vfp:/lib/v7l/neon:/lib/v7l/vfp:/lib/v7l:/lib/neon/vfp:/lib/neon:/lib/vfp:/lib		(system search path)
       893:	  trying file=/lib/tls/v7l/neon/vfp/libc.so.6
       893:	  trying file=/lib/tls/v7l/neon/libc.so.6
       893:	  trying file=/lib/tls/v7l/vfp/libc.so.6
       893:	  trying file=/lib/tls/v7l/libc.so.6
       893:	  trying file=/lib/tls/neon/vfp/libc.so.6
       893:	  trying file=/lib/tls/neon/libc.so.6
       893:	  trying file=/lib/tls/vfp/libc.so.6
       893:	  trying file=/lib/tls/libc.so.6
       893:	  trying file=/lib/v7l/neon/vfp/libc.so.6
       893:	  trying file=/lib/v7l/neon/libc.so.6
       893:	  trying file=/lib/v7l/vfp/libc.so.6
       893:	  trying file=/lib/v7l/libc.so.6
       893:	  trying file=/lib/neon/vfp/libc.so.6
       893:	  trying file=/lib/neon/libc.so.6
       893:	  trying file=/lib/vfp/libc.so.6
       893:	  trying file=/lib/libc.so.6


       893:	file=libasound.so.2 [0];  needed by /mnt/SDCARD/miyoo/lib/custom/libSDL2-2.0.so.0 [0] --- вот так ищет любую другую либу
       893:	find library=libasound.so.2 [0]; searching
       893:	 search path=/mnt/SDCARD/miyoo/lib/custom		(LD_LIBRARY_PATH)
       893:	  trying file=/mnt/SDCARD/miyoo/lib/custom/libasound.so.2

В чем может быть проблема? Как проверить, правильно ли собрана моя glibc, если она никак не хочет подхватываться?

Если я правильно понял, то суть задумки в том, чтобы запускать бинарники с новой версией glibc, не заменяя при этом системную. Если это так, то советую посмотреть на

readelf -l <ваш бинарник>

Если там написано что-то вроде Requesting program interpreter: /lib/ld.so, то нужно переписать путь загрузчика на загрузчик от вашей glibc из /mnt, например с помощью утилиты patchelf

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 2)
Ответ на: комментарий от Kron4ek

Так тоже можно делать, но через patchelf --set-interpreter правильнее. Например, программу, запущенную «вручную» через ld-linux, намного сложнее отлаживать gdb

annulen ★★★★★
()
Ответ на: комментарий от hardbasser

почему именно эту либу для линковки надо использовать

ld-linux.so - это не либа, это ELF-интерпретатор или «загрузчик». Загрузчик всегда должен быть от той же libc, с которой собраны бинарники.

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)