【Linux】軟硬鏈接,動靜態庫

目錄

一、認識一下常用指令

1、建立一個軟鏈接

2、建立一個硬鏈接

3、刪除文件的第二種方式:刪除鏈接unlink指令

二、什么是硬鏈接?

三、軟硬鏈接的原理:

四、應用場景

1、建立一個軟鏈接可以快速在一個比較深的路徑中找到目標文件進行執行:

2、觀察現象:

3、硬鏈接使用場景之一:

五、動態庫和靜態庫

1、ldd:查看動態庫鏈接

2、動靜態庫使用過程

靜態庫(.a文件)

動態庫(.so文件)

3、動靜態庫注意事項

4、動靜態庫的制作和使用

(1)?$^:所有依賴項列表

(2)$<:第一個依賴項

5、將.c文件鏈接上動靜態庫

I(大寫i)選項

查看頭文件所在路徑:ls /usr/inlcude/

6、打包/安裝注意事項

7、修改make文件,使動靜態庫都能形成

8、幾個結論

六、理解動態加載

七、簡單談談編址和可執行程序


前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家

點擊跳轉到網站

一、認識一下常用指令

1、建立一個軟鏈接

指令:ln -s [源文件或目錄] [目標軟鏈接]

軟鏈接即上述的link.soft本質上也是個文件,有獨立的inode。

2、建立一個硬鏈接

指令:

ln [源文件] [目標硬鏈接]

我們可以觀察到兩個現象:

(1)硬鏈接的inode和源文件相同:

所以可以知道硬鏈接本質不是一個獨立文件,因為inode和源文件一樣。

(2)我們看一個屬性由數字1變成了數字2。

當我們刪除硬鏈接或者源文件,這個數字又會由2變1:

這個屬性類似于引用計數,我們稱這個屬性叫硬鏈接數

3、刪除文件的第二種方式:刪除鏈接unlink指令

該指令和rm類似:

二、什么是硬鏈接?

由上我們可以知道,硬鏈接不是一個獨立文件,所以創建硬鏈接的過程并沒有創建新文件,硬鏈接類似于引用計數,只是新的文件名,和源文件的inode號有映射關系。

每增加一組映射,inode結構體中存在一個引用計數就會++,也是就是硬鏈接數會++。

注意:

三、軟硬鏈接的原理:

四、應用場景

1、建立一個軟鏈接可以快速在一個比較深的路徑中找到目標文件進行執行:

因為軟鏈接保存的就是目標文件路徑。

2、觀察現象:

當我們創建一個文件夾時,硬鏈接數剛開始默認就是2,為什么吶?

因為創建一個目錄的同時會默認創建兩個文件

.而當前目錄(.)就代表當前目錄test1,所以存在兩個文件名映射同一個inode,所以test1文件的硬鏈接數是2。

3、硬鏈接使用場景之一:

首先認識一個結論:計算一個目錄下有多少個子目錄:目錄硬鏈接數-2

因為每個子目錄都存在一個默認文件(..)代表上級目錄,子目錄的上級目錄就是當前目錄。

因為會造成環路問題,所以系統不允許我們為目錄創建硬鏈接:

但系統可以為目錄創建硬鏈接,比如(.)和(..);

五、動態庫和靜態庫

1、ldd:查看動態庫鏈接

  • 左邊?libc.so.6?是程序編譯、運行時期望找到的動態庫 “邏輯名稱”(可理解為別名 )。
  • 右邊是系統中實際存在的動態庫文件路徑(物理位置),系統會根據這個映射,在程序加載時找到真實的?libc.so.6?去提供功能支持。
  • 并且編譯程序時,默認是進行動態鏈接,如果想要進行靜態鏈接,需要使用選項“-static"?
  • 動態庫后綴:.so
  • 靜態庫后綴:.a
  • 庫的真實名字是去掉前面的lib,去掉后面的后綴(.so/.a)剩下的就是庫真實名字,比如上述的libc.so.6真實名字就是c(c標準庫)。

2、動靜態庫使用過程

