[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Аналог debootstrap для udeb-пакетов



On Tue, Jan 31, 2017 at 10:13:35AM +0300, Victor Wagner wrote:
> On Tue, 31 Jan 2017 09:31:10 +0300
> Alexander Galanin <al@galanin.nnov.ru> wrote:
> 
> > On Tue, 31 Jan 2017 00:39:59 +0300
> > dimas <dimas000@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  roam@ringlet.net roam@FreeBSD.org pp@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


Reply to: