# Ошибка компиляции firefox-52.4 c PGO +GCC-6.4,profile 17 PIE

## edyatl

Добрый день!

При обновлении системы обновил GCC до 6.4, затем в соответсвие с новостью перешел с 13-го профиля на 17-й с PIE, пересобрал GCC и тулчейн, поставил на полную пересборку 

```
emerge -ae @world
```

Вся система собралась нормально кроме firefox-52.4 с флагом PGO, на предыдущем 5-ом компиляторе эта версия собиралась без проблем.

Под конец компиляции возникает ошибка:

```
  ERROR: www-client/firefox-52.4.0::gentoo failed (compile phase):

    Failed to run 'emake -f client.mk profiledbuild'

 

  Call stack:

      ebuild.sh, line  124:  Called src_compile

    environment, line 5138:  Called virtx 'emake' '-f' 'client.mk' 'profiledbuild'

    environment, line 6218:  Called die

  The specific snippet of code:

        [[ ${retval} -ne 0 ]] && die "Failed to run '$@'";
```

Поиском ничего похожего не нашел.

Как это победить?

Заранее спасибо за помощь!

```
emerge --info '=www-client/firefox-52.4.0::gentoo'

Portage 2.3.13 (python 2.7.14-final-0, default/linux/amd64/17.0/desktop, gcc-6.4.0, glibc-2.25-r9, 4.9.49-gentoo-r1 x86_64)

=================================================================

                         System Settings

=================================================================

System uname: Linux-4.9.49-gentoo-r1-x86_64-AMD_Athlon-tm-_64_Processor_3200+-with-gentoo-2.4.1

KiB Mem:     1981324 total,     64300 free

KiB Swap:    3905532 total,   3604520 free

Timestamp of repository gentoo: Tue, 12 Dec 2017 10:00:01 +0000

Head commit of repository gentoo: 255b2e41ec1ec7d874ced2977b153cb4e341536e

sh bash 4.3_p48-r1

ld GNU ld (Gentoo 2.29.1 p3) 2.29.1

app-shells/bash:          4.3_p48-r1::gentoo

dev-java/java-config:     2.2.0-r3::gentoo

dev-lang/perl:            5.24.3::gentoo

dev-lang/python:          2.7.14-r1::gentoo, 3.5.4-r1::gentoo, 3.6.3-r1::gentoo

dev-util/cmake:           3.8.2::gentoo

dev-util/pkgconfig:       0.29.2::gentoo

sys-apps/baselayout:      2.4.1-r2::gentoo

sys-apps/openrc:          0.34.11::gentoo

sys-apps/sandbox:         2.10-r4::gentoo

sys-devel/autoconf:       2.13::gentoo, 2.69::gentoo

sys-devel/automake:       1.15.1-r1::gentoo

sys-devel/binutils:       2.29.1-r1::gentoo

sys-devel/gcc:            6.4.0::gentoo

sys-devel/gcc-config:     1.8-r1::gentoo

sys-devel/libtool:        2.4.6-r3::gentoo

sys-devel/make:           4.2.1::gentoo

sys-kernel/linux-headers: 4.4::gentoo (virtual/os-headers)

sys-libs/glibc:           2.25-r9::gentoo

Repositories:

gentoo

    location: /usr/portage

    sync-type: rsync

    sync-uri: rsync://rsync.gentoo.org/gentoo-portage

    priority: -1000

    sync-rsync-extra-opts: 

sk-overlay

    location: /var/lib/layman/sk-overlay

    masters: gentoo

    priority: 50

ACCEPT_KEYWORDS="amd64"

ACCEPT_LICENSE="* -@EULA"

CBUILD="x86_64-pc-linux-gnu"

CFLAGS="-march=athlon64-sse3 -O2 -pipe"

CHOST="x86_64-pc-linux-gnu"

CONFIG_PROTECT="/etc /usr/lib64/libreoffice/program/sofficerc /usr/share/gnupg/qualified.txt"

CONFIG_PROTECT_MASK="/etc/ca-certificates.conf /etc/dconf /etc/env.d /etc/fonts/fonts.conf /etc/gconf /etc/gentoo-release /etc/revdep-rebuild /etc/sandbox.d /etc/terminfo"

CXXFLAGS="-march=athlon64-sse3 -O2 -pipe"

DISTDIR="/usr/portage/distfiles"

FCFLAGS="-O2 -pipe"

FEATURES="assume-digests binpkg-logs config-protect-if-modified distlocks ebuild-locks fixlafiles merge-sync multilib-strict news parallel-fetch preserve-libs protect-owned sandbox sfperms strict unknown-features-warn unmerge-logs unmerge-orphans userfetch userpriv usersandbox usersync xattr"

FFLAGS="-O2 -pipe"

GENTOO_MIRRORS="http://mirror.yandex.ru/gentoo-distfiles/"

LANG="ru_RU.utf8"

LC_ALL=""

LDFLAGS="-Wl,-O1 -Wl,--as-needed"

MAKEOPTS="-j2"

PKGDIR="/usr/portage/packages"

PORTAGE_CONFIGROOT="/"

PORTAGE_RSYNC_OPTS="--recursive --links --safe-links --perms --times --omit-dir-times --compress --force --whole-file --delete --stats --human-readable --timeout=180 --exclude=/distfiles --exclude=/local --exclude=/packages --exclude=/.git"

PORTAGE_TMPDIR="/var/tmp"

USE="X a52 aac acl acpi alsa amd64 berkdb bindist bluetooth branding bzip2 cairo cdda cdr cli consolekit cracklib crypt cups cxx dbus dri dts dvd dvdr emboss encode exif fam firefox flac fortran gdbm gif glamor gpm gtk iconv icu ipv6 jpeg lcms ldap libnotify lock mad mng modules mp3 mp4 mpeg multilib ncurses nls nptl nvidia ogg opengl openmp pam pango pcre pdf png policykit ppds qt3support qt5 readline samba sdl seccomp session spell ssl startup-notification svg tcpd thunar tiff truetype udev udisks unicode upower usb vorbis wxwidgets x264 xattr xcb xml xv xvid xvmc zlib" ABI_X86="64" ALSA_CARDS="hda-intel" APACHE2_MODULES="authn_core authz_core socache_shmcb unixd actions alias auth_basic authn_alias authn_anon authn_dbm authn_default authn_file authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cgi cgid dav dav_fs dav_lock deflate dir disk_cache env expires ext_filter file_cache filter headers include info log_config logio mem_cache mime mime_magic negotiation rewrite setenvif speling status unique_id userdir usertrack vhost_alias" CALLIGRA_FEATURES="kexi words flow plan sheets stage tables krita karbon braindump author" COLLECTD_PLUGINS="df interface irq load memory rrdtool swap syslog" CPU_FLAGS_X86="3dnow 3dnowext mmx mmxext sse sse2 sse3" ELIBC="glibc" GPSD_PROTOCOLS="ashtech aivdm earthmate evermore fv18 garmin garmintxt gpsclock isync itrax mtk3301 nmea ntrip navcom oceanserver oldstyle oncore rtcm104v2 rtcm104v3 sirf skytraq superstar2 timing tsip tripmate tnt ublox ubx" GRUB_PLATFORMS="efi-64 pc" INPUT_DEVICES="evdev" KERNEL="linux" L10N="ru" LCD_DEVICES="bayrad cfontz cfontz633 glk hd44780 lb216 lcdm001 mtxorb ncurses text" LIBREOFFICE_EXTENSIONS="presenter-console presenter-minimizer" OFFICE_IMPLEMENTATION="libreoffice" PHP_TARGETS="php5-6 php7-0" POSTGRES_TARGETS="postgres9_5" PYTHON_SINGLE_TARGET="python3_5" PYTHON_TARGETS="python2_7 python3_5" RUBY_TARGETS="ruby22" USERLAND="GNU" VIDEO_CARDS="nvidia" XTABLES_ADDONS="quota2 psd pknock lscan length2 ipv4options ipset ipp2p iface geoip fuzzy condition tee tarpit sysrq steal rawnat logmark ipmark dhcpmac delude chaos account"

Unset:  CC, CPPFLAGS, CTARGET, CXX, EMERGE_DEFAULT_OPTS, INSTALL_MASK, PORTAGE_BUNZIP2_COMMAND, PORTAGE_COMPRESS, PORTAGE_COMPRESS_FLAGS, PORTAGE_RSYNC_EXTRA_OPTS

=================================================================

                        Package Settings

=================================================================

www-client/firefox-52.4.0::gentoo was built with the following:

USE="bindist dbus gmp-autoupdate jemalloc pgo startup-notification -custom-cflags -custom-optimization -debug -eme-free -gtk2 -hardened -hwaccel -jack (-neon) -pulseaudio (-rust) (-selinux) (-system-cairo) -system-harfbuzz -system-icu -system-jpeg -system-libevent -system-libvpx -system-sqlite -test -wifi" ABI_X86="(64)" L10N="ru -ach -af -an -ar -as -ast -az -bg -bn-BD -bn-IN -br -bs -ca -cak -cs -cy -da -de -dsb -el -en-GB -en-ZA -eo -es-AR -es-CL -es-ES -es-MX -et -eu -fa -ff -fi -fr -fy -ga -gd -gl -gn -gu -he -hi -hr -hsb -hu -hy -id -is -it -ja -ka -kab -kk -km -kn -ko -lij -lt -lv -mai -mk -ml -mr -ms -nb -nl -nn -or -pa -pl -pt-BR -pt-PT -rm -ro -si -sk -sl -son -sq -sr -sv -ta -te -th -tr -uk -uz -vi -xh -zh-CN -zh-TW"

CFLAGS="-march=athlon64-sse3 -pipe"

CXXFLAGS="-march=athlon64-sse3 -pipe"

LDFLAGS="-Wl,-O1 -Wl,--as-needed -Wl,-rpath=/usr/lib64/firefox,--enable-new-dtags"

```

