Bug 48494

Summary: /usr/bin/audacity is huge
Product: Sisyphus Reporter: ildar <ildar>
Component: audacityAssignee: Ivan A. Melnikov <iv>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: iv, ldv, mike, mikhailnov, placeholder, vt
Version: unstable   
Hardware: x86_64   
OS: Linux   
URL: https://sourceware.org/bugzilla/show_bug.cgi?id=32271

Description ildar 2023-11-18 08:40:00 MSK
размер файла 232 150 328 байт.
Похоже на ошибку сборки. Я проверил в других дистрибутивах, ничего подобного нет.
Comment 1 ildar 2023-11-18 08:42:41 MSK
да, strip помог
Comment 2 Ivan A. Melnikov 2023-11-18 09:28:04 MSK
Спасибо, посмотрю.
Comment 3 Ivan A. Melnikov 2023-11-22 13:09:16 MSK
Я ожидаю, что strip'ать /usr/bin/audacity должен rpmbuild, после того, как извлечёт из него debuginfo. rpmbuild, похоже, делает это, но не слишком успешно: он вызывает eu-strip, который по каким-то причинам не слишком справляется -- обычный strip справляется гораздо лучше:

$ rpm -qf /usr/bin/audacity
audacity-3.4.2-alt1.x86_64
$ cp /usr/bin/audacity ./audacity
$ eu-strip --strip-all ./audacity
$ ls -lh ./audacity
-rwxr-xr-x 1 iv iv 222M Nov 22 14:04 ./audacity
$ strip --strip-all ./audacity
$ ls -lh ./audacity
-rwxr-xr-x 1 iv iv 15M Nov 22 14:04 ./audacity

Перевешиваю на elfutils и прошу помощи знатоков оттуда.
Comment 4 Vitaly Chikunov 2023-11-23 11:09:50 MSK
- rpmpeek /ALT/Sisyphus/files/x86_64/RPMS/audacity-3.4.2-alt1.x86_64.rpm
$ readelf -S usr/bin/audacity
..
  [20] .bss              NOBITS       0000000000d68380  d67348 024360 00  WA  0   0 64
  [21] .gnu.build.attributes NOTE     0000000000d8e6e0 dd64be0 000048 00      0   0  4
  [22] .interp           PROGBITS     000000000dc77000 dc77000 00001c 00   A  0   0  8
...

Похоже после .bss много пустого пространства, это как раз примерно где и были .debug секции.

- rpmpeek /ALT/Sisyphus/files/x86_64/RPMS/audacity-debuginfo-3.4.2-alt1.x86_64.rpm
$ eu-readelf -S ./usr/lib/debug/usr/bin/audacity.debug
...
[20] .bss                 NOBITS       0000000000d68380 000003c0 00024360  0 WA     0   0 64
[21] .comment             PROGBITS     0000000000000000 000003c0 00000036  1 MS     0   0  1
[22] .GCC.command.line    PROGBITS     0000000000000000 000003f6 000004af  1 MS     0   0  1
[23] .gnu.build.attributes NOTE         0000000000d8e6e0 000008a8 00000048  0        0   0  4
[24] .debug_aranges       PROGBITS     0000000000000000 000008f0 000032f0  0        0   0  1
[25] .debug_info          PROGBITS     0000000000000000 00003be0 08a4e448  0        0   0  1
[26] .debug_abbrev        PROGBITS     0000000000000000 08a52028 002cc845  0        0   0  1
[27] .debug_line          PROGBITS     0000000000000000 08d1e86d 00928ec8  0        0   0  1
[28] .debug_str           PROGBITS     0000000000000000 09647735 02287da1  1 MS     0   0  1
[29] .debug_line_str      PROGBITS     0000000000000000 0b8cf4d6 00012aea  1 MS     0   0  1
[30] .debug_loclists      PROGBITS     0000000000000000 0b8e1fc0 00ff35a1  0        0   0  1
[31] .debug_rnglists      PROGBITS     0000000000000000 0c8d5561 003430f0  0        0   0  1
[32] .symtab              SYMTAB       0000000000000000 0cc18658 000d4970 24       33 17096  8
[33] .strtab              STRTAB       0000000000000000 0ccecfc8 0022097c  0        0   0  1
[34] .shstrtab            STRTAB       0000000000000000 0cf0d944 000001c8  0        0   0  1
[35] .interp              NOBITS       000000000dc77000 0cf0db10 0000001c  0 A      0   0  8
...


ps. Please reports bugs at https://sourceware.org/bugzilla/
Comment 5 ildar 2025-01-25 21:43:16 MSK
похоже на https://sourceware.org/bugzilla/show_bug.cgi?id=32271

Вопрос: а зачем вообще этот eu-strip используется? если бинари у нас в 99,99% случаев создаются binutils-ом и этот binutils всегда у нас в сборочном окружении.. кажется логичным использовать strip (?)
Comment 6 Ivan A. Melnikov 2025-05-06 19:45:58 MSK
Очередной подход к этой проблеме оказался чуть более успешным чем предыдущие.

Выяснилось, что в бинарнике audacity по результатам секции %install несколько секций c флагом SHF_ALLOC оказываются в конце файла:

  [35] .interp           PROGBITS        000000000c68f000 c68f000 00001c 00   A  0   0  8
  [36] .note.gnu.property NOTE            000000000c68f020 c68f020 000040 00   A  0   0  8
  [37] .note.gnu.build-id NOTE            000000000c68f060 c68f060 000024 00   A  0   0  4
  [38] .note.ABI-tag     NOTE            000000000c68f088 c68f088 000020 00   A  0   0  4
  [39] .gnu.hash         GNU_HASH        000000000c68f0a8 c68f0a8 016394 00   A  1   0  8
  [40] .dynstr           STRTAB          000000000c6a5440 c6a5440 0dc260 00   A  0   0  8
  [41] .dynamic          DYNAMIC         000000000c7816a0 c7816a0 0006c0 10  WA 40   0  8

Поскольку это секции с SHF_ALLOC, eu-strip не решается менять их адрес, а заодно и смещение, и они остаются там же, где и были, не смотря на пустоту на месте отладочных секций. Тем временем, strip из binutils меняет смещения этим секциям. Видимо, будучи частью binutils, он может легко воспользоваться более подробной информацией о семантике этих секций, но тут я в деталях не разбирался.

То есть это не баг, а меньший функционал eu-strip. Ну что ж.

Чтобы решить конкретную проблему с audacity достаточно было разобраться, почему эти секции оказываются в конце бинарника. Я искал долго и безуспешно искал источник проблем в опциях компоновщика и его скриптах, а надо было протереть глаза и посмотреть в саму секцию %install, где правится RPATH при помощи patchelf, который не стесняется переносить секции в новое место если в какой-то из них в старом месте ему не хватило, так сказать, места. Я же его правил, я в курсе его такого поведения. Но вот тут картинка сложилась не сразу.

Так что разумный вариант -- не использовать patchelf. В спеке уже был вариант изменения RPATH при помощи chrpath -r, спрятанный под %ifarch %e2k. Я перешёл на него на всех архитектурах, и это, похоже, сработало: бинарник вернулся к более разумному размеру, rpath на месте, и на первый взгляд всё работает:

$ ls -lh /usr/bin/audacity
-rwxr-xr-x 1 root root 12M May  6 19:09 /usr/bin/audacity
$ patchelf --print-rpath /usr/bin/audacity
$ORIGIN/../lib64/audacity

Ждём:

#383459 BUILDING #2.3 [locked] sisyphus/iv audacity.git=3.7.3-alt2
Comment 7 Repository Robot 2025-05-06 19:48:36 MSK
audacity-3.7.3-alt2 -> sisyphus:

 Tue May 06 2025 Ivan A. Melnikov <iv@altlinux> 3.7.3-alt2
 - unify rpath adjustment code with %e2k
   + simplifies spec;
   + helps eu-strip make smaller binaries (ALT#48494).
Comment 8 Vitaly Chikunov 2025-05-06 19:55:48 MSK
А нельзя было его сделать sparse после patchelf? (cp --sparse=always)
Comment 9 Ivan A. Melnikov 2025-05-06 20:02:00 MSK
(In reply to Vitaly Chikunov from comment #8)
> А нельзя было его сделать sparse после patchelf? (cp --sparse=always)

В этот момент в нём ещё есть вся отладочная информация. Или Вы предлагаете  его в %%install сделать sparse, и тогда после debugedit'а он останется sparse?
Comment 10 Vitaly Chikunov 2025-05-06 20:09:15 MSK
Чисто научный интерес поможет ли это (может и нет), сохранится ли sparse до конечной системы пользователя и бинарник останется в рабочем состоянии. Не предлагаю ваше решение менять на это.