近日遇到奇怪的問題;好不容易從某Linux Open Sourses原始碼編譯成程式庫.so,正在高興終於編好時,從Andorid載入時竟發生找不到Libxxxx.so.4 程式庫?
Google半天,終於問對問題找到答案,學會該怎麼serch問題還真是不易呀!
原來Linux系統的程式庫soname有所謂版本資訊,例如Libxxx.so.4.4.8。Linux用兩個Libxxx.so和Libxxx.so.4(Symbol Link)連結到Libxxx.so.4.4.8,但Android的Linker目前並未支援。若只是將Libxxx.so.4.4.8改名成Libxxx.so複製過去,用 readelf -d Libxxx.so 檢視其soname還是Libxxx.so.4,沒有用的!
問題有兩種解法,
1.修改Libtool的編譯資訊如下,讓編譯出來的程式庫,天生就沒有版本資訊。這個說起來容易,但對不熟悉Linux編譯環境的人,又是一大考驗。
version_type=none |
need_lib_prefix=no |
need_version=no |
library_names_spec='$libname$release$shared_ext' |
soname_spec='$libname$release$shared_ext' |
finish_cmds= |
shlibpath_var=LD_LIBRARY_PATH |
shlibpath_overrides_runpath=yes |
hardcode_into_libs=yes |
dynamic_linker='Android linker' |
2.用Binary Editor修改資訊,直接將soname改掉。
沒有留言:
張貼留言