<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mediawiki.wissen-ahrensburg.de/index.php?action=history&amp;feed=atom&amp;title=Entwicklung_%2F_Systemprogrammierung_%2F_Compiler</id>
	<title>Entwicklung / Systemprogrammierung / Compiler - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.wissen-ahrensburg.de/index.php?action=history&amp;feed=atom&amp;title=Entwicklung_%2F_Systemprogrammierung_%2F_Compiler"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Entwicklung_/_Systemprogrammierung_/_Compiler&amp;action=history"/>
	<updated>2026-08-19T22:15:12Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Dokument</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mediawiki.wissen-ahrensburg.de/index.php?title=Entwicklung_/_Systemprogrammierung_/_Compiler&amp;diff=3559&amp;oldid=prev</id>
		<title>imported&gt;Thorsten Klöhn: Import aus Zensical-Doku (Wissen Ahrensburg)</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.wissen-ahrensburg.de/index.php?title=Entwicklung_/_Systemprogrammierung_/_Compiler&amp;diff=3559&amp;oldid=prev"/>
		<updated>2026-07-17T12:43:16Z</updated>

		<summary type="html">&lt;p&gt;Import aus Zensical-Doku (Wissen Ahrensburg)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span id=&amp;quot;compiler-übersetzen-von-hochsprachen-zu-maschinencode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Compiler: Übersetzen von Hochsprachen zu Maschinencode =&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Compiler&amp;#039;&amp;#039;&amp;#039; übersetzt Quellcode aus Hochsprachen (wie &amp;#039;&amp;#039;&amp;#039;C, C++, Rust&amp;#039;&amp;#039;&amp;#039;) in &amp;#039;&amp;#039;&amp;#039;Maschinencode&amp;#039;&amp;#039;&amp;#039;, den die CPU direkt ausführen kann. Auf Linux sind die wichtigsten Compiler &amp;#039;&amp;#039;&amp;#039;GCC, Clang und Rustc&amp;#039;&amp;#039;&amp;#039;. Dieser Guide erklärt, wie Compiler funktionieren, welche Phasen sie durchlaufen und wie sie auf Linux eingesetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pushpin-warum-compiler-verstehen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 📌 Warum Compiler verstehen? ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Aspekt&lt;br /&gt;
