AzkaBan  

编译器 链接器 加载器

1. 编译器/汇编器 按条件编译,将汇编转为机器语 .o文件 gcc -o

可重定位文件: 静态加载
共享文件: 可静态加载与动态加载
可执行文件: 直接载入内存

静态库: 打包目标文件的集合
动态库: 动态,共享加载

2. 链接器 使编译 使用分离。
静态库搜索路径(由静态链接器负责)

gcc先从-L寻找;
再找环境变量LIBRARY_PATH指定的搜索路径;
再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的。

动态库搜索路径(由动态链接器负责)

编译目标代码时指定的动态库搜索路径-L;
环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
配置文件/etc/ld.so.conf中指定的动态库搜索路径;
默认的动态库搜索路径/lib /usr/lib/ /usr/local/lib


3. 加载 静态加载, 链接器将函数代码从静态库拷贝到可执行程序,进程的虚拟地址空间。

动态加载,动态库只提供符号表等少量信息,在程序执行时进行重定位。

加载过程: 会根据头部表将目标文件拷贝进内存,加载器跳到程序入口, 开始执行程序,执行代码。


动态分配的内存在函数退出或者超出作用域后不会自动注销,只要你有这块内存的地址,随时可以访问,也不会被分配给别的函数(数据)。那么就存在一个问题,当你频繁的动态分配内存而不释放,你的内存就会被消耗完

如果是二维数组, 先将里面的释放了, 再释放外面总的。

fwrite fread 是堆叠式的格式,采用固定长度分隔。

C++记录8

创建链接性为外部的静态变量,在代码外:
int global = 0

创建链接性为外部的静态变量,在代码外:
static int one = 0

创建无间接性的, 在代码中: static

链接规范extern 'c' extern 'c++'

new 的内存 用delete删除

类构造:
Test(...) 不需要返回值
或者使用指针 Test *t = new Test(...)

posted on 2019-05-08 15:26  AzkaBan  阅读(128)  评论(0编辑  收藏  举报