靜態庫(.a文件)

  • 編譯時 “拷貝整合”:編譯鏈接階段,鏈接器會把靜態庫中被程序調用的代碼完整復制到可執行文件里。程序運行時,無需再去外部找庫,直接執行內部代碼,省去了 “運行時加載庫” 的開銷,啟動速度更快?。
  • 避免運行時動態開銷:沒有動態加載、符號解析等運行時流程,代碼執行流程更直接,對追求極致啟動速度和獨立運行環境(不依賴外部庫)的場景友好,比如嵌入式設備里,程序可脫離外部依賴快速啟動執行。

動態庫(.so文件)

  • “共享復用” 省資源:多個程序可共享同一份動態庫。系統加載動態庫到內存后,不同程序調用時,復用已加載的庫代碼,減少內存、磁盤重復存儲(一個庫文件給多個程序用,不用每個程序都存一份庫代碼),提升系統整體資源效率。
  • “延遲綁定” 減啟動耗時:借助 PLT(過程鏈接表)和 GOT(全局偏移表)實現延遲綁定?。程序啟動時,不著急解析、綁定所有外部符號(函數 / 變量),第一次調用外部符號時,才去查找地址并記錄到 GOT 。后續調用直接用記錄的地址,避免啟動時 “一次性解析所有符號” 的性能浪費,讓程序啟動更快,尤其適合依賴多、但實際運行不會用到全部符號的復雜程序。

3、動靜態庫注意事項

首先為什么要有庫?

(1)為了提高效率

(2)可以隱藏源代碼

庫的本質就是將所有的.o文件用特定的方式進行打包整合,形成一個大文件,最后得到一堆頭文件和一個庫文件,但這只是簡化后的概念,具體還很復雜。

注意:庫里面不能含有main函數,因為main只能有一個。

4、動靜態庫的制作和使用

(1)gcc的-shared選項:用來打包動態庫:

(2)gcc的-FPIC選項:

讓動態庫能被加載到任意內存地址,多個程序可共享同一份庫代碼(節省內存);避免因庫加載地址沖突導致的鏈接 / 運行錯誤。

(3)make文件常用符號解析:

(1)?$^:所有依賴項列表
  • 含義:表示規則中所有的依賴文件,按書寫順序排列,重復的依賴項會被保留。
  • 示例:若規則為target: file1 file2 file3,則$^等價于file1 file2 file3
(2)$<:第一個依賴項
  • 含義:僅表示依賴項列表中的第一個文件。
  • 示例:上述規則中,$<等價于file1

5、將.c文件鏈接上動靜態庫

# 鏈接動態庫
gcc main.o -L./libs -lmylib -o main  # 生成可執行程序 main# 若鏈接靜態庫(需確保 libs/ 目錄有 libmylib.a)
gcc main.o -L./libs -static -lmylib -o main  # -static 強制靜態鏈接

(1)-L后面接的是庫路徑,-l后面接的是指定庫名

(2)gcc可以默認識別c/c++的庫和系統中的路徑,所以除了-L指定的路徑,gcc還會去系統默認的路徑中查找c/c++庫。

6、發布庫的過程:

I(大寫i)選項

查看頭文件所在路徑:ls /usr/inlcude/

6、打包/安裝注意事項

若直接將動態庫打包過來安裝后用指令編譯,雖然編譯可以通過,但運行時會報錯:(靜態庫是可以的)

原因如下:

四種解決方法:

(1)

(2)認識一個環境變量:$LD_LIBRARY_PATH:

?Linux里的環境變量,專門用于指定動態鏈接庫(.so?文件,類似 Windows 下的?.dll?)的搜索路徑。我們將不在系統默認搜索路徑下的庫路徑添加到該環境變量中即可。

跟PATH一致,當重新登錄時,會恢復到默認路徑。

(3)建立一個軟鏈接

(4)將庫路徑保存到一個配置文件中

注意事項:

7、修改make文件,使動靜態庫都能形成

8、幾個結論

(1)如果我們同時提供動態庫和靜態庫,gcc默認使用的是動態庫;

(2)如果我們非要使用靜態庫,需要使用static選項

(3)

(4)

六、理解動態加載

1、庫默認就是一個磁盤級別的文件,當動態庫加載之后,會被映射到進程地址空間的共享區中。

2、

3、

七、簡單談談編址和可執行程序

