Bug 39530

Summary: ldd segfault при сборке пакета под i586
Product: Sisyphus Reporter: Aleksey Cheusov <vle>
Component: rpm-buildAssignee: placeholder <placeholder>
Status: NEW --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: arseny, glebfm, imz, iv, ldv, legion, placeholder, vle, vt
Version: unstable   
Hardware: x86_64   
OS: Linux   

Description Aleksey Cheusov 2021-01-10 19:41:55 MSK
При сборке пакета lmdbg-1.3.0-alt1 под i586 крешится ldd(1) как показано ниже.
Воспроизводится как в сборочнице, так и в локальном хешере.
Под x86_64 не воспроизводится.

Finding Requires (using /usr/lib/rpm/find-requires)
Executing: /bin/sh -e /usr/src/tmp/rpm-tmp.gpym1I
find-requires: running scripts (cpp,debuginfo,files,lib,pam,perl,pkgconfig,pkgconfiglib,python,rpmlib,shebang,shell,static,symlinks,systemd-services)
/usr/lib/rpm/ldd: line 100: 108570 Segmentation fault      LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now LD_DEBUG=$debug LD_LIBRARY_VERSION=$verify_out LD_PRELOAD="$rtld_preload" "$rtld" --library-path "$rpath" "$rtld_target"
ldd: ERROR: : trace failed
find-requires: ERROR: /usr/lib/rpm/lib.req failed

Полный лог здесь: http://git.altlinux.org/tasks/264463/logs/events.1.1.log.
Comment 1 Ivan A. Melnikov 2021-01-12 13:53:10 MSK
/usr/lib/rpm/find-requires спотыкается на /usr/src/tmp/lmdbg-buildroot/usr/lib/debug/usr/lib/liblmdbg.so.0.0.debug. Точнее, падает (в i586-м хешере на x86_64) команда

LD_TRACE_LOADED_OBJECTS=1  /lib/ld-linux.so.2 --library-path /usr/src/tmp/lmdbg-buildroot/lib:/usr/src/tmp/lmdbg-buildroot/usr/lib /usr/src/tmp/lmdbg-buildroot/usr/lib/debug/usr/lib/liblmdbg.so.0.0.debug

Интересно, что просто /usr/bin/ldd /usr/src/tmp/lmdbg-buildroot/usr/lib/debug/usr/lib/liblmdbg.so.0.0.debug не сегфолтится так как

$ /lib/ld-linux.so.2 --verify /usr/src/tmp/lmdbg-buildroot/usr/lib/debug/usr/lib/liblmdbg.so.0.0.debug; echo $?
2

Ну потому что реально это не совсем настоящий "ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped", что бы там file по этому поводу не думал.

С точки зрения lmdbg проблема в том, что из-за недосмотра автора спека на 32-битных архитектурах файлы debuginfo попадают в основной пакет. Такое вот тривиальное изменение, возможно, не является оптимальным вариантом (зачем в этом пакете симлинки?), но исправляет сборку на i586

 %files -n lib%name
