find . -name *.c | wc -l //查找并统计c程序文件的个数 find . -name *.c -exec wc {} -l \; //查找并统计每一个C程序的行数 find . -name *.c -exec cat {} \; | wc -l //查找并统计全部c程序的总行数
gcc simple.c -o simple //编译生成为指定文件,默认为a.out gcc -S simple.c //生成 simple.s 的汇编程序 gcc -E print.c > print.i //预处理,头文件的引入与处理 gcc -v print.c //生成编译连接过程,libc.a cc1 //编译器 as //汇编器 collect2 //连接器 objdump -d a.out //获得全部机器指令(反汇编) echo $? //上一个程序执行后的返回值 objcopy -O binary -j .text a.out text.bin //提取可执行文件的代码 objcopy -O binary -j .data a.out data.bin //提取可执行文件的数据 file a.out //文件格式(类型)信息 hexdump -C a.out //查看二进制文件的内容 readelf -a a.out //分析ELF文件 ps aux | grep a.out
局部变量的数据分配在栈上,且赋值操做会被解析成指令;全局变量分配在数据区,赋初值的等号至关于冒号,并不解析成指令。linux
&local = 0xbfb8948c &global = 0x804a018 main = 0x8048414 _start is 0x8048360 //c语言真正的入口
直观映像,内存跨度 128M ~ 3G 。
操做系统管理物理内存,每一个进行都有独立的内存空间,程序打印的地址都是虚拟地址,其对应关系由操做系统内核管理。编程
extern _start; //由连接器生成的 ... printf("_start is %p\n", &_start);
调试宏操作系统
#define PRINT(x) printf("<debug>" #x "= %d\n", x) //#define PRINT(x)
条件编译;-lm 连接时加入数学库debug
#if DEGUG … #endif $ gcc t.c -lm -DDEBUG //定义 $ gcc t.c -lm -UDEBUG //不定义
用来交换变量的宏,do...while的经典应用,注意两个关键点调试
#define SWAP(a,b) \ do{ \ char tmp; \ tmp = b; \ b = a; \ a = tmp; \ }while(0) //故意不要语法要求的分号 if(j >= 0) SWAP(x, y); else //else前面本来是不该该有分号的 print("error\n");