日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gcc命令基本操作

發布時間:2024/3/24 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gcc命令基本操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

gcc命令基本操作

  • Hello基本操作
    • 編譯
    • 匯編
    • 鏈接
    • ELF文件分析
    • 反匯編ELF
  • gcc命令基本操作
    • 簡單編譯
    • 多個程序文件的編譯
  • 總結

Hello基本操作

準備工作

#include <stdio.h> //此程序很簡單,僅僅打印一個 Hello World 的字符串。 int main(void) { printf("Hello World! \n"); return 0; }


預處理基本操作

  • 將所有的#define 刪除,并且展開所有的宏定義,并且處理所有的條件預編 譯指令,比如#if #ifdef #elif #else #endif 等。
  • 處理#include 預編譯指令,將被包含的文件插入到該預編譯指令的位置。
  • 刪除所有注釋“//”和“/* */”。
  • 添加行號和文件標識,以便編譯時產生調試用的行號及編譯錯誤警告行號。
  • 保留所有的#pragma 編譯器指令,后續編譯過程需要使用它們。

    hello.i文件
  • 編譯

    將預處理生成的 hello.i 文件編譯生成匯編程序 hello.s

    匯編

    匯編過程調用對匯編代碼進行處理,生成處理器能識別的指令,保存在后綴為.o 的目標文件中。

    將編譯生成的 hello.s 文件匯編生成目標文件 hello.o
    GCC 的選項-c 使 GCC 在執行完匯編后停止,生成目標文件

    鏈接

  • 靜態鏈接:
    靜態鏈接是指在編譯階段直接把靜態庫加入到可執行文件中去,這樣可執行 文件會比較大。

    text鏈接靜態庫,代碼尺寸變得極大

    沒有鏈接動態庫

  • 動態鏈接:
    動態鏈接則是指鏈接階段僅僅只加入一些描述信息,而程序執行時再從系統 中把相應動態庫加載到內存中去。
    gcc hello.c -o hello


    鏈接了許多其他的動態庫,主要是linux系統glibc 動態庫

  • ELF文件分析

    鏈接器鏈接后生成的最終文件為 ELF 格式可執行文件,一個 ELF 可執行文件通常 被鏈接為不同的段,常見的段譬如.text、.data、.rodata、.bss 等段

    .text:已編譯程序的指令代碼段。
    .rodata:ro 代表 read only,即只讀數據(譬如常數 const)。
    .data:已初始化的 C 程序全局變量和靜態局部變量。
    .bss:未初始化的 C 程序全局變量和靜態局部變量。
    .debug:調試符號表,調試器用此段的信息幫助調試。

    反匯編ELF

    由于 ELF 文件無法被當做普通文本文件打開,如果希望直接查看一個 ELF 文件包 含的指令和數據,需要使用反匯編的方法


    使用 objdump -S 將其反匯編并且將其 C 語言源代碼混合顯示出來:

    gcc命令基本操作

    簡單編譯

  • 預處理:
    gcc -E test.c -o test.i 或 gcc -E test.c
    gcc 的-E 選項,可以讓編譯器在預處理后停止,并輸出預處理結果
  • 編譯為匯編代碼
    gcc -S test.i -o test.s

    gcc 的-S 選項,表示在程序編譯期間,在生成匯編代碼后,停止,-o 輸出匯編代碼文件。
  • 匯編
    gcc -c test.s -o test.o
  • 鏈接
    gcc 連接器是 gas 提供的,負責將程序的目標文件與所需的所有附加的目標文件連接起來,最終生 成可執行文件。附加的目標文件包括靜態連接庫和動態連接庫。
    gcc test.o -o test
  • 多個程序文件的編譯


    gcc -c test1.c -o test1.o
    gcc -c test2.c -o test2.o
    gcc test1.o test2.o -o test

  • 檢錯
    a. gcc -pedantic illcode.c -o illcode
    -pedantic 選項能夠幫助程序員發現一些不符合 ANSI/ISO C 標準的代碼,但不是全部,事實上只有 ANSI/ISO C 語言標準中要求進行編譯器診斷的 那些情況,才有可能被 GCC 發現并提出警告
    b. gcc -Wall illcode.c -o illcode
    使用它能夠使 GCC 產生盡可能多的警告信息
  • 總結

    靜態庫鏈接時搜索路徑順序:

  • ld 會去找 GCC 命令中的參數-L
  • 再找 gcc 的環境變量 LIBRARY_PATH
  • 再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初 compile gcc 時寫在程序內的
  • 動態鏈接時、執行時搜索路徑順序:

  • 編譯目標代碼時指定的動態庫搜索路徑
  • 環境變量 LD_LIBRARY_PATH 指定的動態庫搜索路徑
  • 配置文件/etc/ld.so.conf 中指定的動態庫搜索路徑
  • 默認的動態庫搜索路徑/lib
  • 默認的動態庫搜索路徑/usr/lib
  • 總結

    以上是生活随笔為你收集整理的gcc命令基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。