Bug 50190

Summary: Добавить макрос %brp_strip_keep_sections для сохранения секций в ELF-ах
Product: Sisyphus Reporter: Anton Zhukharev <ancieg>
Component: rpm-buildAssignee: placeholder <placeholder>
Status: NEW --- QA Contact: qa-sisyphus
Severity: enhancement    
Priority: P5 CC: arseny, glebfm, imz, ldv, placeholder, vt
Version: unstable   
Hardware: all   
OS: Linux   

Description Anton Zhukharev 2024-04-26 11:32:08 MSK
Необходимо для того, чтобы сохранять нестандарные секции в ELF-ах, которые по умолчанию у нас удаляются на этапе strip'а.

Пример изменений в rpm-build в таске 345861 (https://packages.altlinux.org/en/tasks/345861/).
Там же пример использования нового макроса на примере racket-core.

На примере racket-core: хотелось бы _рабочий_ бинарь с секцией .rackboot, но без остального "мусора" (например - /usr/bin/racket).
Comment 1 Arseny Maslennikov 2024-04-26 21:04:06 MSK
Я не вносил и не реализовывал идею стрипать всё неизвестное, но, по моему разумению, мы это сделали по следующим причинам:
— чтобы эти секции, попав в память процесса, не выступали случайно или злонамеренно трамплином для уязвимостей;
— чтобы малыми усилиями уменьшить вероятность непреднамеренной активации всяких misfeature в ELF-подсистеме и тулчейне, где при исполнении определённым образом составленных программ или библиотек автомагически отключаются различные меры безопасности или включаются меры, ведущие к уязвимостям;
— наконец, чтобы ELF-файлы не были толще, чем нужно.
Comment 2 Arseny Maslennikov 2024-04-26 21:04:17 MSK
(In reply to Anton Zhukharev from comment #0)
> Необходимо для того, чтобы сохранять нестандарные секции в ELF-ах, которые
> по умолчанию у нас удаляются на этапе strip'а.
> 
> Пример изменений в rpm-build в таске 345861
> (https://packages.altlinux.org/en/tasks/345861/).
> Там же пример использования нового макроса на примере racket-core.
> 
> На примере racket-core: хотелось бы _рабочий_ бинарь с секцией .rackboot, но
> без остального "мусора" (например - /usr/bin/racket).

А что в этом .rackboot находится? Какого рода контент? Подлежит ли эта секция отображению в память при работе, и если да, то как?
Comment 3 Anton Zhukharev 2024-04-26 22:52:49 MSK
(Ответ для Arseny Maslennikov на комментарий #2)
> (In reply to Anton Zhukharev from comment #0)
> > Необходимо для того, чтобы сохранять нестандарные секции в ELF-ах, которые
> > по умолчанию у нас удаляются на этапе strip'а.
> > 
> > Пример изменений в rpm-build в таске 345861
> > (https://packages.altlinux.org/en/tasks/345861/).
> > Там же пример использования нового макроса на примере racket-core.
> > 
> > На примере racket-core: хотелось бы _рабочий_ бинарь с секцией .rackboot, но
> > без остального "мусора" (например - /usr/bin/racket).
> 
> А что в этом .rackboot находится? Какого рода контент? Подлежит ли эта
> секция отображению в память при работе, и если да, то как?
Это, конечно, нужно у меня из октября 2022-го нужно спрашивать - сейчас я уже и не вспомню что там такого находится конкретно - в памяти остался только один факт: без этой секции бинарь /usr/bin/racket даже запускаться не собирался (была довольно странная ошибка, в которой ключевым словом было "boot").

Сейчас попробовал сделать элементарный "strip /usr/bin/racket" и бинарь запускается.
Странно - раньше было другое поведение. Видимо, что-то изменилось с того времени и сейчас мне нужно время, чтобы выяснить что конкретно и необходимость этой фичи в целом после такого.
Comment 4 Vitaly Chikunov 2024-04-28 13:54:57 MSK
Есть ли прецеденты в других дистрибутивах?

В Федоре делают так

  %global _find_debuginfo_opts --keep-section .rustc

В `rr` нужно сохранить секцию .page но почему-то примера я не нашел.
Comment 5 Anton Zhukharev 2024-06-05 13:11:23 MSK
(In reply to Anton Zhukharev from comment #3)
> Сейчас попробовал сделать элементарный "strip /usr/bin/racket" и бинарь
> запускается.
> Странно - раньше было другое поведение. Видимо, что-то изменилось с того
> времени и сейчас мне нужно время, чтобы выяснить что конкретно и
> необходимость этой фичи в целом после такого.

Если в спеке racket-core-8.8-alt2 убрать строки:
========================================
%brp_strip_debug %_bindir/*
%brp_strip_debug %racket_libdir/*
========================================
, пересобрать пакет и установить в систему, то /usr/bin/racket работать, все таки, перестает (причем, если strip'нуть его уже после установки при помощи обычного "strip /usr/bin/racket", то все работает нормально).
Вот так выглядит результат после установки с простым удалением тех двух строк:
========================================
user@host $ racket
malformed fasl-object header in petite
malformed boot file petite
Aborted
========================================
Comment 6 Anton Zhukharev 2024-06-05 13:12:32 MSK
(In reply to Vitaly Chikunov from comment #4)
> Есть ли прецеденты в других дистрибутивах?
> 
> В Федоре делают так
> 
>   %global _find_debuginfo_opts --keep-section .rustc
> 
> В `rr` нужно сохранить секцию .page но почему-то примера я не нашел.

Тот же Racket: https://src.fedoraproject.org/rpms/racket/blob/rawhide/f/racket.spec
Comment 7 Vitaly Chikunov 2024-06-06 14:42:53 MSK
(In reply to Vitaly Chikunov from comment #4)
> В `rr` нужно сохранить секцию .page но почему-то примера я не нашел.

Видимо, плохо искал

  %brp_strip_none %_libdir/rr/librr*.so
Comment 8 Anton Zhukharev 2024-06-06 16:09:46 MSK
(In reply to Vitaly Chikunov from comment #7)
> (In reply to Vitaly Chikunov from comment #4)
> > В `rr` нужно сохранить секцию .page но почему-то примера я не нашел.
> 
> Видимо, плохо искал
> 
>   %brp_strip_none %_libdir/rr/librr*.so

По названию кажется, что заставит вообще не strip'ать бинари

Мне же - в частности - нужно, чтобы strip происходил, но оставалась только одна секция .rackboot