Systemsicherheit - Probs mit Make

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Systemsicherheit - Probs mit Make
Hallo,

ich habe Probleme mit der aktuellen Systemsicherheitsaufgabe: http://www4.informatik.uni-erlangen.de/Lehre/WS10/V_SYSSEC/Uebung/aufgaben/assign3.pdf

Wir sollen eine Overlay-Lib erstellen, die Funktionen wie open etc. wrapt (somit also auch die Original-Fkts aufrufen soll - geht über dlsym).
Irgendwie passt mein Makefile aber noch nicht und ich weiß nicht so recht, warum (war eigentlich auch so in den Folien vorgeben http://www4.informatik.uni-erlangen.de/Lehre/WS10/V_SYSSEC/Uebung/folien/slides-3.pdf Seite 12).

.PHONY: all clean

all:
gcc -fPIC -c overlay.c utils.c -o overlay.so -shared -ldl

clean:
rm overlay.o overlay.so

Er beschwert sich ständig, dass readdir o.ä. schon deklariert ist. Kann mir jemand weiterhelfen? Vielen Dank :wink:

Fehlermeldungen:
gcc -fPIC -c overlay.c utils.c -o overlay.so -shared -ldl
gcc: utils.c: No such file or directory
overlay.c: In function ‘getShadow’:
overlay.c:17: warning: incompatible implicit declaration of built-in function ‘strcpy’
overlay.c:20: warning: incompatible implicit declaration of built-in function ‘strcat’
overlay.c: In function ‘open’:
overlay.c:36: error: expected ‘)’ before ‘func’
overlay.c:36: error: expected ‘)’ before ‘(’ token
overlay.c:36: error: expected ‘,’ or ‘;’ before ‘dlsym’
overlay.c:39: warning: passing argument 2 of ‘getShadow’ discards qualifiers from pointer target type
overlay.c: In function ‘fopen’:
overlay.c:90: error: expected ‘)’ before ‘func’
overlay.c:90: error: expected ‘)’ before ‘(’ token
overlay.c:90: error: expected ‘,’ or ‘;’ before ‘dlsym’
overlay.c: In function ‘fopen64’:
overlay.c:128: error: expected ‘)’ before ‘func’
overlay.c:128: error: expected ‘)’ before ‘(’ token
overlay.c:128: error: expected ‘,’ or ‘;’ before ‘dlsym’
overlay.c: At top level:
overlay.c:166: error: conflicting types for ‘__xstat64’
/usr/include/sys/stat.h:432: error: previous declaration of ‘__xstat64’ was here
overlay.c:174: error: redefinition of ‘__lxstat’
overlay.c:170: error: previous definition of ‘__lxstat’ was here
overlay.c:182: error: conflicting types for ‘readdir’
/usr/include/dirent.h:163: error: previous declaration of ‘readdir’ was here
overlay.c:186: error: conflicting types for ‘readdir64’
/usr/include/dirent.h:174: error: previous declaration of ‘readdir64’ was here
make: *** [all] Error 1


Da ist gleich mehrfach der Wurm drin:

  1. Die Datei [m]utils.c[/m] existiert nicht.
  2. Wenn du aus den Quellen direkt die .so-Bibliothek bauen willst, ist das Flag [m]-c[/m] (compile-only) fehl am Platze. Falls du stattdessen einen Umweg über .o-Zwischendateien nehmen willst, brauchst du dafür entsprechende Targets.
  3. Die String-Funktionen kennt der Compiler nicht, weil ein [m]#include <string.h>[/m] fehlt.
  4. Alles, was ab Zeile 36 an Fehlermeldungen kommt, sieht mir schwer nach Syntaxfehlern im Programmcode aus.

Allgemeine Grundregel, wenn was nicht kompiliert: immer die Fehlermeldungen von oben nach unten durchlesen! Oft sind viele der unteren Fehler einfach Folgefehler der vorhergehenden, weil der Compiler verwirrt ist.


Hi,

danke für die schnelle Antwort.
Zu deinen Anmerkungen:

  1. stand so auf den Folien, aber ich hab’s mal weggelassen
  2. ups, das ist irgendwie noch übrig geblieben, hab’s entfernt
  3. jop stimmt… eingefügt
  4. die Fehler ab Zeile 36 kommen meines Erachtens von dlsym… Er kennt die Funktion nicht und entsprechend versteht er die Klammern etc. nicht. Ist nämlich eigentlich auch genau so aus den Folien übernommen:
#define _GNU_SOURCE 1
#include <dlfcn.h>

//...

FILE* (*func) (const char* path, const char* mode) =
                  (FILE* (*func) (const char* path, const char* mode)) dlsym(RTLD_NEXT, "fopen");

Hauptproblem ist allerdings
overlay.c:187: error: conflicting types for ‘readdir64’
/usr/include/dirent.h:174: error: previous declaration of ‘readdir64’ was here
=> Funktion ist doppelt vorhanden, wie kann ich das trotzdem machen? #include dirent.h brauch ich für DIR*, sonst kann ich readdir gar nicht deklarieren. Aber dann findet er auch die “normale” readdir Funktion und beschwert sich natürlich.


Anscheinend hast du dein readdir64 anders deklariert als es sein sollte (Rückgabetyp [m]struct dirent64 *[/m]?).

Aufgrund des unterschiedlichen Rückgabewerts kann es es einfacher sein beide Varianten – readdir und readdir64 – einzeln zu implementieren, anstatt eine aus der anderen aufrufen zu wollen.


Danke für den Tipp. Jo, der Rückgabetyp war falsch. Interessant dass er dann previous blablub sagt…

EDIT: falls es jemand noch nicht weiß: copy&paste ist böhöse