关于c语言的几点

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:

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值