# CFLAGS und gcc - Lohnt sich ein Update?

## ChrisJumper

Hi, ich wollte nur mal fragen ob ihr eure CFLAGS anpasst?

Ich habe ein System mit march=core2 gebaut, obwohl es eigentlich eine ivybridge CPU besitzt:

Laut gcc-4.9.4 Handbuch unterstützt die Version mittlerweile auch ivybridge. Hier die Unterschiede:

```
core2’

    Intel Core 2 CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3 and SSSE3 instruction set support.
```

```
ivybridge’

    Intel Ivy Bridge CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AES, PCLMUL, FSGSBASE, RDRND and F16C instruction set support.
```

Meine Frage ist jetzt recht simple.

1. Ich wollte jetzt mein System anpassen, dann reicht doch ein emerge -e world aus oder?

2. Die gelisteten Erweiterungen werden nicht automatisch gesetzt durch die Zuweisung von CGLAGS="-march=ivybridge" oder? Das was mich stört ist, das es ja auch noch die CPU_FLAGS_X86 gibt, wo ja eigentlich diese Erweiterungen aufgelistet werden. Oder habe ich da im falschen Abschnitt des Handbuches gesucht?

3. Frage ich wollte jetzt ein neues System aufsetzen mit einer Kaby Lake CPU, dafür gibt es ja noch keinen optimierten CFLAGS, lediglich sys-devel/gcc-6.3.0 unterstützt

```
‘skylake’

    Intel Skylake CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC and XSAVES instruction set support.
```

Das kommt dem wohl am nächsten und ich werde es damit versuchen. Bis auf mögliche Probleme beim Compilieren, werde ich dann doch wahrscheinlich keine weiteren Hard Masked Pakete benötigen oder?

Wenn ich den Rechner eh neu aufsetzen muss, dachte ich mir das ich damit auch erst mal spielen kann.

OT: Wenn ich die Dokumentation so lese, hätte ich mir vielleicht doch lieber eine Skylake CPU gekauft die den AVX-512 Befehlssatz unterstützt, statt einer Kaby-Lake CPU. Es scheint auch als würde dieser Befehlssatz für Desktop-CPUs nicht verwendet. Aber eventuell die im zweiten Halbjahr 2017 erscheinende Cannonlake CPUs.

Edit: Aha. Eine Skylake CPU mit AVX 512 Befehlssatz ist aber scheinbar auch noch nicht im Handel, oder zumindest für Normalsterbliche nicht. Es gibt bei pcgameshardware Bilder zu dem Sockel-3647, und der schaut ja riesig aus. oO

Viele Grüße

----------

## ChrisJumper

Also ich baue gerade mein System neu und muss sagen, das ich bisher von der Performance überrascht bin, die Pakete rauschen nur so an mir vorbei. Sicherlich war das vorher auch schon schnell, aber aktuell ist es zumindest etwas besser.

Es lohnt sich auf jeden Fall nach Jahren noch mal in die Compiler-Flags zu schauen und das System komplett neu zu bauen beziehungsweise auf den aktuellen stand zu bringen. Aber ich denke auch werde ich deswegen auf dem neuen System direkt gcc 6.3 ausprobieren.

Aber mal schauen in welche Probleme ich laufen und ob es nachher vielleicht doch nicht stabil läuft.

Notiz Nummer 1:

sys-apps/net-tools-1.60_p20160215155418 hatte eine redefinition drin, weshalb der 4.9.4 Compiler abbrach und ich erst mal Version 1.60_p20161110235919 in die keywords hinzufügen musste.

Notiz Nummer 2:

media-tv/mythtv hat bei den Abhängigkeiten für das hls? Useflag die Zeile

```
hls? (

                media-libs/faac:=

                <media-libs/libvpx-1.5.0:=

                >=media-libs/x264-0.0.20111220:=

        )
```

