1. 程式人生 > >交叉編譯環境學習(編譯Android上的可執行程式)

交叉編譯環境學習(編譯Android上的可執行程式)

        前幾天幫忙師兄發現的Android上的一個驅動程式漏洞,奈何技術不夠耐心不足,沒有找到漏洞的根源。由於程式要由c程式來觸發,而c程式是在pc上的開發的,要在Android裝置上執行,這就涉及到交叉編譯問題。一開始找了好久,想找一個交叉編譯工具,想來也是SB,Android不是為我們提供了NDK開發環境麼,而且我還學了一段時間,可惜後面沒有用,也沒有總結,就忘記了。其實,NDK除了為了Native層的開發,還為了我們提供了強大的交叉編譯環境。雖然學習過程中Google了n多次,這裡的主要參考資料還是官網:

在$NDK/toolchains目錄下集成了很多交叉編譯工具,我的目錄是:F:\adt-bundle-windows-x86_64-20140702\NDK\android-ndk-r10e\toolchains;這裡主要是用的ARM架構的交叉編譯工具。使用的工具根據手機的CPU架構決定。至於怎麼使用沒什麼好說的,直接參考官方文件就好了,這裡記錄下我糾結了好久的2B錯誤,以免下載重犯。

      按照官方的教程,我的編譯命令為:

     arm-linux-androideabi-gcc-4.8 --sysroot=F:\adt-bundle-windows-x86_64-20140702\NDK\android-ndk-r10e\platforms\android-21\arch          -arm  -o C:\Users\*\Desktop\test\hello  -c C:\Users\*\Desktop\test\hello.c

        結果編譯通過了,push到手機中執行的過程中發現出錯了:

./hello: not executable: 64-bit ELF file(真機)
./hello: not executable: magic 7F45(模擬器)
      出錯了就是一頓Google,一直找呀麼找不到錯誤,最後無賴之下除了絕招,對比師兄那個可執行的檔案和我編譯出來的檔案;


最後,無可奈何之下,我居然採取help arm-linux-androideabi-gcc-4.8,真是太相信官方文件了,當然其實人家也是對的,真是沒有一個好的思維啊,要命!發現上面的編譯指令有個 -c 選項,意思是隻編譯和彙編不連結,這下知道了,去掉-c重新編譯,發現執行又出錯了:


繼續Google錯誤以及看工具的help文件。原來Android較新的版本引進了PIE這個安全機制,具體沒有研究,後面有空再去看看。編譯選項直接加上:-pie,在重新編譯執行,搞定!完整的可執行的編譯命令:

arm-linux-androideabi-gcc-4.8 -pie --sysroot=F:\adt-bundle-windows-x86_64-20140702\NDK\android-ndk-r10e\platforms\android-21\arch-arm  -o C:\Users\*\Desktop\test\hello  C:\Users\*\Desktop\test\hello.c
最後提一下:Android官方文件中還提供了Advanced Mode,當然還可以直接用ndk-build,至於Advanced Mode大致看了兩眼,沒去試了,以後有需求再去弄吧~

相關推薦

交叉編譯環境學習(編譯Android執行程式)

        前幾天幫忙師兄發現的Android上的一個驅動程式漏洞,奈何技術不夠耐心不足,沒有找到漏洞的根源。由於程式要由c程式來觸發,而c程式是在pc上的開發的,要在Android裝置上執行,這

在window下用android-ndk編譯android執行程式的方法。

環境,win7,與android-ndk-r13b-windows-x86_64,把android-ndk-r13b-windows-x86_64解壓在目當中就可,不用安裝 1,只用gcc工具 D:\android-ndk\android-ndk-r13b\toolcha

基於Android arm64 執行程式編譯執行

Android預設編譯的應用程式動態連結的一般都是PIE,前文“基於Android arm64 Linux got 除錯”,每次除錯都要檢視載入地址,於是就想能否編譯生成非PIE的應用程式。 /opt/android-6.0.1_r9/external/hel

