01. Kompilierungsoptionen und Kernelkompilierung Der Linux-Kernel (Englisch: Linux-Kernel) ist ein Computer-Betriebssystemkernel, der in der Programmiersprache C und Assembler geschrieben ist, dem POSIX-Standard entspricht und unter der GNU General Public License veröffentlicht wurde. Technisch gesehen ist Linux nur ein Kernel. „Kernel“ bezieht sich auf eine Systemsoftware, die eine Hardwareabstraktionsschicht, Festplatten- und Dateisteuerung, Multitasking und andere Funktionen bereitstellt. Zunächst einmal wissen wir alle, dass der Linux-Kernel nicht kompiliert werden kann, wenn er mit O0 kompiliert wurde. Der Linux-Kernel wird entweder mit O2 oder Os kompiliert. Dies ist aus dem Linux-Makefile ersichtlich: Wenn Sie wählen
Es wird Os sein, andernfalls wird es O2 sein. Tatsächlich sind O2 und Os eine Sammlung einiger Optimierungsoptionen: gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts gcc -c -Q -Os --help=optimizers > /tmp/Os-opts Ersteres basiert eher auf Geschwindigkeitsoptimierung, während Letzteres eher auf kleinerer Größenoptimierung basiert. Vergleichen Sie die Schaltmöglichkeiten der beiden: melde dich an /tmp/O2-opts /tmp/Os-opts Der Unterschied ist erbärmlich gering: Sowohl O2 als auch Os aktivieren kleine Inline-Funktionen und einmal aufgerufene Funktionen, aber -finline-functions ist in O2 deaktiviert und in Os aktiviert. In O2 ist optimize-strlen aktiviert, in Os ist diese Option jedoch deaktiviert. Die Bedeutung der jeweiligen Optionen erfährt man über "man gcc" (bei Fragen wendet man sich an man), beispielsweise nach der Suche nach inline-functions nach man gcc: Von O0 über O1, O2 und O3 erfolgt eine schrittweise Erhöhung der Anzahl aktivierter Optimierungsoptionen: Der Kernel kann nicht mit O0 kompiliert werden, da der Kernel selbst nicht für die Kompilierung mit O0 konzipiert ist. Sein Entwurf beinhaltet die Annahme, dass die Kompilierung optimiert wird. Lassen Sie uns dies anhand eines einfachen Beispiels veranschaulichen. 02. Ein einfaches Beispiel Der folgende Code: Bei der O0-Kompilierung wird der folgende Fehler gemeldet, der besagt, dass die Funktion f() nicht definiert ist: $ gcc -O0 cc.c cc.c:1:13: Warnung: „f“ verwendet, aber nie definiert [standardmäßig aktiviert] ungültig f(leer); ^ /tmp/ccTwwtHG.o: In der Funktion „main“: cc.c:(.text+0x19): undefinierter Verweis auf „f“ collect2: Fehler: ld hat den Exit-Status 1 zurückgegeben Aber bei der Kompilierung mit O2 gibt es kein Problem: $ gcc -O2 cc.c Der Grund hierfür liegt darin, dass O2 beim Kompilieren erkennt, dass a == 1 ist. Wenn also (a>2) nicht gilt, spielt es keine Rolle, dass f() nicht definiert ist. Nach einer leichten Codeänderung: O2 funktioniert derzeit nicht mehr: $ gcc -O2 cc.c /tmp/ccXiyBHn.o: In der Funktion „main“: cc.c:(.text.startup+0x7): undefinierter Verweis auf „f“ collect2: Fehler: ld hat den Exit-Status 1 zurückgegeben Anhand dieses Beispiels können Sie daher erkennen, warum derselbe Code mit O2 funktioniert, mit O0 jedoch nicht. Es gibt viel Code im Kernel, der vom Compiler optimiert werden soll. 3. Wir wollen nicht mehr inline Aufgrund der Kompilierungsoptimierung werden einige Funktionen (z. B. kleine Funktionen und Funktionen, die im gesamten Projekt nur von einer Person aufgerufen werden) nicht explizit als Inline geschrieben, aber der Compiler optimiert sie für Inline. Dies führt zu einigen Problemen beim Debuggen, da das dieser Funktion entsprechende Symbol nicht gefunden werden kann. An dieser Stelle können wir explizit angeben, dass wir bestimmte Funktionen nicht inline binden möchten: Andernfalls werden die beiden oben genannten Funktionen möglicherweise automatisch vom Compiler inline geschrieben, auch wenn Sie in Ihrem Code nicht inline schreiben, da O2 und Os die entsprechenden Inline-Optionen aktivieren. Wenn wir Inline ablehnen möchten, können wir es mit noline markieren. 4. Ich möchte nicht optimiert werden Wenn O1, O2, O3 und Os global aktiviert sind und wir keine Optimierung an einer einzelnen Funktion durchführen möchten, können wir die Funktion mit Neukompilieren mit O2: $ gcc -O2 cc.c /tmp/cc8M338p.o: In der Funktion „main“: cc.c:(.text+0x19): undefinierter Verweis auf „f“ collect2: Fehler: ld hat den Exit-Status 1 zurückgegeben 5. Fazit Hier sind einige praktische Richtlinien:
Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
<<: JS realisiert die Kartenausgabe-Animation
>>: Grafisches Tutorial zur kostenlosen Installationsversion von MySQL 5.7.17 winx64
Erster Blick auf die Wirkung: Wenn die Maus über ...
MySQL 5.7.13 Installations-Tutorial für Mac, sehr...
Dieser Artikel beschreibt die Installation des Sy...
Inhaltsverzeichnis 1. Übersicht 1.1 Verwendung vo...
In diesem Artikelbeispiel wird der spezifische Co...
Als mir diese Frage gestellt wurde, war ich unwis...
Zabbix Server-Umgebungsplattform Version: ZABBIX ...
Seit seiner Einführung im Jahr 2009 wird Flex von...
Inhaltsverzeichnis dva Verwendung von dva Impleme...
Name des Autors:   no-break space = gesc...
1. Umwelt: MySQL-5.0.41-win32 Windows XP Professi...
Zitat aus Baidus Erklärung zu Pseudostatik: Pseud...
In diesem Artikel wird der spezifische JavaScript...
Anforderungen: Entfernen Sie HTTP-Antwortheader i...
Lassen Sie uns heute einen einfachen 3D-Zauberwür...