1.static
跟全局变量 : 限制作用域。 跟局部变量 : 延长生命周期。 跟函数 :只能在本模块内有效
2. 函数副作用 : 内部改变外部的值
3. 目标文件和可执行文件的区别
目标文件 : 相对路径,不可运行
可执行文件 : 绝对路径,可运行
虚拟址通过mmu物理址
4.数据段合并,(合并同类项) 地址回填(重定位)
5.
.bss 这两个合并 |
.data |
.rodata 这两个合并 |
.text |
6.标准C库
Linux下 libc, unix和windows下的glibc
7.静态库
特点 : 比较消耗内存 优点 :速度快
8.如果用ls做链接时没有用-T选项制定链接脚本,则使用ld的默认链接脚本,默认链接脚本可以使用ld --verbose命令查看
9.ENTRY(_start) 说明_start是整个程序的入口点,因此_start是入口点并不是规定死的,是可以改用其它函数做入口点的。
10.做静态库流程。。源文件main.c, sub.c,add.c, head.h
(1)gcc -c main.c sub.c add.c
(2)ar rs libaddsub.a sub.o add.o
或者(2)ar r libaddsub.a sub.o add.o
ranlib liaaddsub.a
(3)gcc main.c -L. -laddsub -omain
-L.表示在当前目录找(.不可省略),-laddsub告诉编译器要链接的libaddsub库
(4)选项r表示将后面的文件列表添加到文件包,如果文件包不存在就创建它,如果文件包忠已有同名文件就替换成新的,。s是专门用于生成静态库,表示位静态库创建索引。这个索引被链接器使用
11.如果希望编译器只链接静态库,可以指定-static选项
12.好处 : (1)连接器可以从静态库中只取出需要的部分来做链接 (2)不需要写一长串目标文件名
12 共享库 :
优点 : 节省内存,方便更新
缺点 : 速度较慢
13. 共享库采用的机制 :延迟绑定
14.在共享库调用时,动态库是否加载到内存,取决于程序是否运行。
15.生成共享库流程:main.c add.c sub.c head.h
gcc -c -fPIC add.c sub.c
gcc -shared -o libaddsub.so add.o sub.o
(1). -f 后面跟一些编译选项,
(2). PIC : 表示生成位置无关代码
注意 : 加调试信息必须每个目标文件时用-g选项,而不能只在最后编译生成可执行文件时用-g选项
ldd命令查看可执行文件依赖于哪些共享库
使用gcc做链接时用-dynamic-linker指定动态链接器的路径
共享库的搜索路径由动态链接器决定,从ld.so(8)Man page可以查到共享库路径的搜索路径:
(1)在环境变量LD_LIBRARY_PATH所记录的路径中查找
export LD_LIBRARY_RATH=. 或把这句话加在 .bashrc中
./main
(2)(重点)从缓存文件/etc/ld.so.cache中查找,这个由ldconfig命令读取配置文件/etc/ld.so.conf之后生成
把libaddsub.so所在目录的绝对路径添加到/etc/ld.so.conf中
然后 sudo ldconfig -v
(3)(重点)把libaddsub.so 拷贝到/usr/lib或/lib目录
(4)在编译时把libaddsub.so的路径写死在可执行文件中
gcc main.c -g -L. -laddsub -o main -Wl,-rpath,/home/cxw/CXW
16.每个共享库都有三个文件名 : realname soname linkername
英语,今天的 : directory(目录) libraries(库) loading(加载)