八、動態庫加載問題

1、詳細的可執行程序結構

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89221.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VRR(可變刷新率)和QMS(快速媒體切換)

&#x1f527; 一、技術原理的本質區別 技術VRR (可變刷新率)QMS (快速媒體切換)核心目標消除動態幀率波動導致的畫面撕裂/卡頓消除靜態幀率切換時的黑屏中斷工作機制實時調整顯示器刷新率&#xff08;Hz&#xff09;匹配GPU輸出幀率&#xff08;FPS&#xff09;→ 動態延長/縮…

GO 語言學習 之 Map

map 是 Go 語言中非常重要的數據結構&#xff0c;常用于需要快速查找、統計或分組數據的場景。 map定義&#xff1a; package mainimport "fmt"func main() {var m1 map[int]string // 創建一個 mapm2 : make(map[int]string) // 創建一個 map m3…

什么是可觀測性?監控、日志、追蹤三者之間有什么區別?

一、引言&#xff1a;為什么現代系統需要“看得見”&#xff1f; 你是否遇到過這樣的情況&#xff1a;系統運行突然變慢&#xff0c;但沒人知道問題出在哪&#xff1f;隨著微服務、云原生架構的普及&#xff0c;系統的復雜度越來越高&#xff0c;傳統的“靠經驗判斷”已經無法…

扣子(coze)實戰|自動搬運+改寫+歸檔!自媒體矩陣終極方案

今天給大家分享的是用coze做一個工作流來自動提取抖音/小紅書視頻文案及改寫并傳入到飛書多維表格&#xff0c;我們先來看案例 上傳視頻鏈接即可一鍵生成&#xff0c;廢話不多說&#xff0c;上教程~ 一、整體工作流如下&#xff1a; 二、開發思路&#xff1a; 三、詳細工作流分…

K8s環境下基于Nginx WebDAV與TLS/SSL的文件上傳下載部署指南

#作者&#xff1a;閆乾苓 文章目錄 1.問題及背景2.方案說明3.部署步驟3.1 制作TLS/SSL私有證書3.2 創建訪問nginx賬戶密碼文件并創建secret3.3 為TLS/SSL私有證書創建secret3.4 為Nginx 配置文件創建confimap3.5 使用deployment&#xff0c;svc部署nginx3.6 客戶端curl上傳下載…

【Day 7-N17】Python函數(1)——函數定義、位置參數調用函數、關鍵字參數調用函數、函數的默認值

挑戰14天學會Python&#xff0c;第7天學習筆記&#xff01;加油&#xff01; 一、概述 函數&#xff08;Function&#xff09;是 Python 中用于封裝可重用代碼塊的基本結構。通過定義函數&#xff0c;我們可以將復雜邏輯拆分為更小、更易管理的單元&#xff0c;并通過參數傳遞…

STM32 驅動 ADS1015 單端 差分 多通道模式 ADC 轉換

文章目錄 一、ADS1015簡介二、引腳功能三、寄存器介紹1.Conversion Register 轉化數據存放寄存器2.Config Register 配置寄存器 四、IIC時序1.寫寄存器2.讀寄存器 五、程序六、實驗現象1.單端模式2.差分模式3.偽多通道模式 一、ADS1015簡介 ADS1015 是一款由德州儀器&#xff…

RabbitMQ 消費冪等性與消息重放實現

一、冪等性實現 1.1 什么是冪等性&#xff1f; 冪等性是指同一條消息無論被消費多少次&#xff0c;業務結果都只生效一次&#xff0c;防止重復扣款、重復發貨等問題。 RabbitMQ 的投遞模式是“至少一次交付”(at-least-once delivery)&#xff0c;如果消費者處理失敗或者沒有及…

【HarmonyOS 5】鴻蒙TEE(可信執行環境)詳解

【HarmonyOS 5】鴻蒙TEE&#xff08;可信執行環境&#xff09;詳解 一、TEE是什么&#xff1f; 1、TEE的定義&#xff1a; 可信執行環境&#xff08;Trusted Execution Environment&#xff09;&#xff0c;簡稱TEE&#xff0c;是存在于智能手機、平板或任意移動設備主處理器…

算法: 冒泡排序

