1. 程式人生 > >分析cygwin下報“無法定位程式輸入點”的錯誤

分析cygwin下報“無法定位程式輸入點”的錯誤

現象:     之前網上下了一個cygwin的本地安裝版本,裝了一些常用的命令列工具集。結果執行最為常用的ls命令時總是報如下的錯誤:“無法定位程式輸入點 strtoumax 於動態連結庫 cygwin1.dll 上”。地球人都知道,unix下不能使用ls命令,塵世間最痛苦的事莫過於此啦~ 原因:     在網上搜了一下,看到關於cygwin的介紹:     “cygwin的工作機制:cygnus當初首先把gcc,gdb,gas等開發工具進行了改進,使他們能夠生成並解釋win32的目標檔案。然後,他們要把這些工具移植到windows平臺上去。一種方案是基於win32 api對這些工具的原始碼進行大幅修改,這樣做顯然需要大量工作。因此,他們採取了一種不同的方法——他們寫了一個共享庫(就是cygwin dll),把win32 api中沒有的unix風格的呼叫(如fork,spawn,signals,select,sockets等)封裝在裡面,也就是說,他們基於 win32 api寫了一個unix系統庫的模擬層。這樣,只要把這些工具的原始碼和這個共享庫連線到一起,就可以使用unix主機上的交*編譯器來生成可以在 windows平臺上執行的
工具集。以這些移植到windows平臺上的開發工具為基礎,cygnus又逐步把其他的工具(幾乎不需要對原始碼進行修改,只需要修改他們的配置指令碼)軟體移植到windows上來。這樣,在windows平臺上執行bash和開發工具、使用者工具,感覺好像在unix上工作。”     從上面的文字瞭解到,前面報錯的動態連結庫cygwin1.dll實質就是一個作業系統的介面適配層,所報的錯誤應該是在該庫中沒有找到被ls命令呼叫的介面函式strtoumax。因此,造成該錯誤的原因極有可能是該動態庫版本與所用的ls命令不匹配。 解決:

    分析出原因,解決的方法就再簡單不過啦。從網上下載新的cygwin1.dll。和本地安裝的比較一下檔案版本號:原來的版本號是1005.15.0.0,新下載的版本號是1005.18.0.0。再用Dependency Walker看一下新下載的dll匯出的介面,果然有strtoumax。使用新dll替換原來bin目錄下的dll,問題就解決啦^_^

原文地址:http://blog.sina.com.cn/s/blog_4c31626a010008rn.html