Bug 32461 - маленькие функции бессистемно пропадают из DWARF
Summary: маленькие функции бессистемно пропадают из DWARF
Status: CLOSED WONTFIX
Alias: None
Product: Sisyphus
Classification: Development
Component: gcc5 (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Gleb F-Malinovskiy
QA Contact: qa-sisyphus
URL: https://gcc.gnu.org/bugzilla/show_bug...
Keywords:
Depends on:
Blocks:
 
Reported: 2016-09-01 07:15 MSK by Big Benis
Modified: 2018-07-13 02:40 MSK (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Big Benis 2016-09-01 07:15:35 MSK
Если попытаться пересобрать имеющийся пакет lame в текущей среде, то получаем:

$ nm libmp3lame/.libs/set_get.o |grep et_ogg
0000000000000370 T lame_get_ogg
0000000000000360 T lame_set_ogg
$ readelf -w libmp3lame/.libs/set_get.o |grep et_ogg
    <2297>   DW_AT_name        : (indirect string, offset: 0xe4c): lame_set_ogg
  0x00000e50 5f736574 5f6f6767 00707265 666c6167 _set_ogg.preflag

Возникает вопрос, куда делся DIE для функции lame_get_ogg. Для set есть, а для get нету.  Если однако компилировать с -O1, то DIE появляется.

$ rm -fv libmp3lame/set_get.lo 
removed ‘libmp3lame/set_get.lo’
$ make -C libmp3lame CFLAGS='-g -O1'
...
$ readelf -w libmp3lame/.libs/set_get.o |grep et_ogg
    <2297>   DW_AT_name        : (indirect string, offset: 0xc14): lame_set_ogg
    <22d6>   DW_AT_name        : (indirect string, offset: 0x120): lame_get_ogg
  0x00000120 6c616d65 5f676574 5f6f6767 006c616d lame_get_ogg.lam
  0x00000c10 74657200 6c616d65 5f736574 5f6f6767 ter.lame_set_ogg

В других библиотеках тоже такие случаи замечены. Получается что доступ к сигнатурам функций то ли есть то ли нихрена нету. Потому что всё это очень сильно глючит. А больше всех, на мой взгляд, глючит именно в gcc.

$ cat test.c
int var;
int foo(int arg) { return 0; }
int bar(int arg) { return 0; }
int baz(int arg) { return 0; }
int qux(int arg) { return 0; }
$ gcc -O1 -g -S test.c
$ fgrep -w $'"foo\n"bar\n"baz\n"qux' test.s
        .string "foo"
        .string "bar"
        .string "baz"
        .string "qux"
$ gcc -O2 -g -S test.c                    
$ fgrep -w $'"foo\n"bar\n"baz\n"qux' test.s
        .string "qux"

Кагбе если даже строки нету то совсем кисло.
Comment 1 Big Benis 2016-09-01 07:26:59 MSK
В gcc-4.9 это еще работало.

$ rm -fv libmp3lame/set_get.lo
removed ‘libmp3lame/set_get.lo’      
$ make -C libmp3lame CFLAGS='-g -O2' CC='gcc-5'
...
$ readelf -w libmp3lame/.libs/set_get.o |grep et_ogg
    <2297>   DW_AT_name        : (indirect string, offset: 0xbcd): lame_set_ogg
  0x00000bd0 655f7365 745f6f67 67007072 65666c61 e_set_ogg.prefla

$ rm -fv libmp3lame/set_get.lo
removed ‘libmp3lame/set_get.lo’      
$ make -C libmp3lame CFLAGS='-g -O2' CC='gcc-4.9'
...
$ readelf -w libmp3lame/.libs/set_get.o |grep et_ogg
    <227f>   DW_AT_name        : (indirect string, offset: 0xbaa): lame_set_ogg
    <22be>   DW_AT_name        : (indirect string, offset: 0x120): lame_get_ogg
  0x00000120 6c616d65 5f676574 5f6f6767 006c616d lame_get_ogg.lam
  0x00000bb0 65745f6f 67670070 7265666c 61670066 et_ogg.preflag.f
Comment 2 Gleb F-Malinovskiy 2016-09-01 17:20:50 MSK
Очень даже системно. Это результат оптимизации -fipa-icf.
Comment 3 Big Benis 2016-09-02 14:08:41 MSK
Мужчина! В библиотеке libperl-5.22.so ваш компилятор съел сразу 9 маленьких функций.

$ ./provided-symbols /usr/lib64/libperl-5.22.so
...
func    Perl_sortsv_flags       (p, p, i, p, i)
func    Perl_sortsv     (p, p, i, p)
func    Perl_pp_sort    (p)
func    Perl_set_caret_X        (p)
func    XS_DynaLoader_dl_undef_symbols  (p, p)
func    XS_DynaLoader_dl_install_xsub   (p, p)
func    XS_DynaLoader_dl_error  (p, p)
func    XS_DynaLoader_CLONE     (p, p)
func    XS_DynaLoader_dl_find_symbol    (p, p)
func    XS_DynaLoader_dl_unload_file    (p, p)
func    XS_DynaLoader_dl_load_file      (p, p)
func    boot_DynaLoader (p, p)
cannot find DIE for Perl_uvchr_to_utf8_flags 157780
cannot find DIE for Perl_utf8_to_uvchr_buf 158650
cannot find DIE for Perl_uvchr_to_utf8 15e4e0
cannot find DIE for XS_utf8_native_to_unicode 160a40
cannot find DIE for PerlIOBase_popped 163070
cannot find DIE for Perl_sv_nolocking 16ca20
cannot find DIE for NATIVE_TO_NEED 16d060
cannot find DIE for Perl_is_uni_alnum 16d1b0
cannot find DIE for Perl_valid_utf8_to_uvuni 16e550

Ваш недоделанный пальцем компилятор поедает маленькие функции, как медведь чижиков.  Кстати, provided-symbols.c можно посмотреть в github.com/svpv/rpmss.  Сегодня эта штука заработала лучше, чем вчера.  Можно в принципе довольно полную информацию обо всех типах извлечь.  Как говорил Ельцин, берите бинарной совместимости сколько хотите.
Comment 4 Big Benis 2016-09-07 09:36:40 MSK
Мужчины. Я скачал gcc6:

$ wget ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-6.2.0/gcc-6.2.0.tar.bz2

Сконфигурировал его буквально так:

$ ../gcc-6.2.0/configure --prefix=$HOME/gcc-6 --enable-languages=c,c++ --disable-multilib --with-system-zlib

Он установился в ~/gcc-6, и что бы вы думали? Всё заработало! Больше не глючит! В частности, если пересобрать lame

$ make -C libmp3lame CC=$HOME/gcc-6/bin/gcc

То получается что там всё нормально.

Мужчины, вы поймите. Вы - болезнь на теле общества. Вы ничего хорошего создать не можете, вы только портите людям жизнь, и получаете за это деньги, между прочим. Я вам багу зарепортил, мне через неделю говорят: "gcc5 is already the newest version". Вам было не судьба разобраться и счерри-пикнуть что там надо было счерри-пикнуть.

Я призываю всех мыслящих людей к диссенту против альт линукса. Этот засратый дистрибутив портит нам жизнь.
Comment 5 Dmitry V. Levin 2018-07-13 02:40:00 MSK
В gcc6 это безобразие исправлено, в gcc5 исправлять смысла нет.