für eine zu niedrie libvpx Version drin. Wenn man auch chrome oder chromium installiert hat, ist media-libs/libvpx-1.5.0 auch schon als Stabil markiert eine Voraussetzung. Ohne mich jetzt zu weit aus dem Fenster zu lehnen, steht aber nirgendwo bei mythtv das libvpx bei aktuellen Versionen kleiner sein muss als 1.5.0 und von daher habe ich da ein =media-libs/libvpx-1.5.0:= draus gemacht, damit es zumindest die 1.5.0 Version akzeptiert und sich Chromium bei einem neubau nicht dran stört. Läuft bisher ohne Probleme trotz einer Hard-Masked 0.28.0 Version von Mythtv bei mir. Damit Portage die Änderung aber annimmt musste ich die Änderung ja noch absegnen:

```
# ebuild /usr/portage/media-tv/mythtv/mythtv-0.28.ebuild digest
```

Natürlich wird das sofort bei einem Tree-Sync wieder überschrieben und ja ich weiß das wäre mit einem lokalen eigenen Ebuild sauberer zu lösen, aber mir war dieser kleine Workaround immer genug um das auf die schnelle mal wieder zu kompilieren. Zudem ist das Paket ja durch das Hard-Mask eher eine Baustelle.

Notiz Nummer 3:

Diverse Perl Dateien schlugen fehl wegen einer fehlenden Header Datei: asm/param.h

Es gibt einen Ubuntu-Bug zu dem Thema. Liegt bei mir wahrscheinlich daran das ich auf meinem System nicht nur Stable Pakete installiert habe. So hatte ich auch die zwei Ordner asm und asm-generic. Da sich die Namen nicht überschnitten habe ich die Dateien ins asm-generic Verzeichnis verschoben und wie empfohlen einen Symbolischen Link als workaround erzeugt.

```
# equery b ./asm/kvm_perf.h 

 * Searching for ./asm/kvm_perf.h ... 

sys-kernel/linux-headers-4.8 (/usr/include/asm/kvm_perf.h)

tux include # eix linux-headers

[I] sys-kernel/linux-headers

     Verfügbare Versionen:   *2.4.33.3^bs ~*2.4.36^bs 3.18^bs 4.3^bs 4.4^bs ~4.5^bs ~4.6^bs ~4.7^bs (~)4.8^bs ~4.9^bs {CROSSCOMPILE_OPTS="headers-only"}

     Installierte Versionen: 4.8^bs(23:54:52 30.01.2017)(CROSSCOMPILE_OPTS="-headers-only")

     Startseite:             https://www.kernel.org/ https://www.gentoo.org/

     Beschreibung:           Linux system headers
```

----------

## rogge

Ohhh ja, es lohnt sich. Und wie! Obwohl ich gleich zur Einschränkung hinterherschicken muss, dass ich "lediglich" von core2 auf nehalem gesprungen bin.

Ich kann mich leider nicht entsinnen, ob es den Nehalem vor drei Jahren, als ich mir meinen Quad-Core gebraucht gekauft habe, auch schon gab und ich core2

nur aus Verlegen- oder Sicherheit gewählt habe. Denn core2 soll offiziell nur 'MMX, SSE, SSE2, SSE3 and SSSE3' unterstützen, ich hatte aber auf jedenfall von

Anfang an auch 'SSE4.1, SSE4.2' drin stehen. Keine Ahnung ob das dann überhaupt anschlug. Dank der "Tricks" von https://wiki.gentoo.org/wiki/CFLAGS war

es nun erstmals möglich wirklich alles rauszufinden, was da noch geht. Ich bin jedenfalls sehr dankbar, dass ich über diesen Thread gesolpert bin  :Smile: 

----------

## ChrisJumper

Hi rogge,

also mein ivybride System läuft auch genau so wie es soll. Aber von meinem Test mit dem 6.3.0 gcc bin ich erst mal zurück getreten. Nach der Installation wollte der Kernel einfach nicht booten, auch ein neuer anderer Kernel mit minimal frisch eingestellter .config wollte das nicht.

Nach einem Versuch gcc auf 6.3.0 zu heben um das System mit "Skylake" zu compileren, davon rate ich aktuell noch ab. Obwohl emerge -e komplett durch lief. Stellte ich später auf gcc-4.9.4 zurück und selbst das hat nicht so gut geklappt (libcrypt hatte einen Nullpointer fehler). Zwar lief der Rest später nach einem emerge -e System durch, aber ich kam nicht an dem Problem vorbei das der Kernel nach der grub2 Bootsequenz, entpackt wurde, trotzdem nicht botten wollte.