The complete build log is located at '/var/tmp/portage/www-client/firefox-52.4.0/temp/build.log'.

https://gist.github.com/anonymous/db0a8fd334ecd0ef6468a412304f14d4

----------

## edyatl

Решение проблемы предложили в англоязычной ветке форума: https://forums.gentoo.org/viewtopic-p-8156022.html#8156022

Эта проблема проходит как баг https://bugs.gentoo.org/617690

Я применил патч предложенный fedeliallalinea и firefox собрался без ошибок.

Если вы столкнулись с такой же проблемой, то попробуйте применить патч:

```
# mkdir -p /etc/portage/patches/www-client/firefox

# curl https://617690.bugs.gentoo.org/attachment.cgi?id=483002 > /etc/portage/patches/www-client/firefox/UserPatch.patch

# cd $(portageq get_repo_path / gentoo)/www-client/firefox/

# ebuild firefox-52.4.0.ebuild  clean prepare

# emerge -a1 www-client/firefox
```

Однако я до конца не понял почему firefox-52.4 нормально собирался на 13-ом профиле с GCC-5 и почему на 17-м с GCC-6 появилась ошибка компиляции и что делает патч.

Если кто-то может прокомментировать и объяснить простым языком будет супер.

Заранее большое спасибо!

----------

## TigerJr

