錯誤“code for hash md5/sha1 was not found,unsupported hash type md5/sha1” 解決方法


錯誤形式:

>>>inport hashlib

ERROR:root:code for hash md5 was not found.

ValueError:unsupported hash type md5

ERROR:root:code for hash sha1 was not found.

ValueError:unsupported hash type sha1

錯誤分析:

使用命令

>>>dir(hashlib)

['__all__', '__builtins__', '__doc__', '__file__', '__get_builtin_constructor', '__name__', '__package__' , 'algorithms', 'new', 'sha224', 'sha256', 'sha384', 'sha512']

會發現里面列出的和正常的相比缺少了

'_hashlib','md5', 'sha1'

使用命令

>>>import _hashlib

ImportError: libssl.so.4: cannot open shared object file: No such file or directory

從hashlib.py的源碼看出,對於hashlib提供的('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')等算法,hashlib的做法是先去檢驗python內置的_hashlib是否支持openssh.

檢查系統是否安裝了openssl

$ openssl version

OpenSSL 1.0.0e 6 Sep 2011

已安裝,但是python編譯時沒發現,通過使用ldd查看動態庫依賴關系

$ export LD_TRACE_LOADED_OBJECTS=1

$ldd _hashlib.so

$ unset LD_TRACE_LOADED_OBJECTS

確實沒有看到有libssl.so.4。

去/usr/lib和/lib下找發現有libssl.so.0.9.8,應該是這個版本的問題了,程序需要的是libssl.so.4. 所以是libssl.so.4動態庫找不到的原因導致hashlib模塊認為使用cx_freeze編譯后的python環境不具備openssl支持,進而使用第三方md5等算法,但此時運行環境中第三方md5等模塊也不具備,所以程序運行時出錯,

解決方案:

為解決這一問題可以手動修改lib庫的軟連接,

ln –s /usr/lib/libssl.so.0.9.8 /lib/libssl.so.4

接下來會發現找不到共享庫文件libcrypto.so.4,同樣,使用命令

ln –s /usr/lib/libcrypto.so.0.9.8 /lib/libcrypto.so.4

即可。

 


 

缺少動態連接庫.so--cannot open shared object file: No such file or directory

