PDA

View Full Version : نحوه dlopen کردن فایل .so در توسعه ماژول apache



AriaGlobal
پنج شنبه 22 مهر 1395, 22:33 عصر
سلام دوستان من در حال توسعه یک ماژول آپاچی هستم. من یک فایل .so ایجاد کردم که یک تابع به صورت extren "C" ایجاد کردم و کامپایل کردم و حالا میخوام در handler این فایل رو لود کنم و از تابعش استفاده کنم اما وقتی به وسیله apxs کامپایل میکنم با موفقیت کامپایل میشه اما وقتی از طریق وب سرور صدا میکنم با خطای مرورگر مواجه میشم..

فایل .so من هم مشکل نداره چون تو یه برنامه دیگه ازش استفاده کردم و به راحتی dlopen شد.

از سیستم عامل لینوکس استفاده میکنم
و از نسخه 2 آپاچی
برای کامپایل ماژول آپاچی از این دستور استاندارد استفاده میکنم :

apxs -i -a -c mod_helloworld.c

برای کامپایل فایل .so هم از این دستور استفاده میکنم

gcc -shared -o testfunc.so -fPIC testfunc.cpp

این هم کدم :



#include <dlfcn.h>
#include <stdbool.h>
#include <httpd.h>
#include <http_protocol.h>
#include <http_config.h>



static int helloworld_handler(request_rec* r)
{
if (!r->handler || strcmp(r->handler, "helloworld"))
return DECLINED;

if (r->method_number != M_GET)
return HTTP_METHOD_NOT_ALLOWED;


// here i try to load so file --------------------------------
typedef bool (*hello_t)();
void *handle;

handle = dlopen ("/lib.so", RTLD_LAZY);
hello_t echo = (hello_t) dlsym(handle, "echo");

echo();


// ------------------------------------------------------------
return OK;
}

static void register_hooks(apr_pool_t* pool)
{
ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);
}


module AP_MODULE_DECLARE_DATA helloworld_module = {
STANDARD20_MODULE_STUFF,
NULL,
NULL,
NULL,
NULL,
NULL,
register_hooks
};


میدونم که برای کامپایل برنامه ای که از یک فایل .so خارجی داره استفاده میکنه باید هنگام کامپایل با g++ از ابشن -ldl استفاده کنم اما خب این امکان در apxs وجود نداره

رفرنس ها :

https://httpd.apache.org/docs/2.4/programs/apxs.html
https://httpd.apache.org/docs/2.4/developer/modguide.html
این هم ممکنه کمک کنه :
https://httpd.apache.org/docs/2.4/dso.html

ممنون