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

Attachment: signature.asc
Description: PGP signature

Ответить