冒泡排序是一種簡單的排序算法&#xff0c;通過相鄰元素的比較和交換&#xff0c;使較大的元素逐漸"浮"到數組末尾。 時間復雜度:最佳 O(n) | 平均 O(n) | 最差 O(n) 空間復雜度:O(1) 穩定性:穩定 應用場景/前提條件 適用于小規模數據對幾乎已排序的數據效率較高…

基于SpringBoot的家電銷售展示平臺

源碼編號&#xff1a;S567 源碼名稱&#xff1a;基于SpringBoot的家電銷售展示平臺 用戶類型&#xff1a;雙角色&#xff0c;用戶、管理員 數據庫表數量&#xff1a;14 張表 主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 運行環境&#xff1a;Windows/M…

java+vue+SpringBoo智慧旅游系統(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔&#xff08;1萬字以上&#xff09;開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot數據庫&#xff1a;mysql 開發工具 JDK版本&#xff1a;JDK1.…

Docker 入門教程(三):鏡像操作命令

文章目錄 &#x1f433; Docker 入門教程&#xff08;三&#xff09;&#xff1a;鏡像操作命令獲取鏡像&#xff1a;docker pull查看鏡像&#xff1a;docker images刪除鏡像&#xff1a;docker rmi搜索鏡像&#xff1a;docker search鏡像打標簽&#xff1a;docker tag鏡像詳情與…

如何修改discuz文章標題字數限制 修改成255

在 Discuz! X3.5 中&#xff0c;文章&#xff08;主題&#xff09;標題字數的限制可以通過修改數據庫結構以及后臺配置來實現&#xff0c;以下是完整的修改方法&#xff0c;將標題長度限制改為 255 個字符&#xff1a; ? 一、修改數據庫字段長度 Discuz 默認標題字段是 subje…

基于BP神經網絡的26個英文字母識別

本課題旨在設計并實現一個基于BP&#xff08;反向傳播&#xff09;神經網絡的英文字母識別系統&#xff0c;實現對手寫或打印的26個英文字母&#xff08;A-Z&#xff09;的自動分類識別。項目首先對字母圖像進行預處理&#xff08;如灰度化、歸一化、二值化和特征提取&#xff…

系統架構設計師論文分享-論云原生技術的應用

我的軟考歷程 摘要 2023年2月&#xff0c;我所在的公司做了開發紗線MES系統的決定&#xff0c;該系統為國內紗線工廠提供SAAS服務&#xff0c;旨在提高紗線工廠的智能化和數字化水平。我在該項目中被任命為系統架構設計師&#xff0c;全面掌管該項目的架構設計工作。該項目涉…

重置 MySQL root 密碼

引言 在linux可能存在安裝mysql安裝失敗&#xff0c;一直不出現默認密碼 /usr/local/mysql/mysql-8.0.26/bin/mysqld --defaults-file/etc/my.cnf --usermysql --basedir/usr/local/mysql/mysql-8.0.26 --datadir/usr/local/mysql/mysql-8.0.26/data --lower-case-table-name…

面試八股---HTML

面試八股 1、HTML 1.1 src和href的區別 src 用于替換當前元素&#xff0c;href 用于在當前文檔和引用資源之間確立聯系。 核心區別在于 href 關聯的資源&#xff08;主要是 CSS&#xff09;是用于描述頁面外觀的&#xff0c;瀏覽器可以先生成內容再應用樣式&#xff0c;因此…

氣候智能體:AI如何重構人類應對氣候危機的決策體系?

前言 前些天發現了一個巨牛的人工智能免費學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 《氣候智能體&#xff1a;AI如何重構人類應對氣候危機的決策體系&#xff1f;》 展開全景式論述。文章結合2025年最新技術突破與…

UITableView的位置向下偏移, contentInsetAdjustmentBehavior使用詳情

一.contentInsetAdjustmentBehavior 作用: 在iOS 11及以后&#xff0c;蘋果引入了安全區域&#xff08;Safe Area&#xff09;的概念,當UITableView的frame超出了安全區域,系統會自定調整SafeAreaInsets的值,它可以自動調整內容的內邊距&#xff0c;使得內容不會被導航欄遮擋。…