交叉編譯sqlcipher


1. 小心預編譯宏SQLITE_HAS_CODEC

2. openssl在不同License下,導出的符號不對等。(錯了,1.1.0后api發生變化,小心選用openssl版本)

3, ac使用了libtool,但sysroot卻在鏈接時失效。 

一如往常,所有GNU Make like的項目在linux平台下configure+make順利編譯安裝,但交叉編譯到android linux平台時,過程總是問題不斷,要一個一個去手動解決。

1. 小心預編譯宏SQLITE_HAS_CODEC

sqlcipher是sqlite3的加強版,提供加密。也就是sqlite3的修改版,里面修改添加了代碼,並以一些預編譯宏來進行分支選路。所有修改過的代碼片段都包含在預編譯宏SQLITE_HAS_CODEC保護下。如果你沒有加入這個預編譯宏SQLITE_HAS_CODEC,這部分代碼就不會包含在源文件中。必須要清楚,這部分代碼是修改,不是新添加。對於不包含新添加還曉幸編譯出一個原版,但是不包含修改在代碼,就連原本必要定義的結構或代碼都不包含了,所以編譯就會報錯N多東西沒有定義。而這些東西卻在源文件文本中。

2. openssl在不同License下導出的符號不對等。(錯了,1.1.0后api發生變化)

在你的linux操作系統,你使用的openssl-devel包都在[GNU Public License]下,幾乎所有依賴openssl的項目都可以很好地兼容編譯。但是你要清楚,當你下載openssl代碼包編譯出來的庫,卻是[OpenSSL license]。這兩個License有什么不同,就不深入了,但卻影響我們的編譯兼容。

左圖是[OpenSSL License]下的hmac.h。(錯了,不是License問題,這個是openssl 1.1.0f)

右圖是[GNU Public License]下的hmac.h,也就是我們在linux操作系統常用的openssl-devel包。(錯了,不是License問題,這個是openssl 1.0.1e)

在[GNU Public License]下的hmac.h中,結構體hmac_ctx_st導出到頭文件。

而[OpenSSL License]下的hmac.h中, 結構體hmac_ctx_st卻要隱藏定義,用戶必須通過HMAC_CTX_new()來動態分配空間。

這有什么大影響呢?問題是一些項目在它們的結構體直接聚合hmac_ctx_st結構體,使得你編譯這些項目時不兼容。

例如sqlcipher項目這樣的代碼段

這就讓你悶,在[GNU Public License]的openssl包可以編譯過,在[OpenSSL License]的openssl庫就編譯不過。

 

這個結構體的定義在

 

 又要手動在這添加在那添加了。

 

evp_cipher_st: ./crypto/include/internal/evp_int.h (openssl 1.1.0之后版本)

hmac_ctx_st: ./crypto/hmac/hmac_lcl.h (openssl 1.1.0之后版本)

openssl 1.1.0之后HMAC_CTX_Init以及HMAC_cleanup函數沒有了,如果你使用的第三方庫依賴舊的openssl,就要小心選用版本。

openssl 1.1.0對android平台編譯比較友好,也就容易編譯。openssl 1.0.1之前進行android平台編譯十分麻煩。並且有幾個地方會悶死你。

1. 不同目錄的源文件,包含同一項目其它目錄的頭文件,並沒有指定項目目錄的根點,用相對路徑,而是一個直接#include "xxx.h",你必須根據每次編譯錯誤去補全所有包含路徑。crypto目錄下的子目錄的源文件隨便依賴其它目錄的頭文件。所以你必須添加這個項目內多個目錄到包含路徑。

2. 編譯參數AR,一般指定為host平台的ar程序路徑,但是在這個項目中,AR=ar r,不要漏了后面的r,不然在make過程總報靜態庫鏈接命令語法錯誤。

3. 編譯參數SHLIB_TARGET,你必須參考Makefile.shared去設置這個參數值,使你編譯動態庫時可以順利完成。

 

 

3, ac使用了libtool,但sysroot卻在鏈接時失效。 

ac會生成Makefile以及libtool,Makefile會去調用libtool。雖然你在LTCFLAGS中設置了--sysroot,並且Makefile的確也使用到libtool --mode=link命令中,但是最后執行gcc鏈接的命令中卻找不到--sysroot選項,導致crtbegin.o, crtend.o路徑錯誤。這里必須自己去手動修改libtool對應的生成動態庫的命令(archive_cmds),加入--sysroot選項。手動修改ac生成的文件去編譯,最不好就是不通用,下次再編譯就記不起了,這與ac自動化相悖。

 

4. 盡量靜態鏈接到你自己編譯的openssl庫

4.1 openssl在各廠商的android系統/system/lib都會帶有,而你編譯的一定不完全相同,但是動態加載時一定會加載到/system/lib目錄里的openssl庫,而不是你編譯的。

4.2 如果你的程序依賴了__gnu_thumb1_case_XXXX函數,說明你的-fPIC選項默認在使用jump tables,如果編譯不過請使用-fno-jump-tables去除。


免責聲明!

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



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