а зачем вам понадобилось обновлять GCC до 6.4, ведь вы не используете функции новых  компиляторов. 

сами ищете себе геморой?

```
gcc-config -l 
```

Какой компилятор по-умолчанию используется?

----------

## puleglot

 *TigerJr wrote:*   

> а зачем вам понадобилось обновлять GCC до 6.4, ведь вы не используете функции новых  компиляторов. 
> 
> сами ищете себе геморой?

 

Более старые версии gcc замаскированы в профилях 17+.

----------

## TigerJr

Переход на новый компилятор как правило обусловленно отсутствием поддержки инструкций новых процессоров, например эти опции были недоступны в GCC 5.x

 *Quote:*   

> CFLAGS="march=skylake -mclzero -mpku -mno-fma4"

 

Также расширили инструкции AVX512 и были добавленные дополнительные параметры компиляции:

 *Quote:*   

> -mavx512vl -mavx512bw -mavx512dq -mavx512ifma -mavx512vbmi

 

у семейства AMD появилось march=znver1

А ничего подобного я у вас не увидел, вот и не могу понять стоило ли вам менять profile на новый и к томуже обновлять компилятор!?

----------

## edyatl

 *TigerJr wrote:*   

> а зачем вам понадобилось обновлять GCC до 6.4, ведь вы не используете функции новых  компиляторов. 
> 
> сами ищете себе геморой?
> 
> ```
> ...

 

Вышла новость: 2017-11-30-new-17-profiles

Где написано: 

```
...Please migrate away from the 13.0 profiles within the six weeks after

