On Tue, Jan 31, 2017 at 10:13:35AM +0300, Victor Wagner wrote: > On Tue, 31 Jan 2017 09:31:10 +0300 > Alexander Galanin <a...@galanin.nnov.ru> wrote: > > > On Tue, 31 Jan 2017 00:39:59 +0300 > > dimas <dimas...@ya.ru> wrote: > > > > > > Есть ли какой-нибудь ещё способ автоматически разобрать > > > > зависимости, скачать и распаковать udeb-пакеты? Или даже так: > > > > собираете ли вы initramfs автоматически, и если да, то как вы это > > > > делаете? > > > ... > > > принцип нехитрый - копирует сам бинарь, потом парсит вывод ldd для > > > него, ищет нужные либо по всем углам и копирует их тоже. > > > > В моём случае не подойдёт, т.к. ldd не работает с пакетами другой > > архитектуры (я собираю initramfs под armhf). В манах к mkinitramfs > > не нашёл упоминания о других архитектурах. > > Ну есть qemu-user emulation, в которой можно заставить ldd работать с > пакетами другой архитектуры. И насколько я помню, как раз для arm его > допилили до вполне приличного состояния когда Nokia развивала серию > N800-N810-N900-N9.
ldd не всега нужно; можно его емулировать вручную с помощи readelf и несколько больше утилит. Я когда-то писал утилиту, которая искает подходящюю библиотеку для LD_PRELOAD - было как-то некомфортно пытатся preload-ить amd64 shared object для i386 бинарника... https://gitlab.com/roam-multiarch-tools/multiarch-query Как написано, оно использует кеш ldconfig-а и берет имя библиотеки на командную строку. Ну, имена библиотек, в которых програма нуждается, можно найти с помощи readelf: readelf -d /bin/login | perl -nle '/NEEDED.*Shared library: \[(.*)\]/ and print $1' Потом, если нет кеша ldconfig, но все библиотеки находятся в одном деревом директорий, можно сделать чего-то либо: readelf -d /bin/login | \ perl -nle '/NEEDED.*Shared library: \[(.*)\]/ and print $1' | \ while read lib; do find /lib/x86_64-linux-gnu/ /usr/lib/x86_64-linux-gnu/ -type f \( -name "$lib" -or -name "$lib.*" \) done | \ while read fname; do # Пример: еще проверки; конечно, у всех библиотек # в /lib/x86_64-linux-gnu/ будет "Machine: AMD" :) if readelf -h -- "$fname" | egrep -qe 'Machine:.*Advanced Micro Devices'; then echo "$fname" fi done Конечно, есть какие-то библиотеки, которых таким образом не найти (libc, ld-linux, ...), но, надеемся, их уже есть в initramfs, или можем поставить вручную. Всего лучшего, Петр -- Peter Pentchev r...@ringlet.net r...@freebsd.org p...@storpool.com PGP key: http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint 2EE7 A7A5 17FC 124C F115 C354 651E EFB0 2527 DF13
signature.asc
Description: PGP signature