catch dlopen ?
-
Hallo!
Wenn ich eine dynamische lib versuche zu öffnen, welche einen kritisches Fehler beinhaltet (zB undefined reference) schmiert mir immer das gesamte Programm ab, obwohl ich sie lediglich versucht habe zu öffnen und nicht zu benutzen! Kann man das irgendwie abfangen? Try-catch funktioniert da wohl nicht?Ich Danke euch vielmals.
-
überprüfst du den rückgabewert von dlopen?
also:void * handle=dlopen("lib",RTLD_LAZY); char * error_msg; if ( (error_msg= dlerror()) != 0) { std::cerr << error_msg << std::endl; exit(-1); }
-
ghorst schrieb:
void * handle=dlopen("lib",RTLD_LAZY); char * error_msg; if ( (error_msg= dlerror()) != 0) { std::cerr << error_msg << std::endl; exit(-1); }
sollte das nicht eher so aussehen?
if ( (error_msg= dlerror()) != NULL)
{
...
}blan
-
da der user "dlopen" von try-catch sprach scheint er c++ zu nutzen. da gibt es formal kein NULL.
-
Danke für eure Antworten. Ja, ich programmiere C++. Ich habe mein Problem nochmal "untersucht" und wie es scheint liegt das nicht an dlopen. Ich lade in meiner lib eine klasse mit klasse* create_class() und delete_class(klasse*) als extern "C" funktionen in der so. Wenn ich in besagter klasse eine funktion nicht deklariere dann kommt es im hauptprogramm zum crash! Wahrscheinlich baue ich die so sogar falsch da das ja dann erst gar nicht compilieren dürfte, aber selbst wenn "jemand" diese so falsch erstellt darf das programm nicht crashen, oder?!!!
Danke
-
nimm mal statt RTLD_LAZY RTLD_NOW. dann sollte sich eine .so mit undefinierten referenzen nicht mehr laden lassen, dafür dauert es dann einen moment länger.
mit RTLD_LAZY werden die referenzen erst bei bedarf aufgelöst, wenn du dann direkt oder indirekt auf eine solche zugreifst und das auflösen nicht möglich ist, geht dein programm halt krachen.ansonsten: eine .so muss nicht abgeschlossen sein, daher darf sie referenzen aufweisen, die erst nach dem laden gebunden werden können. daher kann dein compiler leider gar nicht meckern, wenn du irgendeine funktion nicht definiert hast.
-
Ausgezeichnet! Danke