這種錯誤總結下來主要有3種方法:
1. 用ln將需要的so文件鏈接到/usr/lib或者/lib這兩個默認的目錄下邊
ln  - / where / you / install / lib /* .so /usr/lib
sudo ldconfig

 

2.修改LD_LIBRARY_PATH

export LD_LIBRARY_PATH = / where / you / install / lib:$LD_LIBRARY_PATH
sudo ldconfig

 

3.修改/etc/ld.so.conf,然后刷新

 

vim  / etc / ld.so.conf

add /where/you/install/lib

sudo ldconfig

 


拓展閱讀

dconfig是一個動態鏈接庫管理命令
為了讓動態鏈接庫為系統所共享,還需運行動態鏈接庫的管理命令--ldconfig
ldconfig 命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態 鏈接庫(格式如前介紹,lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認為 /etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表.

 

ln是linux中又一個非常重要命令,它的功能是為某一個文件在另外一個位置建立一個同不的鏈接,這個命令最常用的參數是-s,具體用法是:ln –s 源文件 目標文件。
  當我們需要在不同的目錄,用到相同的文件時,我們不需要在每一個需要的目錄下都放一個必須相同的文件,我們只要在某個固定的目錄,放上該文件,然后在 其它的目錄下用ln命令鏈接(link)它就可以,不必重復的占用磁盤空間。例如:ln –s /bin/less /usr/local/bin/less
  -s 是代號(symbolic)的意思。
  這里有兩點要注意:第一,ln命令會保持每一處鏈接文件的同步性,也就是說,不論你改動了哪一處,其它的文件都會發生相同的變化;第二,ln的鏈接又 軟鏈接和硬鏈接兩種,軟鏈接就是ln –s ** **,它只會在你選定的位置上生成一個文件的鏡像,不會占用磁盤空間,硬鏈接ln ** **,沒有參數-s, 它會在你選定的位置上生成一個和源文件大小相同的文件,無論是軟鏈接還是硬鏈接,文件都保持同步變化。
  如果你用ls察看一個目錄時,發現有的文件后面有一個@的符號,那就是一個用ln命令生成的文件,用ls –l命令去察看,就可以看到顯示的link的路徑了。

 

RedHat Linux AS4 安裝OpenSSL

 

linux庫

庫的目的是代碼重用,提供共用的功能,某個程序為別的程序提供公開的接口等。

命名和編號:
(1) 所有庫名以lib開頭,gcc在-l指定的文件名前自動插入lib,如libmysqlclient就用-lmysqlclient
(2) .a是靜態庫(archive),如 libmysqlclient.a
(3) .so是共享庫(shared object),如libmysqlclient.so
(4) 編號格式:library_name.major_num.minor_num.patch_num,如libmysqlclient.so.15.0.0
(5) _g和_p: /usr/lib/libform_g.a 中的_g表示這是libform.a的調試庫,用locate _g.a會發現很多類似的庫,但我用locate _g.so沒有發現FC4有此類庫;libxxx_p.a中的_p表示這是libxxx.a的性能分析庫(profiling),但我用locate _p.a和locate _p.so沒有發現FC4有此類路庫。

庫要和接口頭文件配合使用,常見的庫如:
libc.so (不需頭文件) 標准C庫
libdl.so (dlfcn.h) 讓程序在運行是加載和使用庫代碼,而不在編譯時鏈接庫
libglib.so (glib.h) Glib工具函數,例如hash, string等
libgthread.so (glib.h) 對Glib的線程支持
libm.so (math.h) 標准C數學庫
libpthread.so (pthread.h) POSIX標准Linux線程庫
libz.so (zlib.h) 通用壓縮程序庫

庫操作命令:
(1) nm 列出目標文件或二進制文件的所有符號
(2) ar 創建靜態庫和符號索引
(3) ldd 列出程序正常運行所需要的共享庫,例如
# ldd test_mysql
linux-gate.so.1 => (0x00c59000)
libmysqlclient.so.15 => /lib/libmysqlclient.so.15 (0x009a1000)
libc.so.6 => /lib/libc.so.6 (0x0038b000)
libpthread.so.0 => /lib/libpthread.so.0 (0x004f8000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x002f0000)
libnsl.so.1 => /lib/libnsl.so.1 (0x00320000)
libm.so.6 => /lib/libm.so.6 (0x004bd000)
/lib/ld-linux.so.2 (0x0036d000)
(4) ldconfig 和動態鏈接和裝載工具ld.so/ld-linux.so一起決定位於/usr/lib和/lib下的so庫所需的鏈接。ldconfig創建一個從實際庫到so庫名的符號鏈接。注意/etc/ld.so.cache, /etc/ld.so.conf ldconfig -p列出/etc/ld.so.cache內的庫對照鏈接。

環境變量:
動態鏈接器ld.so/ld-linux.so使用一些環境變量:
$LDLIBRARY_PATH : 格式類似$PATH,:分隔,非標准位置/usr/lib和/lib下的庫或者/etc/ld.so.cache中沒有的庫,需要加入該變量才能被搜索到。
$LD_PRELOAD: 空格分隔,定義需要在最前面加載的庫。也可以由/etc/ld.so.preload文件代替

靜態庫和共享庫都是包含object文件的文件。

建立和使用靜態庫:
(1) 把代碼編譯成目標文件,如gcc -c libxxx.c -o libxxx.o
(2) ar: ar -rcs linxxx.a linxxx.o
(3) gcc -static: gcc test.c -o test -static -L. -lxxx
(4) 用file檢查靜態鏈接的可執行文件
(5) 用nm檢查符號,靜態鏈接沒有未定義符號

共享庫占用系統資源少(磁盤和內存),運行時根據共享鏈接從單個文件加載,速度快,維護方便。在運行時,ld.so/ld-linux.so把二進制文件中的符號名鏈接到適當的so庫上。

建立和使用共享庫:
(1) gcc -fPIC 產生與位置無關的代碼,如gcc -fPIC -g -c libxxx.c -o libxxx.o
(2) gcc -shared和-soname,如gcc -g -shared -Wl,–soname, -libxxx.so -o libxxx.so.1.0.0 libxxx.o (注意-Wl,–soname, -libxxx.so 中間沒有空格)
(3) gcc -Wl 把參數傳遞給鏈接器ld
(4) gcc -l顯式鏈接C庫

編譯時指定非標准位置/usr/lib和/lib下的庫的方式是用-L庫目錄指定。

 


免責聲明!

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



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