LD_PRELOAD + Threads
-
Hi,
ich bastel an einer shared-library, die ich mit LD_PRELOAD vor verschiedene Programme laden möchte.
Doch es gibt ein Problem, wenn das entsprechende Programm Threads verwendet.In einem Header habe ich eine Variable wie folgt deklariert:
extern int (*repl_func_open)( const char *file, int mode, void *opt );
und in einer .c Datei dementsprechend:
int (*repl_func_open)( const char *file, int mode, void *opt );
Wenn ich das Programm starte wird die Variable in einer Funktion
void init() __attribute__ ((constructor));
mit einem Wert belegt. Schaue ich jedoch mit gdb nach, so hat die Variable keinen Wert mehr, und ich vermute, das hängt mit Threads zusammen. Dass die Variable im ersten Thread belegt wird, und im zweiten die init() Funktion nicht mehr aufgerufen wird.
Ich hätte es jedoch gern so, dass die Variable einmal belegt überall gültig ist, geht das irgenwie, vielleicht mit static?Gruß, Olli
-
mit static ist das möglich, man muß aber beachten das dann nur ein Neustart des Programms den Ursprungswert wieder annimmt. Ich bin mir nicht sicher aber ist volataile nicht passend?
-
Ich habe die Variablen jetzt static gemacht, und, da ich sie dann nicht mehr im header deklarieren kann, komplett in die .c verschoben und über eine set und eine get Funktion erreichbar gemacht. Problem an der Sache: gleiche Symptome wie vorher! -.-
-
...volatile...heißt es richtig
-
Ah ich habs jetzt gelöst. Das ganze geht auch ohne volatile, nur wurde, entgegen allen Erwartungen, die "backup" Funktion, die die originalen Funkionen sichert, nicht aufgerufen. Sprich die "init" Funktion wurde zu spät aufgerufen.
Gruß,Olli