gcc 編譯 鏈結原理

2021-10-10 07:58:49 字數 2842 閱讀 2243

!!!

使用 ld-linux.so.* 作為直譯器,是寫在二進位制檔案中的,比如上面編譯好的 demo 中。另外的,2) 其它庫的查詢和載入,則是 ld-linux.so.* 完成的。

ldd 《可執行檔名》 檢視可執行檔案鏈結了哪些 系統動態鏈結庫

strip 《可執行檔名》 去除符號表可以給可執行檔案**

ldconfig 命令的用途,主要是在預設搜尋目錄(/lib和/usr/lib)以及動態庫配置檔案/etc/ld.so.conf內所列的目錄下,搜尋出可共享的動態鏈結庫(格式如前介紹,lib*.so*),進而建立出動態裝入程式(ld.so)所需的連線和快取檔案.快取檔案預設為 /etc/ld.so.cache,此檔案儲存已排好序的動態鏈結庫名字列表.

ldconfig通常在系統啟動時執行,而當使用者安裝了乙個新的動態鏈結庫時,就需要手工執行這個命令.

vi /etc/ld.so.conf

首先ldd不是乙個可執行程式,而只是乙個shell指令碼.

ldd顯示可執行模組的dependency的工作原理,其實質是通過ld-linux.so(elf動態庫的裝載器)來實現的。我們知道,ld-linux.so模組會先於executable模組程式工作,並獲得控制權,因此當上述的那些環境變數被設定時,ld-linux.so選擇了顯示可執行模組的dependency。

實際上可以直接執行ld-linux.so模組,如:/lib/ld-linux.so.2 --list program(這相當於ldd program)ldd命令使用方法(摘自ldd --help)

**ld

linux下有兩個很好用的實用程式:

ldd:用於檢視共享庫依賴資訊

ldconfig:用於配置動態鏈結器的執行時繫結

還有兩個linux下非常重要的動態鏈結器/載入器:

ld.so

ld-linux.so*

以及gnu的鏈結器:

ld:這個就是將一堆的目標檔案通過符號表鏈結成最終的程式,可以參考上面推薦的另一篇文章**

在linux中, strip也有**服的含義, 具體就是從特定檔案中剝掉一些符號資訊和除錯資訊。

[taoge@localhost learn_strip]$ file a.out

a.out: elf 32-bit lsb executable, intel 80386, version 1 (gnu/linux), dynamically linked (uses shared libs), for gnu/linux 2.6.18, not stripped

劉超的通俗雲計算

su是申請切換root使用者,需要申請root使用者密碼。有些linux發行版,例如ubuntu,預設沒有設定root使用者的密碼,所以需要我們先使用sudo passwd root設定root使用者密碼。

而sudo是當前使用者暫時申請root許可權,所以輸入的不是root使用者密碼,而是當前使用者的密碼。sudo是使用者申請管理員許可權執行乙個操作,而此處的操作就是變成管理員。

編譯鏈結最終會生成各種目標檔案:

可重定位目標檔案(.o、.a)

可執行檔案

共享目標檔案(.so)

核心轉儲檔案(core dump)

// 設計模式 top 5

單例。寫過訊息佇列、執行緒池、日誌物件、配置檔案物件。

標準庫中用到的設計模式有iterator,adapter.stack,queue,priority_queue用到了adapter模式,把底層容器的介面轉換為資料結構的介面。

gui->組合模式

資料結構遍歷->迭代器

訊息機制->觀察者模式

資源管理->單例模式

singleton,最經常幹的事是把相關的全域性變數包在一起

factory,業務流程和測試流程構造不同的例項

最常用的

單例觀察者

責任鏈次一點的

工廠裝飾器

介面卡等

、、、、、、、、、、、、、、、

詳解 gcc 編譯、構建原理

編譯目標檔案(.o)

靜態庫(.a)

共享庫(.so)

動態鏈結

動態載入

鏈結ld:gnu 的鏈結器,將一堆目標檔案通過符號表鏈結成最終的可執行檔案

ldconfig:在預設搜尋目錄(/lib和/usr/lib)以及動態庫配置檔案/etc/ld.so.conf內所列的目錄下,搜尋出動態鏈結庫(lib*.so*),進而建立出動態引導程式(ld.so)所需的鏈結和快取檔案。快取檔案預設為 /etc/ld.so.cache,此檔案儲存已排好序的動態鏈結庫名字列表.

更新快取使新新增的庫生效,當然系統啟動時會自動執行ldconfig。

ld.so:其他庫的查詢和載入,由ld.so完成。

執行ld-linux.so:作為直譯器,寫在elf檔案中,ld-linux.so 先於 main 函式工作,查詢主程式所依賴的共享庫。實際上可以直接執行ld-linux.so.

ldd:不是乙個可執行程式,只是乙個 shell 指令碼(直譯器:解釋具有良好的動態特性和可移植性,比如在解釋執行時可以動態改變變數的型別、對程式進行修改以及在程式中插入良好的除錯診斷資訊等,而將直譯器移植到不同的系統上,則程式不用改動就可以在移植了直譯器的系統上執行。同時直譯器也有很大的缺點,比如執行效率低,占用空間大,因為不僅要給使用者程式分配空間,直譯器本身也占用了寶貴的系統資源。),可以用它來檢視共享庫所依賴的資訊

再談動態鏈結和動態載入的區別

動態載入和動態鏈結都是在程式執行時發生,並將所需**載入到記憶體。

關鍵區別是動態載入由人工指定(**中的dlopen),而動態鏈結直接把共享庫的**拷貝到記憶體。

動態鏈結需要 os 的特殊支援,通過動態鏈結載入的庫**可以在各個程序之間共享。而對動態載入而言,可以在各自程序中開啟共享庫**。

gcc編譯原理

引言 gcc現在的意思是 gun編譯器集合 這裡說的是上個世紀的意思 gun c語言編譯器 2.1程式的一般編譯過程 以gcc為例 一般情況下,比如我們有乙個原始檔 main.c,裡面寫的是我們的 想執行以下,gcc main.c,執行以下這個命令就會生成乙個a.out的檔案。然後.a.out就可以...

gcc程式的編譯過程和鏈結原理

1.預處理 處理標頭檔案 預處理就是將要包含 include 的檔案插入原檔案中 將巨集定義展開 根據條件編譯命令選擇要使用的 最後將這些 輸出到乙個 i 檔案中等待進一步處理。gcc e o 001.i 001.c2.編譯編譯就是把c c 比如上面的 i 檔案 翻譯 成彙編 gcc s o 001...

gcc編譯鏈結多檔案

方法一直接編譯 gcc file1.c file2.c file3.c main.c o out 前提是main.c要include其他檔案的標頭檔案,來避免main檔案中沒有宣告就使用沒定義的函式導致的報錯,如果要寫的挫點,也可以不include標頭檔案,而在main檔案裡手寫那幾個宣告。方法二把...