Linux平台上动态链接库的创建与加载
在读jvm代码时,学习了读取动态链接库的方法。下面就.so文件的创建和读取做一个简单的总结。
1.创建.so文件
add.h
#ifndef ADD_H
#define ADD_H
int add(int arg1,int arg2);
#endif
add.c
#include "add.h"
int add(int arg1,int arg2)
{
return arg1 + arg2;
}
编译为.o文件:
gcc -fPIC -c add.c
生成库文件:
gcc -shared -Wl,-soname,libadd.so.1 -o libadd.so.1.0 add.o
cp libadd.so.1.0 libadd.so
这样就生成了libadd.so库文件。修改LD_LIBRARY_PATH,将libadd.so加入到路径中。
2.加载.so文件,调用函数。
dltest.c,参考man 3 dlopen 帮助文件中的例子。
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(int argc, char **argv)
{
void *handle;
int (*add)(int,int);
char *error;
handle = dlopen ("libadd.so", RTLD_LAZY);
if (!handle) {
fprintf (stderr, "%s\n", dlerror());
exit(1);
}
dlerror(); /* Clear any existing error */
add = dlsym(handle, "add");
if ((error = dlerror()) != NULL) {
fprintf (stderr, "%s\n", error);
exit(1);
}
printf ("%d\n", add(3,5));
dlclose(handle);
return 0;
}
编译:
gcc -rdynamic -o dltest dltest.c -ldl
执行dltest得到结果为8。
相关文档:
例一:发送Signaling Packet:
Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x0001.
多个Command可以在一个C-frame(control frame)中发送。
如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接Socket。这样才有机会自己填充Command Code,Identi ......
防火墙相应端口没有打开。
打开方法如下:
vi /etc/sysconfig/iptables
加入如下的一行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT
重启iptables:
/etc/init.d/iptables restart
查看端口是否真的打开:
/etc/init.d/iptables status ......
静态链接库是以.a结尾的文件,一般是用工具将多个.o文件合并到一起组成静态库
动态链接库是以.so结尾的文件,和windows下的dll文件类似。
静态链接库都可以在程序编译过程中用 -L参数来指定他们 -L/opt/lib/XXX.a
动态链接库一般是在LD_LIBRARY_PATH中来指定搜索路径,也可以在 -L/opt/lib 后面加一个 lXX,对应了lib中的XX. ......
系统启动
1、系统加电
2、BIOS 自检 → 本地设备枚举和初始化
3、POST 代码从内存中清除,但运行时服务(runtime service)仍然留在内存。
4、BIOS 从 CMOS 的设置中找出第1/2/3 启动设备(可能有第4个),然后逐个尝试,并在第一个 "active“状态的硬盘上读入其 MBR
第一阶段引导加载程序
1、MBR ......