linux加载so文件,linux动态加载so库文件

1:

libf1.so

#ifndef F1_HH_

#define F1_HH_

extern “C” int func1(char *p);

#endif

#include

using namespace std;

#ifdef __cplusplus

extern "C" {

#endif

int func1(char *p)

{

if(p)

{

std::cout <

std::cout <

}

return 1;

}

#ifdef __cplusplus

}

#endif

libf2.so

类似, 只是输出不同

2: 编译so

g++ f1.cpp -shared -fPIC -g -o libf1.so

g++ f2.cpp -shared -fPIC -g -o libf2.so

3: 应用程序

注册信号、动态加载;收到信号后重新加载

几个注意点:

a)  so的编译

b)  #ifdef __cplusplus ; 防止找不到符号。 so的编译器与应用程序的编译器保持一致

c)  g++ -rdynamic -lf1 -g -o test main.cpp -ldl 编译应用程序。 -lf1的意思是动态链接libf1.so     -ldl是为了使得可以动态加载libf2.so

4)  应用程序使用的so必需是通过符号链接到真实的so文件; 可以直接加载so,但是这种情况下so不能被修改(覆盖),覆盖时会程序core掉

[cpp]  view plain copy

#include 

#include 

#include 

#include 

#include 

#include 

#include "f1.h"

intisreload = 0;

voidsig_show(ints)

{

printf("catched signal: %d/n", s);

return;

}

voidsig_reloadso(ints)

{

printf("catched signal: %d/n", s);

isreload = 1;

printf("sigfunc isreload ? %d/n", isreload);

return;

}

intmain(intargc,char*argv [])

{

std::cout <

structsigaction show;

show.sa_handler = &sig_show;

show.sa_flags = SA_NOMASK;

show.sa_restorer = 0;

if(sigaction(3, &show, 0) == -1)

{

printf("sigaction failed. errno: %d/n", errno);

return0;

}

structsigaction reload;

reload.sa_handler = &sig_reloadso;

reload.sa_flags = SA_NOMASK;

reload.sa_restorer = 0;

if(sigaction(4, &reload, 0) == -1)

{

printf("sigaction failed. errno: %d/n", errno);

return0;

}

void*libf2;

int(*f2)(char*);

conststaticchar* h ="hello";

charbuf[200];

if((libf2 = dlopen("./libf2.so", RTLD_NOW | RTLD_GLOBAL)) != 0)

{

f2 = (int(*)(char*)) dlsym(libf2,"func2");

if(dlerror())

{

printf("error? %s/n", dlerror());

}

}

else

{

printf("can not open libf2.so/n");

return0;

}

inti;

while(1)

{

printf("isreload ? %d/n", isreload);

if(isreload)//test if need reload

{

dlclose(libf2);

if((libf2 = dlopen("./libf2.so", RTLD_LAZY | RTLD_GLOBAL)) != 0)

{

f2 = (int(*)(char*)) dlsym(libf2,"func2");

if(dlerror())

{

printf("error? %s/n", dlerror());

return0;

}

}

isreload = 0;

printf("successfully reload libf2.so/n");

}

++i;

sprintf(buf, "%s %d", h, i);

f2(buf);        //from f2

func1(buf);     //from f1

sleep(4);

}

return0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值