2015年1月2日

Android: NDK不支援有版本資訊的C程式庫?

Issue 55868: NDK: Support for prebuild libs with full sonames

    近日遇到奇怪的問題;好不容易從某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改掉。

沒有留言: