GCC Tricks

Programm dynamisch, aber eine library statisch linken

Manchmal will man vielleicht eine library statisch linken (z.B. um eine unerwünschte Abhängigkeit zu vermeiden), den Rest aber schon dynamisch, damit das resultierende Programm nicht zu gross wird.
In diesem Beispiel linken wir die ZLib statisch, den Rest dynamisch:

gcc test.c -lm -l:libz.a -o test

Nützliche Debug Informationen

Für nützliche debug-informationen kann man folgende vordefinierten Makros verwenden:

printf("%s:%s line %i\n", __FILE__, __FUNCTION__, __LINE__);

Diese werden dann von cpp mit den jeweiligen Werten gefüttert, ausser __FUNCTION__ (welches gar kein Makro ist), welches direkt von gcc kommt (alternativ auch __func__ welches Teil des C99 standards ist)

Lokalen LD_LIBRARY_PATH beim compilieren setzen

Natürlich könnte man durch setzen der LD_LIBRARY_PATH Umgebungsvariable den Linker veranlassen in einem lokalen Verzeichnis nach einer shared lib zu suchen. Der elegantere Weg ist aber, dies bereits beim compilieren mit im ELF binary abzuspeichern. Dies geschieht mit der Linkeroption "-R <path>":

$ make LDFLAGS="-Wl,-R -Wl,/home/blip/libdir"

Man kann sich davon überzeugen dass dieser RPATH nun im ELF binary gesetzt ist:

$ objdump -p test-binary | grep RPATH RPATH /home/blip/libdir

Wenn man erreichen will, dass der Linker im aktuellen Verzeichnis sucht, kann man RPATH auf $ORIGIN setzen (Achtung, das Dollar muss escaped werden).

$ make CFLAGS="-fPIC" LDFLAGS="-Wl,-rpath '-Wl,\$\$ORIGIN'"

Read-Only Reloctable

Linker Flags für teilweise RELRO (GOT ist immer noch beschreibbar)

$ gcc -Wl,-z,relro ...

Linker Flags für vollständige RELRO

$ gcc -Wl,-z,relro,-z,now ...