Если попытаться пересобрать имеющийся пакет 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" Кагбе если даже строки нету то совсем кисло.
В 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
Очень даже системно. Это результат оптимизации -fipa-icf.
Мужчина! В библиотеке 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. Сегодня эта штука заработала лучше, чем вчера. Можно в принципе довольно полную информацию обо всех типах извлечь. Как говорил Ельцин, берите бинарной совместимости сколько хотите.
Мужчины. Я скачал 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". Вам было не судьба разобраться и счерри-пикнуть что там надо было счерри-пикнуть. Я призываю всех мыслящих людей к диссенту против альт линукса. Этот засратый дистрибутив портит нам жизнь.
В gcc6 это безобразие исправлено, в gcc5 исправлять смысла нет.