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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

链接 动态链接 静态链接

發布時間:2024/4/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链接 动态链接 静态链接 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

要想了解底層,鏈接是一個不得不過的一關,我總結了下學習的心得,首先要了解鏈接器到底是如何工作的,鏈接器分為兩類,一個是靜態鏈接,一個是動態鏈接,先來講解靜態鏈接,靜態鏈接要干兩件事:

  • 符號解析 目標文件定義和引用符號 符號解析的目的是將每個符號引用和一個符號定義聯系起來
  • 重定位 編譯器和匯編器生成從地址零開始的代碼和數據節。鏈接器通過把每個符號定義與一個存儲器位置聯系起來,然后修改所有對這些符號的引用,使得它們指向這個存儲器位置,從而重定位這些節。
    靜態鏈接的輸入文件是一系列的目標文件,輸出是可執行的目標文件。這些目標文件都可以統稱為ELF文件:executable and linkable format(可執行和可鏈接格式)。
    從而引入了一個重要的知識點:ELF文件格式。
    首先是可重定位目標文件的ELF文件:從上到下依次是:
  • 可重定位目標文件的ELF文件
    ELF頭部
    .text
    .rodata
    .data
    .bss
    .symtab
    rel.text
    rel.data
    .debug
    .line
    .strtab
    節頭部表

    注意上面的除了節頭部表,其余都可以叫做節,這就是一個很核心的點,節是和鏈接相關的,每一個節經過鏈接會變成段,段對應的是執行相關的,而且段對應的是可執行目標文件的ELF文件,現在就來看看經過靜態鏈接生成的可執行目標文件的ELF文件格式,這里面都是以段作為術語的:

    可執行目標文件的ELF文件
    ELF頭部
    段頭表
    .init
    .text
    .rodata
    .data
    .bss
    .symtab
    .debug
    .line
    .strtab
    節頭表

    隨即這些段就會被加載到存儲器地址中,也就是大名鼎鼎的存儲器結構,包含棧堆,內核等等的結構。
    這就是一個靜態鏈接器如何將一個可重定位文建變成可執行目標文件從而運行到平臺上。
    動態鏈接有是怎么回事呢?
    在了解之前,我們要知道靜態庫,剛才我們所說的都僅僅是將一系列的可重定位目標文件變成一個可執行目標文件,實際上,所有的編譯系統都提供了一種機制,將所有的目標模塊打包成一個單獨的文件,稱為靜態庫,他也可以作為靜態鏈接器的輸入,當鏈接器構造一個輸出文件時,它只需要拷貝靜態庫里被應用程序引用的目標模塊。
    像一些glibc提供的函數,我們可能隨時隨處都會用上,如果我們每次把函數的代碼復制到每個進程的文本段中,這無疑是一種浪費資源,所以出來了共享庫的概念,在運行時,可以加載到任意的存儲器地址,并在存儲器中和一個程序鏈接起來,這個過程就叫做動態鏈接。共享庫也叫共享目標,以.so為結尾,像linux系統提供了dlopen這樣函數去加載和鏈接共享庫。
    其實.symtab這個存放符號的地方也是值得研究的,有機會再記錄。

    總結

    以上是生活随笔為你收集整理的链接 动态链接 静态链接的全部內容,希望文章能夠幫你解決所遇到的問題。

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