亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

??
?? ??? ??? ??? ?????? " >?? ??? ??? ??? ??????
?? ??? ???? ??? ?????? " >?? ??? ???? ??? ??????
動態(tài)鏈接的方式" >動態(tài)鏈接的方式
延遲綁定技術(shù)" >延遲綁定技術(shù)
顯式運(yùn)行時鏈接" >顯式運(yùn)行時鏈接
總結(jié)" >總結(jié)
? ??? ???? ??? Linux?? ?? ??? ?? ??? ?? ??? ??????

Linux?? ?? ??? ?? ??? ?? ??? ??????

Feb 05, 2024 pm 05:45 PM
linux ??? ???? ??? ??? ?? ?? ??? ?? ? ???? ??????? ???? ??? ???? ??? ??

?? ??? ?? ?? ? ?? ??? ??????.

  • ? ?? ?????
  • ?? ??? ???? ??? ??????
  • ?? ??? ?? ???? ??????
  • ?? ??? ???? ??????
  • ????? ???? ?? ??? ??? ???? ??? ??????

?? ??? ??? ??? ??????

?? ??? ??? ?? ??? ? ?? ??? ???? ?? ????.

  1. ??? ? ??? ?? ??: ?? ??? ??
Linux 動態(tài)鏈接與靜態(tài)鏈接原來是這么回事?

Program1? Program2?? ?? Program1.o? Program2.o?? ? ?? ??? ???? ??? ? ? Lib.o ??? ?????. ?? ??? ?? ? ?? ?? ?? Lib.o ??? ????? ??? ?? ??? ???? Program1 ? Program2 ?? ??? ???? ??? ??? ? Lib.o?? ? ?? ???? ????. ???? ???? ??? ?, ???? Lib.o? ??? ?? ????? ?? ?? ??? ??? ?? ??? ?????.

  1. ?? ??? ???? ???? ?? ? ???? ?? ???????

??? 20? ??? ???? ?? 20? ?? ? ??? ?????? ? ? ?? ??? ??? ?? ??? ?????? ?? ????? ????? ??? ? ????. ?? ? ????? ?? ???? ????? ?? ??? ???? ?? ????? ?? ????? ?????? ?? ?? ??? ? ????. .

?? ??? ??? ???? ?? ?? ??? ???????. ?? ??? ??? ??? ??? ????.

Linux 動態(tài)鏈接與靜態(tài)鏈接原來是這么回事?

?? ????? ??? ?? ?? ??? ?????. ? ?? ?? ??? ???? ???? ???? ??? ??? ???? ???? ????. ??? ??? ???? ?? ??? ???? ????. ????? ?? ??? ????? ????? ?? ?? ?? ??? ???? ??? ??? ?? ????? ?????. ?? ?? ??? ???? ?? ???? ?? ? ??? ?? ????? ? ????? ??? ???? ?? ??? ????? ???? ?????? ? ?????.

?? ??? ???? ??? ??????

?? ??? ???:

???

??? ? ?? ??? ??? ????.

???

-fPIC, -shared? ?? ???? ?????? ??? ?, ?? ??? ????? ???? ????? ???? ? ????.

readelf ??? ?? ?? ?? ?????? ???? ??? ? ? ????.

???

?? ?? ??? ?? ??? 0?? ???? ?? ? ? ????. 0? ??? ???? ????? ??? ? ???? ??? ???? ??????.

???? ??:

???

?? ??? ???? ?????:

~/test$?./test?&
[1]?126
~/test$?func?1
cat?/proc/126/maps
7ff2c59f0000-7ff2c5bd7000?r-xp?00000000?00:00?516391?????????????/lib/x86_64-linux-gnu/libc-2.27.so
7ff2c5bd7000-7ff2c5be0000?---p?001e7000?00:00?516391?????????????/lib/x86_64-linux-gnu/libc-2.27.so
7ff2c5be0000-7ff2c5dd7000?---p?000001f0?00:00?516391?????????????/lib/x86_64-linux-gnu/libc-2.27.so
7ff2c5dd7000-7ff2c5ddb000?r--p?001e7000?00:00?516391?????????????/lib/x86_64-linux-gnu/libc-2.27.so
7ff2c5ddb000-7ff2c5ddd000?rw-p?001eb000?00:00?516391?????????????/lib/x86_64-linux-gnu/libc-2.27.so
7ff2c5ddd000-7ff2c5de1000?rw-p?00000000?00:00?0
7ff2c5df0000-7ff2c5df1000?r-xp?00000000?00:00?189022?????????????/mnt/d/wzq/wzq/util/test/lib.so
7ff2c5df1000-7ff2c5df2000?---p?00001000?00:00?189022?????????????/mnt/d/wzq/wzq/util/test/lib.so
7ff2c5df2000-7ff2c5ff0000?---p?00000002?00:00?189022?????????????/mnt/d/wzq/wzq/util/test/lib.so
7ff2c5ff0000-7ff2c5ff1000?r--p?00000000?00:00?189022?????????????/mnt/d/wzq/wzq/util/test/lib.so
7ff2c5ff1000-7ff2c5ff2000?rw-p?00001000?00:00?189022?????????????/mnt/d/wzq/wzq/util/test/lib.so
7ff2c6000000-7ff2c6026000?r-xp?00000000?00:00?516353?????????????/lib/x86_64-linux-gnu/ld-2.27.so
7ff2c6026000-7ff2c6027000?r-xp?00026000?00:00?516353?????????????/lib/x86_64-linux-gnu/ld-2.27.so
7ff2c6227000-7ff2c6228000?r--p?00027000?00:00?516353?????????????/lib/x86_64-linux-gnu/ld-2.27.so
7ff2c6228000-7ff2c6229000?rw-p?00028000?00:00?516353?????????????/lib/x86_64-linux-gnu/ld-2.27.so
7ff2c6229000-7ff2c622a000?rw-p?00000000?00:00?0
7ff2c62e0000-7ff2c62e3000?rw-p?00000000?00:00?0
7ff2c62f0000-7ff2c62f2000?rw-p?00000000?00:00?0
7ff2c6400000-7ff2c6401000?r-xp?00000000?00:00?189023?????????????/mnt/d/wzq/wzq/util/test/test
7ff2c6600000-7ff2c6601000?r--p?00000000?00:00?189023?????????????/mnt/d/wzq/wzq/util/test/test
7ff2c6601000-7ff2c6602000?rw-p?00001000?00:00?189023?????????????/mnt/d/wzq/wzq/util/test/test
7fffee96f000-7fffee990000?rw-p?00000000?00:00?0?????????????????[heap]
7ffff6417000-7ffff6c17000?rw-p?00000000?00:00?0?????????????????[stack]
7ffff729d000-7ffff729e000?r-xp?00000000?00:00?0?????????????????[vdso]

可以看到,整個進(jìn)程虛擬地址空間中,多出了幾個文件的映射,lib.so和test一樣,它們都是被操作系統(tǒng)用同樣的方法映射到進(jìn)程的虛擬地址空間,只是它們占據(jù)的虛擬地址和長度不同.

從maps里可以看見里面還有l(wèi)ibc-2.27.so,這是C語言運(yùn)行庫,還有一個ld-2.27.so,這是Linux下的動態(tài)鏈接器,動態(tài)鏈接器和普通共享對象一樣被映射到進(jìn)程的地址空間,在系統(tǒng)開始運(yùn)行test前,會先把控制權(quán)交給動態(tài)鏈接器,動態(tài)鏈接器完成所有的動態(tài)鏈接工作后會把控制權(quán)交給test,然后執(zhí)行test程序。

當(dāng)鏈接器將Program.o鏈接成可執(zhí)行文件時,這時候鏈接器必須確定目標(biāo)文件中所引用的func函數(shù)的性質(zhì),如果是一個定義于其它靜態(tài)目標(biāo)文件中的函數(shù),那么鏈接器將會按照靜態(tài)鏈接的規(guī)則,將Program.o的func函數(shù)地址進(jìn)行重定位,如果func是一個定義在某個動態(tài)鏈接共享對象中的函數(shù),那么鏈接器將會將這個符號的引用標(biāo)記為一個動態(tài)鏈接的符號,不對它進(jìn)行地址重定位,將這個過程留在裝載時再進(jìn)行。

動態(tài)鏈接的方式

動態(tài)鏈接有兩種方式:裝載時重定位和地址無關(guān)代碼技術(shù)。

裝載時重定位:

在鏈接時對所有絕對地址的引用不作重定位,而把這一步推遲到裝載時完成,也叫基址重置,每個指令和數(shù)據(jù)相當(dāng)于模塊裝載地址是固定的,系統(tǒng)會分配足夠大的空間給裝載模塊,當(dāng)裝載地址確定后,那指令和數(shù)據(jù)地址自然也就確定了。

然而動態(tài)鏈接模塊被裝載映射到虛擬空間,指令被重定位后對于每個進(jìn)程來講是不同的,沒有辦法做到同一份指令被多個進(jìn)程共享,所以指令對不同的進(jìn)程來說有不同的副本,還是空間浪費,怎么解決這個問題?使用fPIC方法。

地址無關(guān)代碼:

指令部分無法在多個進(jìn)程之間共享,不能節(jié)省內(nèi)存,所以引入了地址無關(guān)代碼的技術(shù)。我們平時編程過程中可能都見過-fPIC的編譯選項,這個就代表使用了地址無關(guān)代碼技術(shù)來實現(xiàn)真正的動態(tài)鏈接。

基本思想就是使用GOT(全局偏移表),這是一個指向變量或函數(shù)地址的指針數(shù)組,當(dāng)指令要訪問變量或者調(diào)用函數(shù)時,會去GOT中找到相應(yīng)的地址進(jìn)行間接跳轉(zhuǎn)訪問,每個變量或函數(shù)都對應(yīng)一個地址,鏈接器在裝載模塊的時候會查找每個變量和函數(shù)的地址,然后填充GOT中的各個項,確保每個指針指向的地址正確。GOT放在數(shù)據(jù)段,所以它可以在模塊裝載時被修改,并且每個進(jìn)程都可以有獨立的副本,相互不受影響。

tips

?

-fpic和-fPIC的區(qū)別:它們都是地址無關(guān)代碼技術(shù),-fpic產(chǎn)生的代碼相對較小較快,但是在某些平臺會有些限制,所以大多數(shù)情況下都是用-fPIC來產(chǎn)生地址無關(guān)代碼。

?

-fPIC和-fPIE的區(qū)別:一個作用于共享對象,一個作用于可執(zhí)行文件,一個以地址無關(guān)方式編譯的可執(zhí)行文件被稱作地址無關(guān)可執(zhí)行文件。

?

-fpie和-fPIE的區(qū)別:類似于-fpic和-fPIC的區(qū)別

延遲綁定技術(shù)

在程序剛啟動時動態(tài)鏈接器會尋找并裝載所需要的共享對象,然后進(jìn)行符號地址尋址重定位等工作,這些工作會減慢程序的啟動速度,如果解決?

使用PLT延遲綁定技術(shù),這里會單獨有一個叫.PLT的段,ELF將 GOT拆分成兩個表.GOT和.GOT.PLT,其中.GOT用來保存全局變量的引用地址,.GOT.PLT用來保存外部函數(shù)的地址,每個外部函數(shù)在PLT中都有一個對應(yīng)項,在初始化時不會綁定,而是在函數(shù)第一次被用到時才進(jìn)行綁定,將函數(shù)真實地址與對應(yīng)表項進(jìn)行綁定,之后就可以進(jìn)行間接跳轉(zhuǎn)。

顯式運(yùn)行時鏈接

支持動態(tài)鏈接的系統(tǒng)往往都支持顯式運(yùn)行時鏈接,也叫運(yùn)行時加載,讓程序自己在運(yùn)行時控制加載的模塊,在需要時加載需要的模塊,在不需要時將其卸載。這種運(yùn)行時加載方式使得程序的模塊組織變得很靈活,可以用來實現(xiàn)一些諸如插件、驅(qū)動等功能。

通過這四個API可以進(jìn)行顯式運(yùn)行時鏈接:

dlopen():打開動態(tài)鏈接庫
dlsym():查找符號
dlerror():錯誤處理
dlclose():關(guān)閉動態(tài)鏈接庫

參考這段使用代碼:

#include?
#include?

int?main()?{
???
???void?*handle;
???void?(*f)(int);
???char?*error;

???handle?=?dlopen("./lib.so",?RTLD_NOW);
???if?(handle?==?NULL)?{
???????printf("handle?null?\n");
???????return?-1;
??}
???f?=?dlsym(handle,?"func");
???do?{
???????if?((error?=?dlerror())?!=?NULL)?{
???????????printf("error\n");
???????????break;
??????}
???????f(100);
??}?while?(0);
???dlclose(handle);

???return?0;
}

編譯運(yùn)行:

$?gcc?-o?test?program.c?-ldl
$?./test
func?100

總結(jié)

為什么要進(jìn)行動態(tài)鏈接?為了解決靜態(tài)鏈接浪費空間和更新困難的缺點。

動態(tài)鏈接的方式??? ?? ??? ? ?? ??? ?? ??.

地址無關(guān)代碼技術(shù)原理?GOT ??? ?? ?? ??.

延遲加載技術(shù)原理? ?? ?? ??? ?? PLT ????? ?? ?? ??? ? ?? ??? ?????.

如果進(jìn)行顯式運(yùn)行時鏈接? ?? ??? ?? 4?? ??? ?? ??? ?? ????.

? ??? Linux?? ?? ??? ?? ??? ?? ??? ??????? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? ????? ??
? ?? ??? ????? ???? ??? ??????, ???? ?????? ????. ? ???? ?? ???? ?? ??? ?? ????. ???? ??? ???? ???? ??? ?? admin@php.cn?? ?????.

? AI ??

Undresser.AI Undress

Undresser.AI Undress

???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover

AI Clothes Remover

???? ?? ???? ??? AI ?????.

Video Face Swap

Video Face Swap

??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

???

??? ??

???++7.3.1

???++7.3.1

???? ?? ?? ?? ???

SublimeText3 ??? ??

SublimeText3 ??? ??

??? ??, ???? ?? ????.

???? 13.0.1 ???

???? 13.0.1 ???

??? PHP ?? ?? ??

???? CS6

???? CS6

??? ? ?? ??

SublimeText3 Mac ??

SublimeText3 Mac ??

? ??? ?? ?? ?????(SublimeText3)

???

??? ??

??? ????
1597
29
PHP ????
1488
72
???
Windows (?? ??)? ?? Linux? ???? ??? ?????? Windows (?? ??)? ?? Linux? ???? ??? ?????? Jun 18, 2025 am 12:19 AM

Linux ? Windows? ?? ???? ???? ??? ?? ? ?? ?????. 1. ???? ???? ???? ?? ???? ???? ??? ??? ?? ?????. 2. Ventoy ?? Rufus? ???? Linux Boot USB ???? ??? Ubuntu? ??????. 3. ?? ?? "?? ???? ??"?? ???? ?????? ( /?? 20GB, ? ?? ??, ?? ?? ??); 4. ???? ??? ???? ?? ???? ??? ??????. 5. ?? ? Grub Boot ??? ???? ??? Boot-Repair? ???? ??? ????? BIOS ?? ???? ??? ? ????. ??? ???? ??? ???? ???? ? ?? ????? ???? ????.

Linux ???? Redis? ???? ??? ?????? Linux ???? Redis? ???? ??? ?????? Jun 11, 2025 am 12:11 AM

toinstallredisonalinuxsystem, followthesesteps : 1) download andextradisffromtheofficialgithubrepository, 2) 'make'command, 3) sulestediswith'sudomakeInstall', 4) sopgeriereredisbycopyingteconpigtile, and5) StarteSin

Epel (Enterprise Linux ? ?? ???) ?????? ????? ??? ?????? Epel (Enterprise Linux ? ?? ???) ?????? ????? ??? ?????? Jun 17, 2025 am 09:15 AM

Epel ?????? ????? ?? ??? ??? ?? ??? ?? ??? ???? ????. ?? ??? ?? ? ??? ???? ?? Cat/etc/os ???? ???? ??? ????. ??, Centos/Rockylinux?? dnfinstallepel reelease? ?? Epel? ????? 8 ? 9 ?? ??? ?????. ??, ?? ??? .repo ??? ???? ?????? RHEL? ???????. ??, ??? ??? ? GPG ?? ?? ??? ? ????. ?? ??? ???? ?? ? ??? Epel-Next? ???? ??? ???? ?? ?? ??? ?? ????. ?? ??? ?? ? ? dnfrepolist? ???? Epel ???? ????? ?????? ??????.

