Apache modul, segmentfault

Antikalas

Grünschnabel
Hallo,

Ich habe wiedermal ein Problem bei dem ich nicht weiter komme, und zwar programmiere ich schon seit einiger Zeit ein Apache modul.
Nun bin ich "dummer weise" auf die Idee gekommen einige funktionen in shared objects auszulagern.

So weit funktioniert auch alles. Aber der Apache erstellt bei jedem request vom Internet einen neuen Process. Wenn ich die funktionen lade nachdem der neue Process erstellt wurde sind die funktionen vorhanden, aber ich würde gerne die funktionene vorher laden. Und bei diesem versuch, mittlerweile mit den standartfunktionen dlopen und dlsym und nicht mit den dafür vorgesehnen apr funktionen bekomme ich ein segment fault, wenn ich bei dlsym ankomme.

Würde mich sehr über hilfe oder tipps wo ich weitere informationen finde freuen.

Code:
module AP_MODULE_DECLARE_DATA helloworld_module = {
STANDARD20_MODULE_STUFF,
module_init,
NULL,
create_helloworld_config,
merged_helloworld_config,
mod_helloworld_cmds,
helloworld_hooks
};


void *verschl_lib;
char *verschl_verz=0;
typedef char *(*pw_verschluesseln_t)(char*, char*, unsigned int, apr_pool_t*);
typedef char *(*pw_entschluesseln_t)(char*, char*, unsigned int, apr_pool_t*);

pw_verschluesseln_t pw_verschluesseln;
pw_entschluesseln_t pw_entschluesseln;


//einrichten der externen notwendigen funktionen
static int load_stdfunc(apr_pool_t *pool){

if(!(verschl_lib=dlopen(verschl_verz, RTLD_NOW|RTLD_GLOBAL))){
return 1;
}

printf("versch_lib:%i, %s\n",verschl_lib,verschl_verz);

if(!(pw_entschluesseln=(pw_entschluesseln_t)dlsym(verschl_lib,"pw_entschluesseln"))){
	if(dlerror()){
		return 2;
	}
}

printf("versch_lib1:%i, %s\n",verschl_lib,verschl_verz);

if(!(pw_verschluesseln=(pw_verschluesseln_t)dlsym(verschl_lib,"pw_verschluesseln"))){
if(dlerror()){
return 2;
}
}

return 0;
}

static int init_stdfunc(apr_pool_t *pool){
//vorbereitung der externen notwendigen funktionen
verschl_verz=apr_palloc(pool,strlen(my_libs)+strlen("verschluesseln.so.1")+1);
sprintf(verschl_verz,"%s%s",my_libs,"verschluesseln.so.1");
if(!verschl_verz){
	return 3;
}
return 0;
}


int set_global(apr_pool_t *pool){
	// initialisieren der lib structuren
init_lib_structs(pool);
		int st=0;
if(st=init_stdfunc(pool)){
	
}
dbg_fnrwrite_log("test","%i",st);
if(st=load_stdfunc(pool)){
	dbg_fnrwrite_log("dl_load","%s","error");
}
}


//so funktioniert es, es wird bei jedem request neu geladen

static int helloworld_handler(request_rec *r)
{
dbg_fwrite_log(r,"debug","%s","request startet");
interp_cfg *r_cfg=ap_get_module_config(
    r->server->module_config, &helloworld_module);
dbg_fwrite_log(r,"test","%s","lines");
if (!r_cfg->Status) {
return DECLINED;
} 
set_global(r->pool);
#include "status.c"
		
return Verteiler(r,s_cfg,r_cfg);
}          



// so funktioniert es nicht, soll nur einmal beim start des servers geladen werden
// und stürtz auch direkt beim laden des Servers ab, es muss keine zuladen funktion ausgeführt werden

static void helloworld_hooks(apr_pool_t *pool)
{
set_global(pool);
	ap_hook_log_transaction(close_proc, NULL, NULL, APR_HOOK_MIDDLE);
//ap_hook_child_init(my_child_init, NULL, NULL, APR_HOOK_MIDDLE);//eventuell grund des fehlers bei dlopen und fork
ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

MfG.
Patrick Weber
 
Zuletzt bearbeitet:
Hallo,

mein Problem hat sich gelöst, nun geht es mir darum wie es zu einem solchen Fehler kommen konnte.

Ich hoffe es kann mir jemand dabei helfen und mir zum besseren Verständnis erklären, wie es zu diesem Segmentfault kommt.

Das Problem war in Zeile 24, ich hatte und habe nun auch wieder RTLD_GLOBAL verwendet.
Dies ist nicht besonderes, aber Apache führte diese Funktion mehrmals aus, ich vermute mal mit verschiedenen Prozessen. Ich habe herrausgefunden, dass verschiedene Handles erzeugt wurden, die ich dann mit dlsym verwendet hatte und dies führte zum Segmentfault. Nun habe ich dafür gesorgt, dass nur beim letzten Funktionaufruf die "so Datei" geladen wird.

Ich würde mich sehr über eine Erklärung freuen.

Offtopic:
Kennt nicht zufallig jemand ein Forum wo ich Fragen speziell über die Programmierung von Apache Module stellen könnte? Im Notfall auch ein Englisches.

MfG.
Patrick Weber
 

Neue Beiträge

Zurück