linux進階編程day02 筆記

來源:互聯網
上載者:User
brk/sbrk維護一個位置。 brk/sbrk改變這個位置。brk改變絕對位置sbrk改變相對位置 昨天的補充:永遠記住:C的基本類型就那幾種。所有全新類型都是使用typedef重新定義的。類型重定義的好處:1. 維護方便2. 便於移植(每個系統中都用同一個名,不用修改)3. 容易理解 一、 映射虛擬記憶體沒有任何額外維護資料的記憶體配置 mmap/munmap1. 函數說明:
void *mmap(    void *start,  //指定映射的虛擬位址,如果為0,則由系統指定開始位置    size_t length,//指定映射空間的大小。 pagesize的倍數    int prot,     //映射的許可權 PROT_NONE    PROT_READ    PROT_WRITE    PROT_WRITE    PROT_EXEC    int flags,    //映射的方式    int fd,       //檔案描述符號    offset_t off  //檔案中的映射開始位置(必須是0或pagesezi的倍數));
 關於映射的方式flags:記憶體映射:又叫匿名映射,最後兩個參數無效檔案對應:映射到某個檔案只有檔案對應,最後兩個參數才有效MAP_ANONYMOUS:記憶體映射MAP_SHAREDMAP_PRIVATE:二選一,檔案對應 2. 案例:
#include <unistd.h>#include <sys/mman.h>#include <stdlib.h>#include <stdio.h>int main(){    int *p = mmap(        NULL,        getpagesize(),        PROT_READ|PROT_WRITE,        MAP_ANONYMOUS|MAP_SHARED,        0,        0);    *P = 20;    *(p+1) = 30;    *(p+2) = 40;    printf("%d\n", p[2]);  //列印出40    munmap(p, 4096);}
  3. 總結:  選擇什麼樣的記憶體管理方法?  STL  new    malloc小而多的資料  brk/sbrk同類型的大塊資料,動態移動指標  mmap/munmap 控制記憶體的訪問/使用檔案對應/控制記憶體共用 二、編程工具與動態庫1. gcc2. make3. gdb4. 其他工具5. 動態庫(共用庫) 1. gcc-o 輸出檔案名-O-O1-O2-O3//編譯最佳化-g-g1-g2-g3//產生調試資訊-Wallerror//-Wall 顯示所有警告-Werror 將警告當成錯誤提示-w//關閉所有警告-c//只編譯不串連,產生 .o檔案(目標檔案)-E//先行編譯-S//彙編。 產生 .s檔案(彙編檔案) 編譯過程是 -E-c-S自動調用連接器連接器ld -D//在命令列定義宏 (宏可以在代碼中定義,也可以在命令列上定義)-x//指定編譯的語言類型 C, C++, .S(彙編), none(自動判定)-std=c89-std=c99 三、 靜態庫的編譯1. 編譯過程 (*.a) a是achieve的縮寫1.1 編譯成目標檔案-static 可選gcc -c -static 代碼檔案.c1.2 歸檔成靜態庫ar工具 (常用-r -t選項)ar -r 靜態檔案名稱被歸檔的檔案名稱ar -r add.aadd.onm工具(查看函數符號表)nm 靜態庫或動態庫或目標檔案或執行檔案1.3 使用靜態庫gcc 代碼檔案 靜態庫小例子:使用靜態庫完成如下程式輸入一個菱形半徑,列印菱形輸入整型封裝成IOTool菱形列印封裝成Graphic計劃:1. 實現輸入2. 實現菱形3. 編譯靜態庫4. 調用靜態庫
//iotool.c#include <stdio.h>int inputInt(const char *info){    int r;  //傳回值    printf("%s:", info);    scanf("%d", &r);    return r;}
//graphic.c#include <stdio.h>void diamond(int r){    int x, y;    for(y=0; y<=2*r; y++)    {        for(x=0; x<=2*r; x++)        {            if(y == x+r || y == x-r ||y == -x+r || y == -x+3*r)            {                printf("*");            }            else            {                printf(" ");            }        }        printf("\n");    }}

編譯: gcc -c -static iotool.c

gcc -c -static graphic.car -r demo1.a iotool.o graphic.oar -t demo1.anm demo1.a 
//main.cmain(){    int r = inputInt("輸入菱形半徑:");    diamond(r);}

編譯: gcc main.c demo1.a -o main

執行:./main把靜態庫作為代碼的一部分來編譯 總結:1. 什麼是庫?函數等代碼封裝的二進位已經編譯的歸檔檔案2. ar歸檔工具3. 採用庫的方式管理代碼優點:容易組織代碼複用保護代碼著作權4. 靜態庫的“靜態”的含義:編譯好的程式啟動並執行時候不依賴庫庫作為程式的一部分編譯串連5. 靜態庫的本質就是目標檔案的集合(歸檔)6. -static可選 2. 庫的規範與約定庫命名規則:lib庫名.a.主要版本號.副版本號碼.批號一般就寫“lib庫名.a”就行了。ar -r libdemo2.a iotool.o graphic.o庫的使用規則-l庫名-L庫所在的目錄gcc main.c -o main -l demo2 -L. 四、 動態庫的編譯1. 什麼是動態庫(共用庫)動態庫是可以執行的,靜態庫不能執行但動態庫沒有main,不能獨立執行動態庫不會串連成程式的一部分程式執行時,必須需要動態庫檔案2. 工具ldd查看程式需要調用的動態庫ldd只能查看可執行檔(共用庫檔案或elf檔案)readelf -h (-h表示查看執行檔案頭)nm (查看庫中的函數符號)3. 動態庫的編譯3.1編譯-c -f pic(可選) (-f 指定檔案格式pic 位置無關代碼)3.2 串連-shared 編譯:gcc -c -fpic iotool.cgcc -c -fpic graphic.c(非標準)gcc -shared -odemo3.so iotool.o graphic.o(標準)gcc -shared -olibdemo4.so iotool.o graphic.o4. 使用動態庫gcc 代碼檔案名稱 動態庫檔案名稱gcc 代碼檔案名稱 -l庫名 -L動態庫所在的路徑gcc main.c -ldemo4 -L. -o main 標準命名規則:lib庫名.solib庫名.a 問題:4.1 執行程式怎麼載入動態庫?4.2 動態庫沒有作為執行程式的一部分,為什麼串連需要制定動態庫及目錄?因為連接器需要確認函數在動態庫中的位置動態庫的載入:1. 找到動態庫2. 載入動態庫到記憶體(系統實現)3. 映射到使用者的記憶體空間(系統實現)動態庫尋找規則:/lib/user/libLD_LIBRARY_PATH環境變數指定的路徑中找設定當前路徑為環境變數:export LD_LIBRARY_PATH=.:~:..:~Walle緩衝機制:系統把lib:/user/lib:LD_LIBRARY_PATH裡的檔案載入到緩衝/sbin/ldconfig -v 重新整理緩衝so中的搜尋庫的路徑小練習:輸入兩個數,計算兩個數的和。要求:輸入與計算兩個數的和封裝成動態庫調用 五、 使用libdl.so庫動態庫載入原理動態庫中函數的尋找已經封裝成哭libdl.solibdl.so裡面有4個函數:dlopen//開啟一個動態庫dlsym//在開啟的動態庫裡找一個函數dlclose//關閉動態庫dlerror//返回錯誤

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.