1,位运算
位运算可以实现掩码运算。(linux提取文件的权限)。
异或运算的特性:与1异或,取相反值,与0异或,取其本身。也可以用异或实现交换,a=a异或b,b=b异或a,a=a异或b,实现交换。
循环移位:对a循环右移n,b=a<<(32-n), c=a>>n, c=c&~(~0<<n), c=c|b。
2,C99新标准关键字
inline,用于短小而且需要频繁调用的函数。编译器会自动选择inline所限定的函数时候展开。从而不发生跳转、压栈等操作,提高程序的执行速度。
restrict,表明指针x是指向这块区域的唯一的指针,也就是这块内存区域的唯一入口。在任何时候修改这块内存单元的操作都需要通过指针x才能完成。
3,ELF格式的可重定位目标文件
.text,代码段
.rodata,只读数据段,存储复杂常量,比如字符串
.data,数据段,存储已经被明确初始化的全局数据,包括c语言中的全局变量和静态变量。如果全局变量被初始化为0,则不存储在数据段中,而是存储在块存储段中。
.bss,块存储段。占位符,以告知指定位置上应当预留全局数据的空间。其存在的原因是为了提高磁盘上存储空间的利用率。
以上段会在运行是加载到内存中。
.symtab,符号表
.rel.text,代码段需要重定位的信息
.rel.data,数据段需要重定位的信息
.debug,调试信息
.line,源程序行号映射
.strtab,字符串表
以上段都不会出现在运行的程序中,它们都是附加的信息。
4,库
静态库:在可执行程序运行前就已经加入到执行码中,成为执行程序的一部分来执行。
gcc -c static_lib.c
ar rcs static_lib.a static_lib.o
static_lib.h中申明静态库中的全局变量和函数
main.c中include"static_lib.h"
gcc main.c -lstatic_lib.a -o app -l必须放在被编译的源文件之后
或者gcc -L.main.c -o app
或者 gcc main.c -static ./static_lib.a -o app
动态库:在执行程序启动时加载到执行程序中,可以被多个执行程序共享使用。
gcc -shared -fPIC -o share_lib.so share_lib.c
同样,需要制作一个包含该动态库中全局符号申明的头文件
gcc main.c ./ static_lib.so -o app
5,gcc工具链
ar:生成静态库
as:
ld:
nm:查看目标文件中的符号
objcopy:将原目标文件中的内容复制到新的目标文件中,可以通过不同的选项调整目标文件的格式
ranlib:为静态库创建索引,相当于ar -s选项
readelf: