無法定位程序輸入點到_ftol2於動態鏈接庫msvcrt.dll的錯誤的解決


作者:朱金燦

來源:http://blog.csdn.net/clever101

 

           今天同事在Windows XP系統上運行程序遇到這樣一個錯誤:


       我試了一下,在Win7上運行則沒有這個錯誤。只是程序運行出錯,代碼編譯是沒有問題的。初步分析了一下,大致明白了問題了根源。問題的根源在於程序的exe或者其底層庫鏈接了一個錯誤的msvcrt.dll。其實微軟提供的VC運行時庫是有很多版本的。為什么需要這么多的運行時庫?原因很多,主要有下面兩個:一是為了不同的處理器廠商和硬件架構,比如amd和intel,比如x86和x64等等;二是為了適配不同VS版本,比如VS2003、VS2005、VS2008等等,即使同是VS2008,VS2008和VS2008+sp1的運行時庫都是不一樣的。因此msvcrt.dll在xp系統和win7系統都是不一樣的,具體到這個錯誤是_ftol2函數在xp系統和win7系統所處的函數地址是不一樣的。


      如上所述,要解決這個錯誤就必須找到到底哪個底層庫鏈接了錯誤的msvcrt.dll。這次我采用的一個笨辦法是使用depends打開exe程序,然后一個個地查找其依賴庫,最后找到一個opengl32.dll,其視圖如下:

       從上圖可以看出opengl32.dll所依賴的msvcrt.dll呈現紅色警告,可以看出opengl32.dll所鏈接的msvcrt.dll並不對。后來我檢查了一下,exe所在目錄下有opengl32.dll,把它刪掉后程序所用的應該是操作系統目錄下的opengl32.dll,這樣程序能順利啟動了。

 

       單純靠depends打開exe程序分析它的依賴庫是否存在錯誤鏈接的問題這種做法效率無疑有點低,特點是當一個程序的依賴庫特別多的時候。我想到的一個可以提高效率的做法是寫一個程序通過獲取exe的依賴庫表,然后逐個進行動態加載(即調用LoadLibrary函數),一旦加載時出現無法定位程序輸入點的錯誤,即可判斷該庫存在鏈接的錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM