c、linux學習筆記

linux命令

統計相關

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

C語言知識

代碼段和數據段

局部變量的數據分配在棧上,且賦值操做會被解析成指令;全局變量分配在數據區,賦初值的等號至關於冒號,並不解析成指令。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");
相關文章
相關標籤/搜索