-%_libdir/*
+%_libdir/*.so*


Неплохо бы куда-нибудь в rpmbuild добавить проверку, что файлы debuginfo ни в какие пакеты не попадают (кроме формируемых автоматически *-debuginfo), чтобы до find-requires получать в таких ситуациях вменяемую диагностику.

Также было бы полезно повысить информированность общественности о невероятных возможностях %define _scripts_debug 3.
Comment 2 Dmitry V. Levin 2021-01-12 16:26:25 MSK
(In reply to Ivan A. Melnikov from comment #1)
> /usr/lib/rpm/find-requires спотыкается на
> /usr/src/tmp/lmdbg-buildroot/usr/lib/debug/usr/lib/liblmdbg.so.0.0.debug.
> Точнее, падает (в i586-м хешере на x86_64) команда
> 
> LD_TRACE_LOADED_OBJECTS=1  /lib/ld-linux.so.2 --library-path
> /usr/src/tmp/lmdbg-buildroot/lib:/usr/src/tmp/lmdbg-buildroot/usr/lib
> /usr/src/tmp/lmdbg-buildroot/usr/lib/debug/usr/lib/liblmdbg.so.0.0.debug
> 
> Интересно, что просто /usr/bin/ldd
> /usr/src/tmp/lmdbg-buildroot/usr/lib/debug/usr/lib/liblmdbg.so.0.0.debug не
> сегфолтится так как
> 
> $ /lib/ld-linux.so.2 --verify
> /usr/src/tmp/lmdbg-buildroot/usr/lib/debug/usr/lib/liblmdbg.so.0.0.debug;
> echo $?
> 2

Мне кажется, что разница обусловлена парметрами, возможно, ldd -r тоже свалится.

> Ну потому что реально это не совсем настоящий "ELF 32-bit LSB shared object,
> Intel 80386, version 1 (SYSV), dynamically linked, not stripped", что бы там
> file по этому поводу не думал.
> 
> С точки зрения lmdbg проблема в том, что из-за недосмотра автора спека на
> 32-битных архитектурах файлы debuginfo попадают в основной пакет. Такое вот
> тривиальное изменение, возможно, не является оптимальным вариантом (зачем в
> этом пакете симлинки?), но исправляет сборку на i586
> 
>  %files -n lib%name
> -%_libdir/*
> +%_libdir/*.so*

Это типовая ошибка упаковки.

Перевешиваю на rpm-build, но и там ошибки нет на самом деле.

> Неплохо бы куда-нибудь в rpmbuild добавить проверку, что файлы debuginfo ни
> в какие пакеты не попадают (кроме формируемых автоматически *-debuginfo),
> чтобы до find-requires получать в таких ситуациях вменяемую диагностику.

Понятно ли, как идентифицировать файлы debuginfo?

> Также было бы полезно повысить информированность общественности о
> невероятных возможностях %define _scripts_debug 3.

И rpmbuild -vvv?
Comment 3 Vitaly Chikunov 2021-01-12 18:20:41 MSK
> > Неплохо бы куда-нибудь в rpmbuild добавить проверку, что файлы debuginfo ни
> > в какие пакеты не попадают (кроме формируемых автоматически *-debuginfo),
> > чтобы до find-requires получать в таких ситуациях вменяемую диагностику.

Может проверка должны быть в sisyphus-check?

> Понятно ли, как идентифицировать файлы debuginfo?

Not stripped (налицие секции .symtab) + .debug_info/.zdebug_info секция + расширение .debug + локация в /usr/{lib,src}/debug.
Comment 4 Vitaly Chikunov 2021-01-12 18:47:58 MSK
(Ответ для Vitaly Chikunov на комментарий #3)
> > > Неплохо бы куда-нибудь в rpmbuild добавить проверку, что файлы debuginfo ни
> > > в какие пакеты не попадают (кроме формируемых автоматически *-debuginfo),
> > > чтобы до find-requires получать в таких ситуациях вменяемую диагностику.
> 
> Может проверка должны быть в sisyphus-check?

2. А ещё вариант - rpmbuild мог бы игнорировать файлы в /usr/lib/debug/*. Но тогда ошибка в спеке останется, но она не будет у нас ошибкой. Но, при возможном переходе в будущем на другой rpm она всплывёт с новой силой.
Comment 5 Alexey Gladkov 2021-01-12 19:11:41 MSK
(Ответ для Vitaly Chikunov на комментарий #3)
> Может проверка должны быть в sisyphus-check?
> 
> > Понятно ли, как идентифицировать файлы debuginfo?

sisyphus_check не лезет в payload пакета.
Comment 6 Ivan A. Melnikov 2021-01-13 10:34:16 MSK
(In reply to Vitaly Chikunov from comment #3)
> > > Неплохо бы куда-нибудь в rpmbuild добавить проверку, что файлы debuginfo ни
> > > в какие пакеты не попадают (кроме формируемых автоматически *-debuginfo),
> > > чтобы до find-requires получать в таких ситуациях вменяемую диагностику.
> 
> Может проверка должны быть в sisyphus-check?

Идея добавления такой проверки в rpmbuild была в том, чтобы она выполнилась до find-requires, verify-elf и всего такого -- чтобы в случае проблем сборка пакета завершалась ошибкой с диагностикой от этой проверки, а не непонятным падением чего-то там. sisyphus-check, емнип, отрабатывает позже.

С другой стороны, если падение ldd будет исправлено по месту, порядок естественно станет не важен.
Comment 7 Aleksey Cheusov 2021-01-13 12:20:59 MSK
Спек я, положим, поправлю, симлинки, допустим, уберу, но по-моему имеет смысл поправить ldd с тем, чтобы не падал все-таки. Тем более, что здесь есть люди, близкие к разработке glibc.
Comment 8 Aleksey Cheusov 2021-01-13 12:25:43 MSK
Забыл сказать. Для этого пакета в сборочницу нужно добавить пакет glibc-core-debuginfo. В противном случае его невозможно тестировать и выставить правильные зависимости. Потреба странная, но в данном конкретном случае обоснованная. Без debuginfo оно не работает. Сделайте плиз.