動態鏈接庫(dll)可以是早綁定嗎?


     我知道dll並沒有被編譯到應用程序中,它只是在該應用程序要使用它時才加載進內存中;
     我還知道,早綁定是在編譯時就確定了調用函數的位置,晚綁定是程序在運行時根據一些特殊的機制計算出來要調用函數的位置;
     根據這兩點,我猜測,是不是因為dll是運行時才被加載至內存中這個原因,才決定dll肯定是晚綁定呢?
或者說,在程序鏈接時,就固定好了dll的位置,因此dll也可以是早綁定呢?

    還請哪位大俠給普及一下這方面的知識,先謝了。

7 个解决方案

#1


OS在加載EXE時,會根據import表來裝載所需的DLL,就是你所說的早綁定,應該叫靜態綁定。dll肯定是運行時才載入的。通過loadlibrary來加載稱為動態綁定,一般用在沒有lib的情況,還有延遲綁定,其實也是差不多的機制

#2


《程序員的自我修養——鏈接、裝載與庫》
《深度探索C++對象模型》
《C++反匯編與逆向分析技術揭秘》

#3


引用 2 樓 zhao4zhong1 的回復:
《程序員的自我修養——鏈接、裝載與庫》
《深度探索C++對象模型》
《C++反匯編與逆向分析技術揭秘》

吾僅問一是與非的問題,莫非您要激西江之水以迎吾?

#4


如果通過 lib 來鏈接 dll 的,dll 中函數的調用是通過輸入表 IAT 由操作系統在加載 exe 的時候計算出來的,如果是手動 LoadLibrary/GetProcAddress 來調用的話,函數地址是你調用 GetProcAddress 時放到你自己程序中的變量里面來進行訪問的。 無論哪種情況,都沒有在編譯期確定函數地址的,都屬於你說的晚綁定。

#5


引用 4 樓 adlay 的回復:
如果通過 lib 來鏈接 dll 的,dll 中函數的調用是通過輸入表 IAT 由操作系統在加載 exe 的時候計算出來的,如果是手動 LoadLibrary/GetProcAddress 來調用的話,函數地址是你調用 GetProcAddress 時放到你自己程序中的變量里面來進行訪問的。 無論哪種情況,都沒有在編譯期確定函數地址的,都屬於你說的晚綁定。

也就是說,動態鏈接庫的機制只有晚綁定?

#6


從設計目的來說,lib就是為了在編譯期綁定,dll就是為了在運行時綁定,不會有你所謂的早綁定的情況

#7


引用 3 樓 painie8000 的回復:
Quote: 引用 2 樓 zhao4zhong1 的回復:

《程序員的自我修養——鏈接、裝載與庫》
《深度探索C++對象模型》
《C++反匯編與逆向分析技術揭秘》

吾僅問一是與非的問題,莫非您要激西江之水以迎吾?


你一句話就像一大盆冰水 把人家從頭澆到尾。。。。。。。。。。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com