ubuntuopenssl編譯
『壹』 交叉編譯openssl for arm-linux-androideabi-gcc工具鏈
在Ubuntu 16.04 64bit上搭建的android編譯環境交叉編譯SDK的openssl-1.0.2j生成庫,但是使用ndk-build時,卻出現了「Fatal error: Invalid -march= option: `armv5te'」錯誤
用 android-ndk-r10e 的交叉編譯鏈在Ubuntu 16.04 32bit系統上沒有問題,後來網路搜索後嘗試了各種方法還是找不到問題所在,最後在 CSDN問答 這邊找到了相關描述,果不其然,升級了交叉編譯鏈 android-ndk-r12b 後編譯就通過了。
『貳』 怎麼裝openssl-devel啊,ubuntu里好象沒有這個包
方法一、直接安裝
yum install openssl openssl-devel方法二、下載源碼編譯安裝
下載
wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz解壓
tar zxf openssl-1.0.2h.tar.gz安裝
cd openssl-1.0.2h./config shared zlib
because of configuration changes, you MUST do the following before
*** building:
提醒需高緩中要在build之前做make depend
make depend
make install
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
echo 「/usr/local/ssl/lib」 >> /etc/ld.so.conf
ldconfig -v檢測安裝是否成戚山哪段功:openssl version -a
『叄』 Android:Ubuntu編譯OpenSSL步驟
NDK版本:android-ndk-r14b
OpenSSL版本:1.1.1k/3.0.0
Ubuntu版本:15.5
1、配置ndk環境變數
OpenSSL版本:1.1.1k:export ANDROID_NDK_HOME=/home/linrendi/Desktop/Compile/android-ndk-r14b/
OpenSSL版本:3.0.0: export ANDROID_NDK=/home/linrendi/Desktop/Compile/android-ndk-r14b/
如果是
編譯32位:
OpenSSL版本:1.1.1k:1、export PATH= PATH
OpenSSL版本:3.0.0:1、export PATH= PATH
2、./Configure android-arm -D__ANDROID_API__=21 --prefix=/home/linrendi/Desktop/openssl-1.1.1k/armv7a
3、make -j7 && make install
編譯64位:
OpenSSL版本:1.1.1k:1、export PATH= PATH
OpenSSL版本:3.0.0:1、export PATH= PATH
2、./Configure android-arm64 -D__ANDROID_API__=21 --prefix=/home/linrendi/Desktop/openssl-1.1.1k/arm64
3、make -j7 && make install
注意:當編譯完32位後,又想編譯64位,必須重新解壓,避免一些配置沒有更新導致編譯失敗
『肆』 編譯時缺少openssl/md5.h該怎麼處理
最近需要安裝openssl,需要使用openssl/md5.h這個頭文件,可是使用Ubuntu的apt-get install openssl安裝橡首,沒有這個文件,連urs/include/openssl都沒,經過一天的查找資料都沒解決,最後想到了使用源碼安裝openssl,最終解決了。
參考 http://www.linuxidc.com/Linux/2011-10/45738.htm
OpenSSL 是一款開源的 SSL 軟體包,採用 SSL 的公開密鑰技術,用於實現傳輸層的通信加密功能。OpenSSL 支持 Linux、Windows、BSD、Mac 等平台,功能強大,包含豐富的讓氏密碼演算法庫,SSL 協議庫和應用程序。
一、SSL 基本常識 1.1、什麼是 SSL?
安全套接層(Secure Sockets Layer,SSL), 最初由 netscape 公司設計,建立在傳輸層的安全通信協議,採用公開密鑰體系的證書認證方式來確保客戶端和 SSL 伺服器之間梁滑數的通信安全。
1.2、SSL 認證流程
SSL 客戶端在 TCP 連接建立之後,發出一個消息(包含了客戶端所支持的演算法列表)給伺服器端,然後伺服器端返回一個數據包(確定了這次通信所需演算法)和 SSL 伺服器端的證書(包含了公鑰)給客戶端。客戶端隨後會用收到的公鑰將消息加密再傳送,該加密消息只能用 SSL 伺服器端私鑰解密,即便中途被截取也無法獲知內容。
二、編譯安裝 OpenSSL 2.1、准備工作
系統版本:Ubuntu-10.10-Server-I386
更新源:apt-get update
升級軟體:apt-get upgrade
更新系統:apt-get dist-upgrade
2.2、查看OpenSSL版本
部分 Linux 系統已默認安裝了 OpenSSL 0.9.8,特別是 VPS 一般都安裝了。
openssl version -a
2.3、安裝基礎編譯環境
apt-get install build-essential
2.3、編譯安裝 Zlib 庫(這一步我沒有成功,但是也成功安裝了openssl)
wget http://zlib.net/zlib-1.2.5.tar.gz
tar -zxf zlib-1.2.5.tar.gz
cd zlib-1.2.5/
./configure --prefix=/usr/local
make && make install
2.4、卸載舊版本 OpenSSL
apt-get purge openssl
rm -rf /etc/ssl #刪除配置文件
2.5、編譯與安裝 OpenSSL
prefix 是安裝目錄,openssldir 是配置文件目錄,另外建議安裝兩次,shared 作用是生成動態連接庫。
wget ftp://ftp.openssl.org/source/openssl-1.0.0c.tar.gz
tar -zxf openssl-1.0.0c.tar.gz
cd openssl-1.0.0c/
./config --prefix=/usr/local --openssldir=/usr/local/ssl
make && make install
./config shared --prefix=/usr/local --openssldir=/usr/local/ssl
make clean
make && make
進一步的配置可參考《OpenSSL-0.9.8g 安裝與配置指南》http://www.linuxidc.com/Linux/2011-10/45737.htm
『伍』 ubuntu下安裝php,編譯時候報錯
應該是缺少openssl-dev之類的頭文件,不用ubuntu,所以不知道具體名稱,你可以
apt-cache search openssl,查看輸出內容,尋找類似openssl-dev的包安裝 。
因為ubuntu的包一般只包括運行文件,編譯用的頭文件是單獨打包的。
『陸』 ubuntu上安裝curl支持https配置成功,編譯出錯
原因是Linux有一個SELinux保護模槐亂式引宴瞎起的。
1.關閉SELINUX的方法:
vi /etc linux/config 將SELINUX=enforcing 改成SELINUX=disabled 需要重啟
2.
不關閉SELINUX的方法:
# setenforce 0
# chcon -c -v -R -u system_u -r object_r -t textrel_shlib_t /鉛祥檔usr/local/apache/moles/libphp5.so
# service httpd restart
# setenforce 1
『柒』 ubuntu下怎麼build一個完整的python
我們需要一個一個編譯這些包:
1. common.sh:這個文件里包含一些基礎設置,比如選用的GCC,CFLAGS和LDFLAGS如何配置。
[plain] view plain
export NDKDIR="/你的NDK路徑比如/android-ndk-r10c"
# GCC 版本選用,目前有4.6,4.8,4.9,選用時也注意Linux系統的類型,這里x86_64是六十四位
export COMPILER="$NDKDIR/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin"
export CC="$COMPILER/arm-linux-androideabi-gcc"
export CXX="$COMPILER/arm-linux-androideabi-g++"
export CPP="$COMPILER/arm-linux-androideabi-cpp"
export LD="$COMPILER/arm-linux-androideabi-ld"
export AS="$COMPILER/arm-linux-androideabi-as"
export AR="$COMPILER/arm-linux-androideabi-ar"
export STRIP="$COMPILER/arm-linux-androideabi-strip"
export OBJCOPY="$COMPILER/arm-linux-androideabi-obj"
export OBJDUMP="$COMPILER/arm-linux-androideabi-objmp"
export RANLIB="$COMPILER/arm-linux-androideabi-ranlib"
export NM="$COMPILER/arm-linux-androideabi-nm"
export STRINGS="$COMPILER/arm-linux-androideabi-strings"
export READELF="$COMPILER/arm-linux-androideabi-readelf"
# 選擇要編譯文件在哪個Android版本上使用,這里案例是在Android 4.2上使用,就是android 17;2.2對應Android 8,5.0對應Android 21
export ANDROID="$NDKDIR/platforms/android-17/arch-arm/usr"
# 配置系統頭文件和庫文件位置
export CFLAGS="-I$ANDROID/include --sysroot=$ANDROID"
export CXXFLAGS="-I$ANDROID/include --sysroot=$ANDROID"
export CPPFLAGS="-I$ANDROID/include"
export LDFLAGS="-L$ANDROID/lib"
2. 編譯openssl:
[plain] view plain
tar zxf openssl-1.0.1j.tar.gz
cd openssl-1.0.1j
mkdir dist
source common.sh
MACHINE=armv7 SYSTEM=android ./config -fPIC --prefix=./dist
# 在Makefile里做一些補丁,以防error
sed -i "s|-m64||" Makefile
sed -i "s|-Wall|-Wall --sysroot=$ANDROID|" Makefile
# 編譯並安裝
make
make install
3. 編譯ncurses,readline,sqlite
仿照openssl的方法,編譯另外三個庫;其實還有一個zlib需要編譯,當然後面不讓python支持bz2就可以忽略。
注意readline編譯最好選擇--with-curses,然後把編譯好的ncurses鏈接上。庫類文件編譯,盡量都加-fPIC,這是什麼,不從匯編說還真說不清楚,還是大家自己去看官方文檔吧。
對於localeconv的問題,大家最好改寫下那個locale.h,在裡面把localeconv的struct里fix放上你要的字元,比如decimal_point是".",這樣後面都不會出這類locale的問題了。
這里給出快捷的解決方案就是把localeconv幹掉,直接hardcode:
[plain] view plain
# 在ncurses編譯之前,需要打的補丁
sed -i "s/#define isDecimalPoint(c) .*/#define isDecimalPoint(c) ((c) == '.')/" form/fty_num.c
sed -i "s/localeconv()/NULL/" form/fty_num.c
[plain] view plain
# 編譯ncurses
./configure --prefix=/YourPath --disable-home-terminfo --without-ada
make
make install
[plain] view plain
# 編譯readline
./configure --prefix=/YourPath --host=arm-linux --build=x86_64-linux \
--enable-static --enable-shared --with-curses
make
make install
[plain] view plain
# 編譯sqlite
./configure --host=arm-linux --build=x86_64-linux
make
make install
4. 編譯Python:
其實過程整體和openssl沒有什麼區別,細節上有一些注意事項。
- configure文件是需要手動fix的,打開文件,搜索 ac_cv_file__dev_ptmx 和 ac_cv_file__dev_ptc;刪除對這兩個變數的自動判斷。手動去Android查看/dev文件夾里有沒有ptmx和ptc設備,有就設置為yes沒就no:
[plain] view plain
ac_cv_file__dev_ptmx=yes
ac_cv_file__dev_ptc=no
- 打開Moles/Setup.dist文件,把需要的python模塊前面的#去掉,比如#_socket socketmole.c timemole.c,要python支持網路socket介面,需要把#去掉;建議盡量多加一些包;實在編譯不過的包不要,有些模塊需要額外下載開源軟體庫編譯,就不只openssl,ncurses,readline,sqlite了。
這樣就可以configure 了:
[plain] view plain
./configure --host=arm-unknown-linux-gnu --build=x86_64-unknown-linux-gnu \
--enable-ipv6
- 有一段編譯會報錯,仔細檢查,發現python需要編譯一個程序,這個程序跑在host上,但gcc是arm的,host linux是x86_64的,所以我們需要復制一份解壓好的python代碼,然後用本地原有的gcc編譯;當然編譯時直接./configure && make就可以了,直到Parser文件夾下出現了pgen這個可執行文件;把它拿出來,復制到另一個python源碼的Parser文件夾中,修改Makefile:
[plain] view plain
sed -i "s|\$(PGEN):.*|\$(PGEN):|" Makefile
sed -i "s|\$(CC) \$(OPT) \$(LDFLAGS) \$(PGENOBJS) \$(LIBS) -o \$(PGEN)|echo \"fake Parser/pgen\"|" Makefile
- 解決locale的問題,還有一些常量問題,笨方法hardcode:
[plain] view plain
sed -i "s|.*localeconv().*||" Objects/stringlib/localeutil.h
sed -i "s|locale_data->grouping|\"\"|" Objects/stringlib/localeutil.h
sed -i "s|locale_data->thousands_sep|\"\"|" Objects/stringlib/localeutil.h
sed -i "s|.*localeconv().*||" Objects/stringlib/formatter.h
sed -i "s|locale_data->grouping|\"\"|" Objects/stringlib/formatter.h
sed -i "s|locale_data->thousands_sep|\"\"|" Objects/stringlib/formatter.h
sed -i "s|locale_data->decimal_point|\".\"|" Objects/stringlib/formatter.h
sed -i "s|.*localeconv().*||" Python/pystrtod.c
sed -i "s|locale_data->decimal_point|\".\"|" Python/pystrtod.c
sed -i "s|I_PUSH|0x5302|" Moles/posixmole.c
sed -i "s|p->pw_gecos|\"\"|" Moles/pwdmole.c
- Moles/socketmole.c: 需要去掉一些#if,不然頭文件里沒有定義,或者直接去$ANDROID的include文件夾把相應.h文件補充完整也可以。
[cpp] view plain
...
Py_BEGIN_ALLOW_THREADS
#ifdef USE_GETHOSTBYNAME_LOCK
PyThread_acquire_lock(netdb_lock, 1);
#endif
h = gethostbyaddr(ap, al, af);
Py_END_ALLOW_THREADS
ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
#ifdef USE_GETHOSTBYNAME_LOCK
PyThread_release_lock(netdb_lock);
#endif
return ret;
...
make然後make -i install,好啦,python編譯出來啦!
下面就是放到android上跑了。
需要Android是root的,不root也可以,就是得找個地方放。
需要把python編譯好的文件夾打包放到android上,還有sqlite里的那個so文件。
root的話可以在/system/bin里軟鏈接一個python。當然,sqlite.so.3要放在/system/lib里。
其實sqlite是可以不編譯的,但是我們的Django需要它,所以還是弄出來吧,ssl也可以不用,但是為了伺服器支持https,還是編譯下吧。
這樣就可以運行python了。
[html] view plain
# python
>>> 1+2
3
然後下載setuptools (https://pypi.python.org/pypi/setuptools/7.0) 和 pip (https://pypi.python.org/pypi/pip/1.5.6) 解壓並安裝:
[plain] view plain
gzip -d setuptools-7.0.tar.gz
tar xf setuptools-7.0.tar
cd setuptools-7.0
python setup.py build
python setup.py install
gzip -d pip-1.5.6.tar.gz
tar xf pip-1.5.6.tar
cd pip-1.5.6
python setup.py build
python setup.py install
把pip軟鏈接到/system/bin。好了,python有了pip,哈哈,隨心安裝包吧。先來個pip install virtualenv
接下去可以安裝django django-sslserver,把django-admin軟鏈接到/system/bin,就可以寫網站啦:
[plain] view plain
django-admin startproject test001
cd test001
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
不安裝django也可以直接對一個文件夾提供http服務:
[plain] view plain
python -m SimpleHTTPServer
有了server,在家庭里就可以搭建平台啦,如果有多個手機,連上wifi,就可以不用接線,完成無線分布式伺服器,趕快練習loadbalance吧。
嗯嗯,看看需不需要用手機伺服器隨時監控家裡的活動,然後插上SIM卡還能自動給我發簡訊,嘿嘿。
後面我們來想像怎麼解決pip install有時需要編譯c文件的問題。其實有團隊已經解決了這個問題。
下載Droid for GCC plugin的apk:http://www.liqucn.com/rj/228351.shtml (這個不是官網,最好去google play下載)
把apk解壓,然後找到gcc的壓縮包,裡面就有gcc了,把它放到Android上:
[plain] view plain
#include <stdio.h>
int main() {
printf("hello world!\n");
return 0;
}
然後gcc -o test test.c,並運行./test,完美輸出hello world。趕緊軟鏈接到/system/bin里吧。
好了,這樣numpy都可以編譯安裝了。還可以編譯下erl,把rabbitmq編譯下,弄個分布式也不是問題。最好移植一下lxc,然後把raspberry里的arm版java搬過來就無敵啦。買個USBminiB轉RJ45的頭就可以插網線了。
總體來說,可以搭建移動伺服器了,以後寫一些網頁版小應用,想用的時候android開個熱點,電腦一連,開始enjoy!
『捌』 Ubuntu16.04 系統 openssl升級到1.1.0d後,調用openssl 命令報錯
1、將下載的壓縮包放在根目錄,
2、在文件夾下解壓縮,命令:tar -xzf openssl-openssl-1.0.0e.tar.gz,得到openssl-openssl-1.0.0e文件夾
3、進入解壓的目錄:cd openssl-1.0.0e
4、設定Openssl 安裝,( --prefix )參數為欲安裝之目錄,也就是安裝後的檔案會出現在該目錄下:
執行命令: ./config --prefix=/usr/local/openssl
5、執行命令./config -t
6.執行make,編譯Openssl
這里出現的錯誤
『玖』 已安裝OpenSSL,但編譯其他軟體的時候出現configure: error: openssl not found
要裝openssl的開發包
sudo apt-get install libssl-dev
『拾』 我想在我的電腦的虛擬機ubuntu搭建UEFI環境,EDK2已經下載好了,編譯UEFI模擬器時顯示如下錯誤該怎麼辦啊
開源,但是需要自己下載openssl庫,解壓到該目錄