?????? Linux ???? ???? ??? ?????? ?????? Linux ???? ???? ??? ?????? Jun 19, 2025 am 12:09 AM

??? ???? Linux ??? ??? ? ?? ?? ?? ??? ????????. 1. ?? ???? ?? Ubuntu ?? Linuxmint? ??????. ????? ? ??? Manjaro ?? Fedora? ?????. ??? ??? Lubuntu ? ?? ?? ???? ??????. ?? ??? ???? Centostream ?? Debian? ?????. 2. ?? ?? ???? ???? ?????. ??? ??? ????? Arch ?? Manjaro? ??? ? ????. 3. ???? ?? ???? Ubuntu? Linuxmint? ??? ???? ?? ??? ????? ??????. 4. ?? ??? ???? Ubuntu? Linuxmint? ??? ???? ??? ???? ????? ????? ?????. ?? ??? ?? ???? ?? ????.

Linux? ? ???? ???? ?? Linux? ? ???? ???? ?? Jun 27, 2025 am 12:15 AM

Linux ???? ? ?? ???? ???? ??? ??? ????. 1. ?? ???? ???? LSBLK ?? FDISK-L? ???? ??????. 2. fdisk/dev/sdb? ?? fdisk ?? ?? ? ???? ???? ?? ? ??; 3. mkfs.ext4/dev/sdb1? ?? ?? ?????? ??? ??; 4. MOUNT/DEV/SDB1/MNT/DATA? ?? ?? ???? MOUND ??? ??????. 5. ????? ?? ???? ????? /etc /fstab? ???? ?? ???? ????? ???? ?????. ???? ?? ??? ??? ?? ?? ?? ??? ??? ??????.

Linux?? ??? ??? ??? ????? Linux?? ??? ??? ??? ????? Jun 24, 2025 am 12:15 AM

Linux ???? ??? ????? /var /log ????? ???? Syslog ?? ??? (??? ??? ??), Auth.log (??? ?? ???), Kern.log (??? ?? ???), dpkg.log ?? yum.log (??? ??? ??), boot.log (??? ?? ??)? ?? ??? ?? ?? ??? ???? ????. ?? ???? CAT, Tail-F ?? JournalCTL ??? ?? ? ? ????. ?? ???? ??? ?? Apache? Apache2 ?? HTTPD ????, MySQL ?? ?? ?? ?? /var /log? ?? ????? ?????. ??? ?? ??? ????? s? ????? ?? ???????.

Windows Google Chrome?? ?? ??? ??? ??????. Windows Google Chrome?? ?? ??? ??? ??????. Jul 08, 2025 pm 02:33 PM

Chrome? ??? ????? ? ??? ????? ??? ???? ?? ? ????. ??? ???? ????? ?? ????? ??? ?? ?? ???? ??? ??? ??? ???? ??? ?? ??? ????? ?????. ??? ?? ???? Windows PC? Chrome?? ?? ???? ?? ??? ? ????. ???? ????? ??? ????? ?? ?? Windows Google Chrome?? ??? ??? ? ??? ?? ??? ?? ? ?? ?? ????. 1. ?? ?? ?? ?? ?? ??? ?? Universal Repair?? ???? ??? ?? ? ?? ???? ??? ?? ?? ?? ????. ??? ?? ?? ?? : ??? ??

Sudo ??? ???? ?? ???????? Sudo ??? ???? ?? ???????? Jul 02, 2025 am 12:20 AM

Sudo? "CrustuserSerdo"?? "SuperUserdo"? ??? ????? ???? ?? ???? ???? ??? ??? ? ???? (????? ??). ?? ??? ??? ????. 1. ????? ?? ?? ??? ?? ??? ?? ??? ?? ?? ??; 2. ?? ? ???? ?? ??? ???; 3. Nginx ???? ?? ??? ??; 4. /etc /hosts? ?? ??? ??? ??????. ? ???? ??? ? ???? /etc /sudoers ??? ???? ??? ????? ???? ??? ????? ????? ??? ???? ?? ?? ??? ?????. ?? ???? ??? ?????. ??? ???? ???? ??? ????? ???? ?? Sudoers ??? Visudo? ???? ???? ??? ??????.

See all articles