uc高级编程(二)
一、库工具介绍
1.ldconfig
此为动态链接库管理命令,目的是让动态链接库为系统所共享
搜索路径有三个 两默认(usr/lib,lib) 还一个动态库配置文件etc/ld.so.conf,搜索可共享的动态链接库,从而创建出动态装入程序所需的连接和缓存文件(这里不太懂),缓存文件etc/ld.so.cache,此文件已保存好用于动态链接库的名字列表。
常用命令
-v或--verbose 用此选项时,ldconfig将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的链接的名字
-n 用此选项是ldconfig只扫描命令行制定的目录,不扫描系统默认目录(usr/lib,lib)和动态库配置文件etc/ld.so.conf所列的目录
-N此选项指示ldconfig不创建新的缓冲文件(etc/ld.so.cache),在未使用-X的情况下,ipconfig照常更新链接文件
-X 此选项指示ldconfig不更新文件的链接,如果没用-N,则仍然正常更新缓冲文件。
-f CONF此选项指定动态链接库的配置文件为CONF,默认是etc/ld.so.conf
-C CACHE 此选项生成缓存文件CACHE,默认是etc/ld.so.conf
-r ROOT 改变应用程序的根目录为ROOT
-l 专家模式,需要手动设置连接,一把不建议用。
-p或--print-cache ldconfig打印出当前缓存文件中共享库的名字
-c FORMAT 此选项用于指定缓存文件的格式,有old、new、compat(兼容,默认) 三种格式
-V 打印出ldconfig的版本信息
-?或--help 或--usage 打印帮助信息
2.nm
用于列出目标文件的符号清单
-p不排序显示 -r逆序显示 -size-sort大小排列显示 -o用源文件标示成员符号
-s 显示模块索引信息 -D对动态库用动态符号 -g显示定义为外部的符号
3.strip
去除指定目标文件和静态库中的调试信息
4.ldd
列出共享库的依赖关系
5.objdump
显示二进制信息
-S 尽可能反汇编出源代码,尤其加了-g
--show-raw-insn 显示机器码 比较恶劣 除非指定了--prefix-addresses,这将是缺省选项
--no-show-raw-insn 不显示机器码,指定了--prefix-addresses时的缺省设置
三、异常处理
1.根据返回值判断异常
一般数据 -1代表错误
指针 NULL或0Xffffffff代表错误
判断状态,比如返回1成功,0失败
void返回值 一般没异常用这个
2.全局变量errno获取错误原因
三个函数
printf("%m");此函数自动寻找errno然后打印错误信息
strerror(errno);此函数的返回值为错误信息,需借助printf来打印
perror("")此函数自动寻找errno并打印错误原因,本人很喜欢这个,方便快捷
唯一能编译linux内核的编译器是gcc
四、内存管理
1.环境变量
环境表eviron,是一个二级指针,指向一个字符串数组,该字符串以NULL结束。
eviron的几个函数
getenv 返回name关联的value指针
putenv 将"name=value"的环境变量放进环境表
setenv 将name设置为value,第三个参数为0代表不修改已有的变量,其他数代表修改
unsetenv 删除
clearenv删除所有项
c语言的内存管理顺序
malloc/free是程序员层面的内存分配与释放,实现需要sbrk和brk两个函数,这两个函数又需要mmap来实现内存映射,才能访问到内存
进程与内存
一般的进程会涉及到5种不同的数据段
全局区 全局变量,静态变量存放的地方
代码段 函数存放的地方,有只读属性,一般认为字符串的字面值也在此处
bss段 未初始化的全局变量存在的地方
堆区 用户自由控制的内存区
栈区 局部变量,数组的存储区
32为系统的每个进程都是是通过4G的虚拟内存,用多少内存映射多少到内存区的方式来管理内存的,所以支持多进程,只要物理内存没爆,可以无限加进程。内存映射的最小单位是4096字节,可以是其倍数。
今天都是理论性的东西,看着有点懵,以后实践中还需慢慢体会。
浙公网安备 33010602011771号