GCC 6.4.0 has been stabilized on your architecture. The 13.0 profiles

will be deprecated then and removed in half a year...
```

При обновлении системы GCC обновился до 6.4. и в соответствие с новостью перешел на 17-й профиль.

```
# gcc-config -l 

 [1] x86_64-pc-linux-gnu-6.4.0 *
```

Непонятно влияет ли как-то профилирование с PGO флагом на работу FF при сборке новым компилятором. Если раньше с GCC 4.5 разница была заметна сильно, профилированный FF работал заметно шустрее и стабильнее, то сейчас застабилизировали FF 52.5.2, попробовал собрать его без PGO и разницу в работе с предыдущей профилированной сборкой сейчас не вижу. Есть ли смысл в этом профилировании, тем более, что вроде в следующем ESRе флаг PGO грозятся убрать?

----------

## TigerJr

профили устанавливают минимальные версии системных пакетов - для совместимого функционирования (python sandbox bash gcc glibc portage etc.) плюс минимальный набор package USE

К оптимизации компилятора profiles не имеет отношения.

 *Quote:*   

> gcc-config -l
> 
>  [1] x86_64-pc-linux-gnu-5.4.0
> 
>  [2] x86_64-pc-linux-gnu-6.4.0 *
> ...

 

у меня два компилятора стоят, друг-другу не мешают, второй как раз понадобился из-за -march=skylake

P/S

а вообще если интересна более тонкая оптимизация лучше сначала почитать про CFLAGS="-O1" CFLAGS="-O2" CFLAGS="-O3"

я например стараюсь использовать оптимизацияю O2 с ключами -mmmx msse3 -mavx -maes -fomit-frame-pointer -ftracer -ftree-vectorize  -floop-parallelize-all -pipe,

но неверные параметры такой оптимизации могут привезти к нерабочим бинарникам (например если задействовать -maes на архитектуре не поддерживающей эту инструкцию).

а более подробнее про используемые опции можно узнать из вывода:

Используемые инструкции архитектуры (можно и gcc -Q --help=target -march=athlon64-sse3 -msse3 -mmmx  )

 *Quote:*   

> gcc -Q --help=target

 

И разнообразные ключи компиляции находятся тут, хотя большая часть из них переключается флагами -O2 -O3, но и можно поиграть

 *Quote:*   

> gcc -Q --help=optimizers

 

Оптимизаторы могут приводить работу программ к непонятным ошибкам, поэтому -O3 используется редко

PS/2

 *Quote:*   

> /usr/portage/profiles/use.local.desc:www-client/firefox:pgo - Add support for profile-guided optimization using gcc-4.5, for faster binaries. This option will double the compile time.

 

-fprofile-generate и -fprofile-use задействуются при сборке с USE=pgo

Описание в мануале по GCC

патч добавил темплейт для функции, скорее всего тело функции существовало а прототипа функции обьявленно не было, ну и более новый компилятор при использовании стандарта g++11 отказался собирать обьектный файл без прототипа функции, а предыдущая версия компилятора могла собирать функции без их обьявления.

Не уверен, но скорее всего прототипы функций как раз и нужны для того чтобы компилятор оптимизировал их адреса и расположение в памяти относительно стека и правильно выделял для них память.

----------