! Nutzen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Performance-Optimierung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Verstehe, wie Code optimiert wird (&amp;lt;code&amp;gt;-O1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-O2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-O3&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Debugging&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Fehlermeldungen und Compiler-Output interpretieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Interoperabilität&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Sprachübergreifenden Code schreiben (C ↔ Rust ↔ C++)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Cross-Compiling&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Code für andere Plattformen/Architekturen kompilieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Sicherheit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Verständnis für Buffer Overflows, Memory Corruption&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Embedded Systems&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Spezialisierte Compiler für Mikrocontroller&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;building_construction-compiler-phasen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🏗️ Compiler-Phasen ==&lt;br /&gt;
&lt;br /&gt;
Ein Compiler durchläuft mehrere Phasen, um Quellcode in ausführbaren Maschinencode umzuwandeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1-preprocessing-vorbearbeitung&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1. Preprocessing (Vorbearbeitung) ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zweck&amp;#039;&amp;#039;&amp;#039;: Makros, Includes und bedingte Kompilierung auflösen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Typische Aktionen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;#include&amp;lt;/code&amp;gt;-Direktiven durch Dateiinhalte ersetzen&lt;br /&gt;
* &amp;lt;code&amp;gt;#define&amp;lt;/code&amp;gt;-Makros ersetzen&lt;br /&gt;
* &amp;lt;code&amp;gt;#ifdef&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;#endif&amp;lt;/code&amp;gt;-Blöcke auflösen&lt;br /&gt;
* Kommentare entfernen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel (C):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// test.c&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#define MAX 100&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printf(&amp;quot;Max: %d\n&amp;quot;, MAX);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Preprocessing-Output anzeigen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;gcc -E test.c -o test.i&lt;br /&gt;
# oder direkt anzeigen:&lt;br /&gt;
gcc -E test.c&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ergebnis (&amp;lt;code&amp;gt;test.i&amp;lt;/code&amp;gt; – vereinfacht):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int main() {&lt;br /&gt;
    __builtin_printf(&amp;quot;Max: %d\n&amp;quot;, 100);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;2-kompilieren-parsing--codegenerierung&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2. Kompilieren (Parsing &amp;amp;amp; Codegenerierung) ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zweck&amp;#039;&amp;#039;&amp;#039;: Quellcode in &amp;#039;&amp;#039;&amp;#039;Assembler-Code&amp;#039;&amp;#039;&amp;#039; übersetzen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Schritte:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Lexikalische Analyse&amp;#039;&amp;#039;&amp;#039;: Code in Tokens zerlegen&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Syntaxanalyse (Parsing)&amp;#039;&amp;#039;&amp;#039;: Tokens in einen Abstrakten Syntaxbaum (AST) umwandeln&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Semantische Analyse&amp;#039;&amp;#039;&amp;#039;: Typprüfung, Gültigkeitsprüfung&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Codegenerierung&amp;#039;&amp;#039;&amp;#039;: AST in &amp;#039;&amp;#039;&amp;#039;Assembler&amp;#039;&amp;#039;&amp;#039; umwandeln&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# C-Code in Assembler übersetzen&lt;br /&gt;
gcc -S test.c -o test.s&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ausgabe (&amp;lt;code&amp;gt;test.s&amp;lt;/code&amp;gt; – x86-64 AT&amp;amp;amp;T-Syntax):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;    .text&lt;br /&gt;
    .globl  main&lt;br /&gt;
    .type   main, @function&lt;br /&gt;
main:&lt;br /&gt;
    pushq   %rbp&lt;br /&gt;
    movq    %rsp, %rbp&lt;br /&gt;
    movl    $100, %edi&lt;br /&gt;
    movl    $.LC0, %esi&lt;br /&gt;
    movl    $0, %eax&lt;br /&gt;
    call    printf@PLT&lt;br /&gt;
    movl    $0, %eax&lt;br /&gt;
    popq    %rbp&lt;br /&gt;
    ret&lt;br /&gt;
    .size   main, .-main&lt;br /&gt;
    .section    .rodata&lt;br /&gt;
.LC0:&lt;br /&gt;
    .string &amp;quot;Max: %d\n&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-assemblieren&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3. Assemblieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zweck&amp;#039;&amp;#039;&amp;#039;: Assembler-Code in &amp;#039;&amp;#039;&amp;#039;Maschinencode&amp;#039;&amp;#039;&amp;#039; (Objektdatei &amp;lt;code&amp;gt;.o&amp;lt;/code&amp;gt;) umwandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tools:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;as&amp;lt;/code&amp;gt; (GNU Assembler)&lt;br /&gt;
* &amp;lt;code&amp;gt;nasm&amp;lt;/code&amp;gt; (Netwide Assembler)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Assemblieren (GCC ruft intern &amp;#039;as&amp;#039; auf)&lt;br /&gt;
gcc -c test.c -o test.o&lt;br /&gt;
&lt;br /&gt;
# Oder manuell:&lt;br /&gt;
as test.s -o test.o&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Objektdatei analysieren:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Symbole anzeigen&lt;br /&gt;
nm test.o&lt;br /&gt;
&lt;br /&gt;
# ELF-Header anzeigen&lt;br /&gt;
file test.o&lt;br /&gt;
&lt;br /&gt;
# Disassemblieren&lt;br /&gt;
objdump -d test.o&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;4-linken&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4. Linken ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zweck&amp;#039;&amp;#039;&amp;#039;: Objektdateien und Bibliotheken zu einem &amp;#039;&amp;#039;&amp;#039;ausführbaren Programm&amp;#039;&amp;#039;&amp;#039; kombinieren.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Aufgaben des Linkers:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Symbolauflösung&amp;#039;&amp;#039;&amp;#039;: Referenzen zwischen Objektdateien auflösen&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Adresszuweisung&amp;#039;&amp;#039;&amp;#039;: Speicheradressen für Code und Daten zuweisen&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Bibliotheken einbinden&amp;#039;&amp;#039;&amp;#039;: Statische (&amp;lt;code&amp;gt;.a&amp;lt;/code&amp;gt;) oder dynamische (&amp;lt;code&amp;gt;.so&amp;lt;/code&amp;gt;) Bibliotheken&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Einfaches Linken (GCC ruft intern &amp;#039;ld&amp;#039; auf)&lt;br /&gt;
gcc test.o -o test&lt;br /&gt;
&lt;br /&gt;
# Manuell mit ld:&lt;br /&gt;
ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc -o test test.o&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;arrows_counterclockwise-vollständiger-kompilierungsprozess&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🔄 Vollständiger Kompilierungsprozess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beispiel-c-programm-kompilieren&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Beispiel: C-Programm kompilieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Quellcode (&amp;lt;code&amp;gt;hello.c&amp;lt;/code&amp;gt;):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    printf(&amp;quot;Hello, World!\n&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Schritt-für-Schritt:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# 1. Preprocessing&lt;br /&gt;
gcc -E hello.c -o hello.i&lt;br /&gt;
&lt;br /&gt;
# 2. Kompilieren (C → ASM)&lt;br /&gt;
gcc -S hello.i -o hello.s&lt;br /&gt;
&lt;br /&gt;
# 3. Assemblieren (ASM → Objektcode)&lt;br /&gt;
gcc -c hello.s -o hello.o&lt;br /&gt;
&lt;br /&gt;
# 4. Linken (Objektcode → Executable)&lt;br /&gt;
gcc hello.o -o hello&lt;br /&gt;
&lt;br /&gt;
# Alternative: Alles in einem Schritt&lt;br /&gt;
gcc hello.c -o hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;visuelle-darstellung&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Visuelle Darstellung ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐&lt;br /&gt;
│   hello.c        │────▶│   hello.i        │────▶│   hello.s        │────▶│   hello.o        │&lt;br /&gt;
│ (C-Quellcode)    │     │ (Preprocessed)   │     │ (Assembler)     │     │ (Objektcode)    │&lt;br /&gt;
└─────────────────┘     └─────────────────┘     └─────────────────┘     └─────────────────┘&lt;br /&gt;
                                                                                     │&lt;br /&gt;
                                                                                     ▼&lt;br /&gt;
┌─────────────────┐     ┌─────────────────┐&lt;br /&gt;
│   hello          │◀────│   Dynamische     │&lt;br /&gt;
│ (Executable)     │     │   Bibliotheken   │&lt;br /&gt;
│                 │     │   (.so)          │&lt;br /&gt;
└─────────────────┘     └─────────────────┘&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vs-compiler-vergleich-gcc-vs-clang-vs-rustc&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🆚 Compiler-Vergleich: GCC vs. Clang vs. Rustc ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gcc-gnu-compiler-collection&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== GCC (GNU Compiler Collection) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Sprachen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| C, C++, Objective-C, Fortran, Ada, Go, D, ...&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Standard&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| De-facto-Standard auf Linux&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Optimierungen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Sehr reif, gute Optimierungen für etablierte Architekturen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Plattformen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| x86, ARM, RISC-V, PowerPC, ...&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Lizenz&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| GPL&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Frontend&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Eigenes Frontend für jede Sprache&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Backend&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Eigenes Codegenerierungs-Backend&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Debug-Info&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| DWARF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Besonderheiten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;-fno-stack-protector&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-fomit-frame-pointer&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# C-Programm kompilieren&lt;br /&gt;
gcc hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# C++-Programm kompilieren&lt;br /&gt;
g++ hello.cpp -o hello&lt;br /&gt;
&lt;br /&gt;
# Mit Optimierungen&lt;br /&gt;
gcc -O3 hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# Mit Debug-Symbolen&lt;br /&gt;
gcc -g hello.c -o hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;clangllvm&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Clang/LLVM ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Sprachen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| C, C++, Objective-C, Rust (über &amp;lt;code&amp;gt;rustc&amp;lt;/code&amp;gt;), Swift, ...&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Standard&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Wird immer beliebter, besonders in macOS und BSD&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Optimierungen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| LLVM-Backend (modular, gute Optimierungen)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Plattformen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| x86, ARM, RISC-V, WebAssembly, ...&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Lizenz&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Apache 2.0 (freizügiger als GPL)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Frontend&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Clang (C/C++), kannst andere Frontends nutzen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Backend&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| LLVM (modular, unterstützt viele Architekturen)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Debug-Info&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| DWARF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Besonderheiten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Bessere Fehlermeldungen, statische Analyse (&amp;lt;code&amp;gt;-Weverything&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# C-Programm kompilieren&lt;br /&gt;
clang hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# C++-Programm kompilieren&lt;br /&gt;
clang++ hello.cpp -o hello&lt;br /&gt;
&lt;br /&gt;
# Assembler-Output anzeigen&lt;br /&gt;
clang -S hello.c -o hello.s&lt;br /&gt;
&lt;br /&gt;
# Mit Sanitizern (Fehlererkennung)&lt;br /&gt;
clang -fsanitize=address -g hello.c -o hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;rustc&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Rustc ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Sprache&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Rust&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Standard&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Offizieller Rust-Compiler&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Optimierungen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| LLVM-Backend (gleiche Optimierungen wie Clang)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Plattformen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| x86, ARM, RISC-V, WebAssembly, ...&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Lizenz&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| MIT/Apache 2.0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Frontend&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Rust-Compiler (eigenes Frontend)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Backend&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| LLVM (Standard) oder alternative Backends&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Debug-Info&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| DWARF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Besonderheiten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Memory Safety, Zero-Cost Abstractions, &amp;lt;code&amp;gt;no_std&amp;lt;/code&amp;gt; Support&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Rust-Programm kompilieren&lt;br /&gt;
rustc hello.rs -o hello&lt;br /&gt;
&lt;br /&gt;
# Release-Modus (optimiert)&lt;br /&gt;
rustc --release hello.rs -o hello&lt;br /&gt;
&lt;br /&gt;
# Assembler-Output anzeigen&lt;br /&gt;
rustc --emit asm hello.rs -o hello.s&lt;br /&gt;
&lt;br /&gt;
# Cross-Compiling&lt;br /&gt;
rustup target add x86_64-unknown-linux-musl&lt;br /&gt;
cargo build --target x86_64-unknown-linux-musl&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;vergleichstabelle&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Vergleichstabelle ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Kriterium&lt;br /&gt;
! GCC&lt;br /&gt;
! Clang&lt;br /&gt;
! Rustc&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Geschwindigkeit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| ⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Optimierungen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Fehlermeldungen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| ⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Plattformunterstützung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Sprachunterstützung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐ (nur Rust)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Modularität&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| ⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Statische Analyse&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| ⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐⭐&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Embedded-Unterstützung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| ⭐⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐&lt;br /&gt;
| ⭐⭐⭐⭐&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gear-compiler-optionen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== ⚙️ Compiler-Optionen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;optimierungsstufen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Optimierungsstufen ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option&lt;br /&gt;
! Beschreibung&lt;br /&gt;
! Typische Verwendung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Keine Optimierung&lt;br /&gt;
| Debugging&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O1&amp;lt;/code&amp;gt;&lt;br /&gt;
| Grundlegende Optimierungen&lt;br /&gt;
| Entwicklung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O2&amp;lt;/code&amp;gt;&lt;br /&gt;
| Aggressive Optimierungen&lt;br /&gt;
| Release&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O3&amp;lt;/code&amp;gt;&lt;br /&gt;
| Sehr aggressive Optimierungen&lt;br /&gt;
| Performance-kritische Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-Os&amp;lt;/code&amp;gt;&lt;br /&gt;
| Optimieren für Größe&lt;br /&gt;
| Embedded Systems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-Ofast&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;-O3&amp;lt;/code&amp;gt; + unsichere Optimierungen&lt;br /&gt;
| Benchmarks&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Ohne Optimierung (Debug)&lt;br /&gt;
gcc -O0 -g hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# Release mit Optimierungen&lt;br /&gt;
gcc -O2 hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# Minimale Binärgröße&lt;br /&gt;
gcc -Os hello.c -o hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;debug-optionen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Debug-Optionen ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt;&lt;br /&gt;
| Debug-Symbole hinzufügen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-g3&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mehr Debug-Info (inkl. Makros)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ggdb&amp;lt;/code&amp;gt;&lt;br /&gt;
| GDB-spezifische Debug-Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-DDEBUG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;DEBUG&amp;lt;/code&amp;gt;-Macro definieren&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Mit Debug-Symbolen kompilieren&lt;br /&gt;
gcc -g hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# Debuggen mit GDB&lt;br /&gt;
gdb ./hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;warnungen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Warnungen ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-Wall&amp;lt;/code&amp;gt;&lt;br /&gt;
| Alle wichtigsten Warnungen aktivieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-Wextra&amp;lt;/code&amp;gt;&lt;br /&gt;
| Zusätzliche Warnungen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-Werror&amp;lt;/code&amp;gt;&lt;br /&gt;
| Warnungen als Fehler behandeln&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-Wpedantic&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strengere Standard-Konformität&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-Weverything&amp;lt;/code&amp;gt; (Clang)&lt;br /&gt;
| Alle möglichen Warnungen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Alle Warnungen aktivieren&lt;br /&gt;
gcc -Wall -Wextra -Werror hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# Clang: Alle Warnungen&lt;br /&gt;
clang -Wall -Wextra -Wpedantic -Weverything hello.c -o hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;zielplattform--architektur&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Zielplattform &amp;amp;amp; Architektur ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-m32&amp;lt;/code&amp;gt;&lt;br /&gt;
| 32-Bit Code generieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-m64&amp;lt;/code&amp;gt;&lt;br /&gt;
| 64-Bit Code generieren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-march=native&amp;lt;/code&amp;gt;&lt;br /&gt;
| Optimieren für aktuelle CPU&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-mtune=native&amp;lt;/code&amp;gt;&lt;br /&gt;
| Tuning für aktuelle CPU&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--target=&amp;amp;lt;triple&amp;amp;gt;&amp;lt;/code&amp;gt; (Rust)&lt;br /&gt;
| Cross-Compiling&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# 32-Bit Code generieren&lt;br /&gt;
gcc -m32 hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# Für aktuelle CPU optimieren&lt;br /&gt;
gcc -march=native -O2 hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# Rust: Cross-Compiling für ARM&lt;br /&gt;
rustup target add arm-unknown-linux-gnueabihf&lt;br /&gt;
cargo build --target arm-unknown-linux-gnueabihf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;standard-bibliotheken&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Standard-Bibliotheken ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option&lt;br /&gt;
! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-static&amp;lt;/code&amp;gt;&lt;br /&gt;
| Statisch linken&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-shared&amp;lt;/code&amp;gt;&lt;br /&gt;
| Dynamische Bibliothek erstellen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-l&amp;amp;lt;name&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bibliothek &amp;lt;code&amp;gt;&amp;amp;lt;name&amp;amp;gt;.a&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;&amp;amp;lt;name&amp;amp;gt;.so&amp;lt;/code&amp;gt; einbinden&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-L&amp;amp;lt;path&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bibliothekspfad hinzufügen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-I&amp;amp;lt;path&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Include-Pfad hinzufügen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Statisch linken&lt;br /&gt;
gcc -static hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# Dynamische Bibliothek erstellen&lt;br /&gt;
gcc -shared -fPIC -o libhello.so hello.c&lt;br /&gt;
&lt;br /&gt;
# Mitlibrary linken&lt;br /&gt;
gcc main.c -L. -lhello -o main&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;arrows_counterclockwise-cross-compiling&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🔄 Cross-Compiling ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;grundlagen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Grundlagen ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cross-Compiling&amp;#039;&amp;#039;&amp;#039; bedeutet, Code auf &amp;#039;&amp;#039;&amp;#039;Plattform A&amp;#039;&amp;#039;&amp;#039; zu kompilieren, der auf &amp;#039;&amp;#039;&amp;#039;Plattform B&amp;#039;&amp;#039;&amp;#039; läuft.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Typische Anwendungsfälle:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Embedded Systems (Raspberry Pi, Mikrocontroller)&lt;br /&gt;
* Mobile Geräte (Android, iOS)&lt;br /&gt;
* Different architectures (ARM, RISC-V, WebAssembly)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;toolchains-installieren&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Toolchains installieren ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Zielplattform&lt;br /&gt;
! Toolchain (Debian/Ubuntu)&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;x86_64 → ARM (32-bit)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;gcc-arm-linux-gnueabi&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;sudo apt install gcc-arm-linux-gnueabi&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;x86_64 → ARM (64-bit)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;gcc-aarch64-linux-gnu&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;sudo apt install gcc-aarch64-linux-gnu&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;x86_64 → RISC-V&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;gcc-riscv64-linux-gnu&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;sudo apt install gcc-riscv64-linux-gnu&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;x86_64 → WebAssembly&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;emscripten&amp;lt;/code&amp;gt;&lt;br /&gt;
| [https://emscripten.org/docs/getting_started/downloads.html Emscripten installieren]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;x86_64 → Windows&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;mingw-w64&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;sudo apt install mingw-w64&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cross-compiling-mit-gcc&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Cross-Compiling mit GCC ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel: Für ARM64 kompilieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Toolchain installieren&lt;br /&gt;
sudo apt install gcc-aarch64-linux-gnu&lt;br /&gt;
&lt;br /&gt;
# Für ARM64 kompilieren&lt;br /&gt;
aarch64-linux-gnu-gcc hello.c -o hello_arm64&lt;br /&gt;
&lt;br /&gt;
# Ausführen mit QEMU&lt;br /&gt;
qemu-aarch64 ./hello_arm64&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;cross-compiling-mit-rust&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Cross-Compiling mit Rust ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel: Für ARM kompilieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Zielplattform hinzufügen&lt;br /&gt;
rustup target add arm-unknown-linux-gnueabihf&lt;br /&gt;
&lt;br /&gt;
# Für ARM kompilieren&lt;br /&gt;
cargo build --target arm-unknown-linux-gnueabihf&lt;br /&gt;
&lt;br /&gt;
# oder mit rustc&lt;br /&gt;
rustc --target arm-unknown-linux-gnueabihf hello.rs -o hello_arm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;cross-compiling-mit-clang&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Cross-Compiling mit Clang ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel: Für RISC-V kompilieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Toolchain installieren&lt;br /&gt;
sudo apt install clang llvm&lt;br /&gt;
&lt;br /&gt;
# Für RISC-V kompilieren&lt;br /&gt;
clang --target=riscv64-unknown-linux-gnu hello.c -o hello_riscv&lt;br /&gt;
&lt;br /&gt;
# Ausführen mit QEMU&lt;br /&gt;
qemu-riscv64 ./hello_riscv&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;package-bibliotheken-statisch-vs-dynamisch&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 📦 Bibliotheken: Statisch vs. Dynamisch ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;statische-bibliotheken-a&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Statische Bibliotheken (&amp;lt;code&amp;gt;.a&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Vorteile&amp;#039;&amp;#039;&amp;#039;: Selbstständige Binaries, keine Abhängigkeiten&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nachteile&amp;#039;&amp;#039;&amp;#039;: Größere Binaries, keine Updates ohne Neukompilierung&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Statische Bibliothek erstellen&lt;br /&gt;
gcc -c libhello.c -o libhello.o&lt;br /&gt;
ar rcs libhello.a libhello.o&lt;br /&gt;
&lt;br /&gt;
# Mit statischer Bibliothek linken&lt;br /&gt;
gcc main.c -L. -l:libhello.a -o main&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;dynamische-bibliotheken-so&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Dynamische Bibliotheken (&amp;lt;code&amp;gt;.so&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Vorteile&amp;#039;&amp;#039;&amp;#039;: Kleinere Binaries, geteilte Bibliotheken, Updates möglich&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nachteile&amp;#039;&amp;#039;&amp;#039;: Abhängigkeiten, Ladezeit&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Dynamische Bibliothek erstellen&lt;br /&gt;
gcc -shared -fPIC -o libhello.so libhello.c&lt;br /&gt;
&lt;br /&gt;
# Mit dynamischer Bibliothek linken&lt;br /&gt;
gcc main.c -L. -lhello -o main&lt;br /&gt;
&lt;br /&gt;
# Bibliothek laden (um LD_LIBRARY_PATH erweitern)&lt;br /&gt;
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH&lt;br /&gt;
./main&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;ldd--abhängigkeiten-anzeigen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;lt;code&amp;gt;ldd&amp;lt;/code&amp;gt; – Abhängigkeiten anzeigen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Abhängigkeiten eines Programms anzeigen&lt;br /&gt;
ldd ./main&lt;br /&gt;
&lt;br /&gt;
# Beispielausgabe:&lt;br /&gt;
#       linux-vdso.so.1 (0x00007ffc3a3f1000)&lt;br /&gt;
#       libhello.so =&amp;gt; ./libhello.so (0x00007f1234567000)&lt;br /&gt;
#       libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1234123000)&lt;br /&gt;
#       /lib64/ld-linux-x86-64.so.2 (0x00007f1234789000)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mag-compiler-output-analysieren&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🔍 Compiler-Output analysieren ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;assembler-output-vergleichen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Assembler-Output vergleichen ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Godbolt Compiler Explorer&amp;#039;&amp;#039;&amp;#039; (https://godbolt.org/) ist das beste Tool, um zu sehen, wie verschiedene Compiler Code in Assembler umwandeln.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# Gehe zu [https://godbolt.org/ godbolt.org]&lt;br /&gt;
# Wähle die Sprache (C, C++, Rust)&lt;br /&gt;
# Wähle den Compiler (GCC, Clang, Rustc)&lt;br /&gt;
# Füge deinen Code ein&lt;br /&gt;
# Vergleiche den Assembler-Output&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;beispiel-schleifen-optimierung&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Beispiel: Schleifen-Optimierung ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;C-Code:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int sum(int n) {&lt;br /&gt;
    int result = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        result += i;&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assembler-Output (GCC -O0 vs. -O3):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-O0&amp;lt;/code&amp;gt; (keine Optimierung):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;sum:&lt;br /&gt;
    pushq   %rbp&lt;br /&gt;
    movq    %rsp, %rbp&lt;br /&gt;
    movl    %edi, -20(%rbp)&lt;br /&gt;
    movl    $0, -8(%rbp)&lt;br /&gt;
    movl    $0, -4(%rbp)&lt;br /&gt;
    jmp     .L2&lt;br /&gt;
.L3:&lt;br /&gt;
    movl    -4(%rbp), %eax&lt;br /&gt;
    addl    %eax, -8(%rbp)&lt;br /&gt;
    addl    $1, -4(%rbp)&lt;br /&gt;
.L2:&lt;br /&gt;
    movl    -4(%rbp), %eax&lt;br /&gt;
    cmpl    -20(%rbp), %eax&lt;br /&gt;
    jl      .L3&lt;br /&gt;
    movl    -8(%rbp), %eax&lt;br /&gt;
    popq    %rbp&lt;br /&gt;
    ret&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-O3&amp;lt;/code&amp;gt; (optimiert):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;sum:&lt;br /&gt;
    lea     -1(%rdi), %eax&lt;br /&gt;
    imul    %rdi, %rax&lt;br /&gt;
    shr     %rax&lt;br /&gt;
    ret&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;&amp;#039;Hinweis&amp;#039;&amp;#039;&amp;#039;: Die optimierte Version nutzt die mathematische Formel &amp;lt;code&amp;gt;n*(n-1)/2&amp;lt;/code&amp;gt; für die Summe der ersten &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; Zahlen!&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;objdump-für-binär-analyse&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;lt;code&amp;gt;objdump&amp;lt;/code&amp;gt; für Binär-Analyse ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Vollständiges Disassemblieren&lt;br /&gt;
objdump -d ./programm&lt;br /&gt;
&lt;br /&gt;
# Mit Source-Code anzeigen (wenn -g verwendet wurde)&lt;br /&gt;
objdump -d -S ./programm&lt;br /&gt;
&lt;br /&gt;
# ELF-Header anzeigen&lt;br /&gt;
objdump -f ./programm&lt;br /&gt;
&lt;br /&gt;
# Alle Sections anzeigen&lt;br /&gt;
objdump -h ./programm&lt;br /&gt;
&lt;br /&gt;
# Symbole anzeigen&lt;br /&gt;
objdump -t ./programm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;readelf-für-elf-dateien&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;lt;code&amp;gt;readelf&amp;lt;/code&amp;gt; für ELF-Dateien ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# ELF-Header anzeigen&lt;br /&gt;
readelf -h ./programm&lt;br /&gt;
&lt;br /&gt;
# Sections anzeigen&lt;br /&gt;
readelf -S ./programm&lt;br /&gt;
&lt;br /&gt;
# Symbole anzeigen&lt;br /&gt;
readelf -s ./programm&lt;br /&gt;
&lt;br /&gt;
# Dynamische Abhängigkeiten anzeigen&lt;br /&gt;
readelf -d ./programm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bulb-compiler-tipps--best-practices&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 💡 Compiler-Tipps &amp;amp;amp; Best Practices ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1-immer-mit-warnungen-kompilieren&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1. Immer mit Warnungen kompilieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Minimal für C/C++&lt;br /&gt;
gcc -Wall -Wextra -Werror hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# Für maximale Sicherheit (Clang)&lt;br /&gt;
clang -Wall -Wextra -Wpedantic -Weverything -Werror hello.c -o hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;2-debug-symbole-verwenden&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2. Debug-Symbole verwenden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Mit Debug-Info kompilieren&lt;br /&gt;
gcc -g hello.c -o hello&lt;br /&gt;
&lt;br /&gt;
# Für GDB optimiert&lt;br /&gt;
gcc -ggdb hello.c -o hello&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-optimierungen-verstehen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3. Optimierungen verstehen ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;-O0&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: Für Debugging (keine Optimierungen, 1:1 Mapping zwischen Code und ASM)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;-O1&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: Grundlegende Optimierungen (z. B. dead code elimination)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;-O2&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: Aggressive Optimierungen (Standard für Release)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;-O3&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: Sehr aggressive Optimierungen (kann Code verlangsamen!)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;-Os&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;: Optimieren für Größe (wichtig für Embedded)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;4-cross-compiling-korrekt-einrichten&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4. Cross-Compiling korrekt einrichten ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Toolchain installieren&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;sudo apt install gcc-&amp;amp;lt;arch&amp;amp;gt;-linux-gnu&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Umgebungsvariablen setzen&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;CC=aarch64-linux-gnu-gcc&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Testen mit QEMU&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;qemu-&amp;amp;lt;arch&amp;amp;gt; ./programm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;5-statische-analyse-nutzen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5. Statische Analyse nutzen ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Clang-Tidy:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Installieren&lt;br /&gt;
sudo apt install clang-tidy&lt;br /&gt;
&lt;br /&gt;
# Ausführen&lt;br /&gt;
clang-tidy hello.cpp --checks=* -fix&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cppcheck (für C/C++):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;sudo apt install cppcheck&lt;br /&gt;
cppcheck --enable=all hello.c&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;6-sanitizer-für-fehlererkennung&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6. Sanitizer für Fehlererkennung ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Sanitizer&lt;br /&gt;
! Zweck&lt;br /&gt;
! GCC/Clang Option&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;AddressSanitizer&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Speicherfehler (Use-after-free, Buffer Overflow)&lt;br /&gt;
| &amp;lt;code&amp;gt;-fsanitize=address&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;UndefinedBehaviorSanitizer&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Undefiniertes Verhalten&lt;br /&gt;
| &amp;lt;code&amp;gt;-fsanitize=undefined&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;ThreadSanitizer&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Data Races&lt;br /&gt;
| &amp;lt;code&amp;gt;-fsanitize=thread&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;MemorySanitizer&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| Uninitialisierte Speicherzugriffe&lt;br /&gt;
| &amp;lt;code&amp;gt;-fsanitize=memory&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# AddressSanitizer aktivieren&lt;br /&gt;
gcc -fsanitize=address -g hello.c -o hello&lt;br /&gt;
./hello&lt;br /&gt;
&lt;br /&gt;
# ThreadSanitizer (nur Clang)&lt;br /&gt;
clang -fsanitize=thread -g hello.c -o hello -pthread&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;books-lernressourcen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 📚 Lernressourcen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bücher&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bücher ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811 Compilers: Principles, Techniques, and Tools]&amp;#039;&amp;#039;&amp;#039; – Der &amp;amp;quot;Dragon Book&amp;amp;quot; (Klassiker)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://craftinginterpreters.com/ Crafting Interpreters]&amp;#039;&amp;#039;&amp;#039; – Online-Buch über Interpreter/Compiler&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.gnu.org/software/gnu-c-manual/ The GNU C Programming Tutorial]&amp;#039;&amp;#039;&amp;#039; – C mit GCC&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://doc.rust-lang.org/book/ch20-00-final-project-a-web-server.html Rust Book – Advanced Topics]&amp;#039;&amp;#039;&amp;#039; – Rust-spezifische Themen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;online-kurse&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Online-Kurse ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.coursera.org/learn/compilers Stanford Compilers (Coursera)]&amp;#039;&amp;#039;&amp;#039; – Compiler-Konzepte&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.nand2tetris.org/ Nand2Tetris]&amp;#039;&amp;#039;&amp;#039; – Baue einen Computer von Grund auf&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://godbolt.org/ Compiler Explorer (Godbolt)]&amp;#039;&amp;#039;&amp;#039; – Interaktives Lernen&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://llvm.org/docs/tutorial/ LLVM Tutorial]&amp;#039;&amp;#039;&amp;#039; – LLVM-basierte Compiler&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;videos&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Videos ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.youtube.com/watch?v=bSkpMdDe4T8 Matt Godbolt – What Has My Compiler Done?]&amp;#039;&amp;#039;&amp;#039; – CppCon 2019&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.youtube.com/watch?v=0566fV3QpG4 The Primeagen – Learning Compilers]&amp;#039;&amp;#039;&amp;#039; – Einführung in Compiler&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://www.youtube.com/c/LiveOverflow LiveOverflow – Compiler Explorations]&amp;#039;&amp;#039;&amp;#039; – Reverse Engineering &amp;amp;amp; Compiler&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tools&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Tools ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://godbolt.org/ Godbolt Compiler Explorer]&amp;#039;&amp;#039;&amp;#039; – Assembler-Output vergleichen&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://wandbox.org/ Wandbox]&amp;#039;&amp;#039;&amp;#039; – Online-Compiler für C/C++/Rust&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://replit.com/ Replit]&amp;#039;&amp;#039;&amp;#039; – Online-IDE mit Compiler&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[https://godbolt.org/ Compiler Explorer (ARM/RISC-V)]&amp;#039;&amp;#039;&amp;#039; – Cross-Architecture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;link-verwandte-themen&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 🔗 Verwandte Themen ==&lt;br /&gt;
&lt;br /&gt;
* [[Entwicklung / Systemprogrammierung / Assembler / Grundlagen|Assembler]] – Die niedrigste Ebene unter den Compilern&lt;br /&gt;
* [[Entwicklung / Systemprogrammierung / Rust &amp;amp; C/C++ / Rust, C &amp;amp; C++ Integration|Rust, C++ &amp;amp;amp; C Integration]] – Sprachübergreifende Programmierung&lt;br /&gt;
* [[Entwicklung / Systemprogrammierung / Linux / Linux-Systemprogrammierung|Linux-Systemprogrammierung]] – Wie Compiler mit dem OS interagieren&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Letzte Aktualisierung: {{ git_revision_date_localized() }}&amp;#039;&amp;#039;&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Thorsten Klöhn</name></author>
	</entry>
</feed>