1. Index
  2. Debian
  3. Desktop
  4. Heimserver
  5. Webserver

Programme übersetzen

Quelltext übersetzen

Die GNU Compiler Collection unterstützt die Sprachen C, C++, Java, Ada, Fortran und Go.

Übersetzungsprozess

Der Übersetzer erzeugt Programme in mehreren Schritten:

  1. Der Präprozesser expandiert Include-Direktiven und Makros.
  2. Die Analyseeinheit (frontend) zerlegt Übersetzungseinheiten in einen Abstrakten Syntaxbaum (AST).
  3. Die Syntheseeinheit (backend) erzeugt daraus maschinenunabhängigen Zwischencode.
  4. Der Optimierer vereinfacht den Zwischencode.
  5. Der Generator erzeugt Objekte mit Maschinencode.
  6. Der Binder (linker) setzt die Objekte zu Programmen oder Bibliotheken zusammen.

Der Übersetzer wertet folgende Umgebungsvariablen aus:

Variable Beschreibung
CPPFLAGS Präprozessor
-MM Regel mit Abhängigkeiten für make ausgeben
-MF File Dateiname für Abhängigkeiten ($DEPENDENCIES_OUTPUT)
-I Dir Suchpfad für Includedateien erweitern (/usr/include)
-D Name[=Value] Präprozessor-Variable definieren
CFLAGS Übersetzer
-c Nicht binden, nur Objektdatei erzeugen
-g Debug-Symbole hinzufügen
-pg Profiling-Informationen hinzufügen
-std c11 Standard-Konformität sicherstellen
-W all Warnungen ein- und ausschalten
-O 0 Optimierungsgrad festlegen
-fpic Positionsunabhängigen Code erzeugen (siehe -shared)
LDFLAGS Linker
-o File Dateiname für Binärdatei festlegen (statt a.out)
-L Dir Suchpfad für Bibliotheken erweitern
-l File Dynamische Bibliothek einbinden
-shared Dynamische Bibliothek erzeugen (siehe -fpic)
-pthread Unterstützung für POSIX Threads einschalten
c89 Aufzählungen, Zuweisung von Strukturen
c99 Variable Arrays, Designierte Initialisierer
c11 Multithreading und Atomics
c++11 Threads, Lambda, Regex
c++14 Typ-Inferenz, Move-Semantik
all Alle sinnvollen Warnungen aktivieren
extra Noch mehr Warnungen aktivieren
error Warnungen als Fehler behandeln
pedantic Strikte Einhaltung des Standards erzwingen
0 Keine Optimierung (default)
1 Einfache Optimierungungen für kleinere und schnellere Programme
2 Weitere Optimierungen
3 Maximale Optimierungsstufe
g Debug-freundliche Optimierung
s Optimierung auf kleinste Programmgröße
fast Optimierung auf schnelle Ausführung

Programme schrittweise untersuchen

Der Debugger kann ein Programm entweder schrittweise ablaufen lassen, ein Speicherabbild (coredump) untersuchen oder sich in einen laufenden Prozess einklinken:

gdb Program [Corefile | Pid]
Kommando Parameter Beschreibung
Hilfe anfordern
help Topic Befehle zu einem bestimmten Thema auflisten
Command Beschreibung zu einem Befehl anzeigen
apropos Keyword Hilfethemen zu einem Suchbegriff anzeigen
Haltepunkte setzen
break [File:]Line [if Condition] Programm an dieser Zeile unterbrechen
[File:]Function [thread Id] Programm in dieser Funktion unterbrechen
(+|-)Offset Programm nach einigen Zeilen unterbrechen
*MemoryAddress Programm an Speicheradresse unterbrechen
tbreak Programm nur einmal an der angegebenen Stelle unterbrechen
watch Condition Beobachtungspunkt setzen und Programm unterbrechen
clear Alle Haltepunkte entfernen
Function Haltepunkt für Funktion entfernen
Line Haltepunkt für Zeile entfernen
*MemoryAddress Haltepunkt für Speicheradresse entfernen
delete [Breakpoint[-Breakpoint]] Haltepunkte, Beobachtungspunkte und Fangpunkte entfernen
disable [Breakpoint[-Breakpoint]] Haltepunkte deaktivieren
enable [Breakpoint[-Breakpoint]] Haltepunkte reaktivieren
info breakpoints Haltepunkte auflisten
watchpoints Beobachtungspunkte auflisten
Programm ausführen
run Argument Programm bis zum ersten Haltepunkt ausführen
continue [Count] Programm bis zum nächsten Haltepunkt fortsetzen und den aktuellen Haltepunkt n mal überspringen
step [Count] Nächste Codezeile ausführen oder Funktion betreten
next [Count] Nächste Codezeile ausführen ohne Funktion zu betreten
finish Programm bis zum Ende der aktuellen Funktion fortsetzen
until [File:]Line Programm bis zur angegebenen Zeile fortsetzen
[File:]Function Programm bis zur angegebenen Funktion fortsetzen
[File:]MemoryAddress Programm bis zur angegebenen Speicheradresse fortsetzen
kill Programm beenden
handle Signal [no]{stop|print|pass|ignore} Signalverarbeitung steuern
where Aktuelle Zeilennummer und Funktion anzeigen
info handle Einstellung der Signalverarbeitung anzeigen
info args Kommandozeilenargumente ausgeben
quit Sitzung beenden
Aufrufhierarchie untersuchen
backtrace Depth [full] Aufrufhierarchie bis zur angegebenen Tiefe optional mit lokalen Variabeln ausgeben
frame Level Hierarchieebene ausgeben bzw. auswählen
up Level Hierarchieebene aufsteigen
down Level Hierarchieebene absteigen
print[/Format] [File:]Name[@Count] Variable ausgaben, bei Arrays nur eine Anzahl Elemente
Quelltext anzeigen
list [File:]Line[,Line] Quelltext zeilenweise ausgeben
[File:]Function)] Quelltext für eine Funktion ausgeben
directory Path Quelltextpfad hinzufügen oder entfernen
set listsize Count Anzahl der anzuzeigenden Quelltext-Zeilen festlegen
show listsize Anzahl der anzuzeigenden Quelltext-Zeilen ausgeben
show directories Quelltextpfade auflisten
formatFormat
xHexadezimalzahl
oOctalzahl
tBinärzahl
dDezimalzahl
uVorzeichenlose Dezimalzahl
cZeichen
fFließkommazahl
aSpeicheradresse (hexadezimal)

Flaschenhälse finden

Ein Profiler hilft dem Programmierer, Flaschenhälse bei der Ausführung zu identifiziereun und diese zielgerichtet zu optimieren.

  1. Programm und alle Bibliotheken mit Code zum Profiling übersetzen (Option -pg).
  2. Programm ausführen. Der eingebaut Code erzeugt die Datei gmon.out mit binären Profiling-Informationen.
  3. Profiling- und Debug Informationen mit gprof(1) auswerten.
  4. Aufrufgraph mit Gprof2Dot und GraphViz erzeugen.
gprof Programm | gprof2dot.py | dot -Tsvg -o profile.svg

Symbole in Binärdateien finden

Das Dateiformat für Programme, Bibliotheken und Objektdateien heißt ELF.

as
Assembler-Code in Objekt assemblieren.
ar
Archive (Bibliotheken) verwalten
-pa – Objekt an Archiv anhängen.
-pd – Objekt aus Archiv entfernen.
nm
Symbole in Objekten oder Bibliotheken auflisten.
strip
Debug-Symbole aus Progammen und Bibliotheken entfernen.
strings
Zeichenketten aus Binärdatei extrahieren.
size
Segmentgrößen eines Objekts anzeigen.
readelf
Kopf und Segmente einer Binärdateie anzeigen.
elfedit
Kopf und Segmente von Binärdateien anzeigen.
Typ Name Segment C Beschreibung
A absolut
B BSS .bss static int zero; Nicht initialisierte Variablen
C common .bss int global; Dito für kleine Objekte
D data .data int global = 1;
G global .data
I indirect .reloc ? Indirekte Referenz auf ein anderes Objekt
N Debug Symbole
p Stack unwinding
R readonly .rodata static const int pi = 3.14;Initialisierte Konstante
S .bss
T text .text int func (void) {…}Funktion
U undefined .dynamic ? exit(); Referenz auf Objekt in einer anderen Bibliothek
V virtual weak object
W weak __attribute__((weak)) Default-Implementierung, wird von gleichnamigem starkem Symbol überschrieben
- stabs
? unknown

Literatur