Linux下的C/C++開發基礎(編寫makefile、編譯C/C++、連結、執行程式

本文重點介紹C/C++原始碼工程的編譯連結,編譯器gcc/g++的安裝配置略過... 1. 安裝配置gcc g++ 2. 建立檔案 test.h /test.c / file.h  / file.cpp  3. 編譯.o庫: gcc -c / g++ -c     連結生成靜

在Windows環境下使用gcc生成執行程式簡介

gcc(GNU編譯器套件)。gcc的初衷是為GNU作業系統專門編寫的一款編譯器,可以處理多種程式語言:C、C++、Objective-c 、Objective-c++、Fortran、 Java 、Ada 、Go及組合語言。 基本用法: 在使用gcc編譯器時,我們必須給出一系列必要的呼叫引數

經驗總結---編譯出可以在Android執行執行檔案

作為一手包攬Ubuntu和Android裝置的初級開發者,我不止一次地嘗試把這兩個同是用Linux核心的作業系統統一起來——讓Ubuntu下的可執行程式能夠在Android裝置上執行。於是我不止一次地嘗試,不止一次地查詢資料,終於如願以償。 我把我的經驗在這裡與大家分享。 準備工具 【宿

編譯一個可以在Android系統執行執行程式

開發環境 系統環境:Ubuntu14.04   交叉編譯器 arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 arm-none-linux-gnueabi-gcc  arm各個版本下

NDK編譯Android執行的C執行程式

大部分講到NDK編譯的都是針對編譯動態靜態庫的,有些特殊的需求需要編譯成可執行檔案,所以在此記錄一下 本文基於win7 首先NDK的目錄需要加到系統路徑中去,這樣ndk-build才能正常呼叫,ndk-build本身是一個指令碼,依賴於jni資料夾,所以你的程式必須放在jn

opencv交叉編譯arm環境庫,靜態,動態庫和執行程式

在工作中遇到把基於opencv的程式碼移植到板子上執行,在網上查看了很多資料,嘗試了兩種方案,都是可行的 1.把opencv程式碼用ndk的方式編譯成可執行檔案,直接放到板子上執行,這種方式是最便捷的不用考慮板子上其他程式的干擾 附上ndk編譯程式碼,準備好下面兩個檔案後,

【ndk】直接使用ndk提供的arm-linux-androideabi-gcc編譯android執行程式

1、背景 經常使用linux交叉工具類的朋友都知道,在已安裝交叉編譯工具鏈後要交叉編譯得到linux可執行檔案只需要執行如下類似的命令(如編譯hello.c生成hello可執行檔案): arm-linux-gcc hello.c -o hellohello.c的程式碼非常

Android-------C語言執行程式編譯例項

繼續 NDK 的開發。上次我們的例項中,對 C 應用程式的編譯連結,自己編寫的makefile 是件比較困難的事情。雖然最後成功了,不過中間經歷了不少坎坷。我們現在研究下如何用 NDK 提供的 build 工具,實現我們的目標。 還是以 Hello Android 工

編譯Android執行命令的FFmpeg

開啟你養家餬口的Android Studio,嫻熟的新建一個專案; 編寫一個 native 函式,如果只是測試我們在MainActivity裡面搞就行了: public native int ffmpegRun(String[] cmd); 新建jni目錄,在目錄下新建檔案: jx_ffmpeg_cm

Linux GCC生成執行程式的4個步驟——預處理、編譯、彙編、連結

一,預編譯 操作步驟:gcc -E hello.c -o hello.i 主要作用: 處理關於 “#” 的指令 【1】刪除#define,展開所有巨集定義。例#define portnumber 3333 【2】處理條件預編譯 #if, #ifdef, #if, #elif,#e

CMakeLists.txt 中設定編譯後的執行程式優先呼叫本地庫

可執行程式查詢不到so庫 庫放在可執行程式目錄下的lib資料夾下,但是可執行程式沒有去呼叫,使用ldd指令  修改ld.so.conf也是無效 是否是CMakeLists.txt設定的問題? 有事找度娘。。。  設定可執行程式優先呼叫本地庫 SET(CMA

Xcode編譯c/c++檔案後生成的執行程式位置

當我們用xcode編譯c/c++程式時,可以在xcode裡面直接編譯執行,但是我們想在命令列中執行可執行程式,就像在linux下怎麼辦。我們就需要去找到生成的可執行檔案。 生成的可執行程式位置在 xcode---preferences---locations 在De

linuxcnc裡執行程式的單獨編譯

比如:bin/milltask,先分別編譯各個.c或.cc檔案,再連結生成milltask可執行檔案.   >cd ~/linuxcnc-dev/src/emc/task >g++ -c ../motion/emcmotglb.c -I../../../include -

flask部署到阿里雲伺服器centos+python3+gunicorn+nginx詳細教程(從本地windows執行部署伺服器環境執行

前言: 做了flask網站,是因為軟體工程課程的任務,每個小組期末需要交一份的可執行的專案,我們小組做的是flask留言牆,用的flask做後臺邏輯功能,前端h5,javascript,jquery,實現網頁佈局,樣式,前端驗證...做完,想把這個網站掛到外網上,就需要伺服器...這裡用了阿

編譯原理學習筆記(二)翻譯程式的實現

上一節所學的主要是語法到語義的內容,通過手動構造語法樹來理解編譯過程。 在3.5節,書中給出了字尾表示式翻譯程式的java實現。根據前面的內容,今天對NC程式碼編譯給出簡易的實現。 在實現前,需要幾個準備內容用以簡化程式碼: 1. 正則表示式 正則表示式

NDK編譯C執行程式

現有這樣一個helloworld.c的原始檔,如下: #include <stdio.h> int main(){ printf("Hello world!\n"); } 如何將它進行編譯,並在Android上執行?這就是本文的目標。 原理 (如果只想

Linux下用Makefile製作動態庫和靜態庫並編譯生成執行程式

Makefile 一個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新