linux + 怎样控制c静态库的导出函数

linux + 怎样控制c静态库的导出函数,第1张

Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。 ln -s libhello.so.1.0 libhello.so.1 ln -s libhello.so.1 libhello.so 动态库和静态库的区别: 当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省 *** 作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。 两种库的编译产生方法: 第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库: /* hello.c */ #include void sayhello() { printf("hello,world\n")} 用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等

linux内核之模块参数及导出符号

1. 模块参数

用 “module_param (参数名,参数类型,参数读 / 写权限) ” 为模块定义一个参数,例如下列代码定义了 1 个整型参数和 1 个字符指针参数:

1 static char *book_name = "dissecting Linux Device Driver"

2 module_param(book_name, charp, S_IRUGO)

3 static int book_num = 4000

4 module_param(book_num, int, S_IRUGO)

在装载内核模块时,用户可以向模块传递参数,形式为 “insmode 模块名 参数名 = 参数值,如果不传递,参数将使用模块内定义的缺省值。参数类型可以是 byte 、 short 、 ushort 、 int 、 uint 、 long 、 ulong 、 charp (字符指针)、 bool 或 invbool (布尔的反),在模块被编译时会将 module_param 中声明的类型与变量定义的类型进行比较,判断是否一致。模块被加载后,在 /sys/module/ 目录下将出现以此模块名命名的目录。在此模块的目录下还将出现 parameters 目录,其中包含一系列以参数名命名的文件节点,这些文件的权限值就是传入module_param ()的 “参数读 / 写权限” ,而文件的内容为参数的值。

insmod命令加载模块后,通过查看 “/var/log/messages” 日志文件可以看到内核的输出:

# tail -n 2 /var/log/messages

tail -n 2表示输入文件的最后2行

2. 导出符号

Linux 的 “/proc/kallsyms” 文件对应着内核符号表,它记录了符号以及符号所在的内存地址。模块可以使用如下宏导出符号到内核符号表中:

EXPORT_SYMBOL( 符号名 )

EXPORT_SYMBOL_GPL( 符号名 )

导出的符号可以被其他模块使用,只需使用前声明一下即可。 EXPORT_SYMBOL_GPL ()只适用于包含 GPL许可权的模块。

如果符号名是“e_symbol”,从 “/proc/kallsyms” 文件中找出 e_symbol 的相关信息:

# grep e_symbol /proc/kallsyms

8000af1c t e_symbol [export_symb]

Linux不像Windows一样,接上新硬件后可以自动识别,在Linux下无法自动识别新硬件的,需要手动去识别。USB移动存储设备通常被识别为sda1,具体可以通过fdisk -l命令查询。

在使用U盘前,我们先要为外挂点新建一个子目录,一般外挂点的子目录都是建立在/mnt里面的,我们也建在那里,当然也可以建在/目录下,名字可以自己定,我们就取名为usb,终端下的命令如下:

mkdir /mnt/usb

然后我们就可以接上我的U盘了,然后在终端下输入命令并击Enter键即可:

mount /dev/sda1 /mnt/usb

在Windows下当我们用完U盘后,在我们取下U盘前我们先要删除,同样在Linux下我们也要删除挂起点,方法是:

umount /dev/sda1 /mnt/usb 或 umount /dev/sda1

如果不把U盘给umount掉,那样很容易造成数据的丢失


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7374365.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存