[devel] I: verify-elf for plugins etc. with RPM_LD_PRELOAD_xxxx & RPM_FILES_TO_LD_PRELOAD_xxxx; was: Re: python3-3.5 unmets

Ivan Zakharyaschev imz на altlinux.org
Вс Дек 18 13:13:47 MSK 2016


Хочу дописать своё мнение о том, хороший это механизм или нет, что 
требуется доделать.

On Tue, 5 Apr 2016, Ivan Zakharyaschev wrote:

> On Fri, 1 Apr 2016, Ivan Zakharyaschev wrote:
>
>>  (Им же в verify_elf делается LD_PRELOAD, чтобы не засорять лог сборки
>>  несущественными сообщениями об undefined symbols. Для случая, когда
>>  такая библиотека кладётся в системные /usr/lib/, есть макрос
>>  %requires_python_ABI_for_files; пример -- пакет boost или
>>  python3-module-pygobject или python-module-pygobject3. Иначе пакет не
>>  пропустят.)
>
> Появился механизм для проверки всяких .so-плагинов на undefined symbols. 
> Можно пользоваться (например, видел краем глаза обилие саодельных проверок в 
> спеке apache). В качестве примера с помощью него реализована:
>
> 1. проверка всего внутри python*/site-packages/ (раньше были warnings)
> 2. а также макрос %requires_python3_ABI_for_files с явным указанием 
> интересных файлов.
>
> Принцип такой, что verify-elf понимает пары переменных окружения вида 
> RPM_LD_PRELOAD_xxxx и RPM_FILES_TO_LD_PRELOAD_xxxx (в случае одного из 
> питоноа в качестве идентификатора вместо xxxx выбрано python3, например).

В нынешнем состоянии это нехорошо вот чем.

Одна из прелестей успешного прохождения verify-elf (с unresolved=strict) в 
том, что наш автомат получается обучен тому, как загружать библиотеки и 
откуда взять все нужные символы. Это формальное знание можно использовать 
в lib.req, чтобы получить точные зависимости на множества требуемых 
символов. Принципиально этому ничего не мешает.

Например, в случае расставления настоящих RPATH/RUNPATH достигается и 
прохождение verify-elf без замечаний, и получение кучи правильных 
зависимостей, которых бы иначе не увидел автомат.

Но в случае с этим механизмом LD_PRELOAD для обработки "плагинов" первая 
часть реализована (verify-elf), а вторая-то в общем виде нет (lib.req).

Конечно, макрос %requires_python3_ABI_for_files делает костыль-зависимость 
(вместо зависимости на конкретную libpython3.so или /usr/bin/python3, 
которые одинаковое ABI им предоставляют). Так что в этом случае вторая 
часть решена, но костыльно (и неточно, без завсимости на множества 
символов, что было бы ещё лучше).

А в общем случае в нынешнем виде не очень хочется рекомендовать 
использовать этот механизм без реализации второй части, т.е. пользы от 
lib.req.

Я тогда это не так хорошо осознавал, что они должны идти для пользы рука 
об руку: verify-elf и lib.req, поэтому предлагал вторую часть всем 
по-своему дописывать:

> Поверх этого можно реализовывать нужные Вам макросы или задействовать 
> напрямую.
>
> Как предлагает glebfm@, чтобы ld-preload-ить программы, а не библиотеки, они 
> должны быть PIE.

Думаю, можно было бы связать их теснее, и для RPM_LD_PRELOAD_xxxx 
генерировать просто всегда жёсткую зависимость вида:

Requires: xxxx >= set:.......

Тогда останется мейнтейнерам пакетов с xxxx ещё обеспечить появление 
соответствующих:

Provides: xxxx = set:.......

-- 
Best regards,
Ivan


Подробная информация о списке рассылки Devel