Darauf hin wird das System jetzt noch mal neu aufgesetzt. Wohl bemerkt hatte ich es halt aus dem chroot der Kali-Linux Live Umgebung umgestellt. Vielleicht war das auch kein guter Zug. Wäre das neu bauen nicht so anstrengend, hätte ich auf jeden Fall noch mehr Zeit aufgewendet um den Fehler zu finden.

Also ich wollte nur vor dem Übereifrigen ausprobieren von 6.3.0 abraten, zumindest bei der Installation. Hier im Forum haben andere den 6.3.0 Kernel aber schon mit wenigen Problemen im Testing. Aber da sollte man vorher schon quer-Lesen. Für einen mögilchen Produktiv-Einsatz ist aber auf jeden Fall noch abzuraten, das kostet nur Zeit.

Grüße

Chris

Edit: Seltsam. Mein - der Rechner bootet, entpackt den Kernel aber danach passiert nichts mehr-Problem hatte wohl nichts zu tun mit dem gcc-6.3.0. Das neu aufgesetzte System hat jetzt genau das selbe Problem.

----------

## l3u

Die vom GCC benutzen CFLAGS, die durch march=native gesetzt werden, bekommt man übrigens so:

```
#!/bin/bash

cflags=$(gcc -march=native -E -v - </dev/null 2>&1 | grep cc1)

echo ${cflags##* - }
```

Ich dachte nur, das passt ganz gut hier her ;-)

----------

## ChrisJumper

Danke für den Hinweis l3u!

Ich habe mittlerweile alles am laufen. Die Mischung aus GPT, Systemd, einem USB-Keyboard das nach dem Booten nicht ging, in Kombination mit einem default Error-Log nach getty1 und bestimmt fünf mal Booten weil ich alle möglichen framebuffer Treiber ausprobiert hatte, die aber alle nur dazu führten das mein Kernel nach dem entpacken (decompress) eben nicht gebootet werden konnte.

Musste ich fest stellen das es Anfangs wahrscheinlich nicht der unstable gcc-6.3.0 Kernel lag.

Zudem hatte ich auch noch futex im Kernel deaktiviert, weil ich dachte das Systemd-Kernel Howto, zeigt nur das an was gesetzt werden muss, aber für den Fall das es deaktiviert werden musste, steht da ja der Eintrag mit zwei leeren Klammern davor. Jedenfalls hatte ich alle "expert User" Einstellungen raus genommen weil ich dachte das sind alles Instabile Einstellungen.

Heraus kam dann aber das eben das Deaktivieren für Experten gedacht ist, quasi printk und eben Futex ausschalten und somit einen kleinen Kernel erzeugen der weniger Speicher braucht. Aber bei den Punkten steht das alles in der HELP, ich hätte sie nur vorher lesen sollen.

Ah und einen Klassiker Fehler hab ich gemacht, bei der fstab root unter /root statt / eingehängt.

Alles in allem kein Hexenwerk, aber sehr ärgerlich ist die framebuffer Sache, weil Intel diese Grafik-Chips ja in die CPUs einbaut und im Kernel dann Treiber voreingestellt sind, die aber wenn man einen modernen Grafikchip hat, eben dazu führen das es nur ein schwarzes Bild gibt oder eben der Boot-Prozess hängt.

Da sollte unbedingt ein Test-Script her oder ein Wartungs-Modus, wenn man eine Maschine zum ersten mal aufsetzt.

----------

## rogge

Ich hab den hier gleich noch eingespielt: https://github.com/graysky2/kernel_gcc_patch/

Läuft!

Mit dem emerge -e hatte ich auch keine nennenswerte Porbleme.

----------

## musv

Danke für den Patch. Weiß nicht, ob der wirklich spürbar was bringt, aber ich hab ihn mal in meine Kernelconfig reingenommen.

----------

## Child_of_Sun_24

Die Cflags/Cxxflags sind die Compiler Optionen die bestimmen welche Funktionen er nutzt um den Code zu Übersetzen.

Die CPU_FLAGS_X86 sind für die Programme die dadurch angewiesen werden (Sofern sie diese Flag unterstützen) die angegeben Optionen für den Programmbetrieb zu nutzen.

----------

