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:
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)
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>":
Man kann sich davon überzeugen dass dieser RPATH nun im ELF binary gesetzt ist:
Wenn man erreichen will, dass der Linker im aktuellen Verzeichnis sucht, kann man RPATH auf $ORIGIN setzen (Achtung, das Dollar muss escaped werden).
Linker Flags für teilweise RELRO (GOT ist immer noch beschreibbar)
Linker Flags für vollständige RELRO