在linux上使用NDK编译hello.c
2018-01-12 08:51
393 查看
为了学习使用NDK进行交叉编译,首次在linux上使用NDK编译hello.c,使其生成能在android平台上运行的可执行文件。
其makefile如下:
1.在当前目录下直接执行命令make即可生成可执行文件hello
2.使用abd push 将hello推进android平台
3.使用./hello执行该文件(可能需要chmod 777 hello)
经过以上三步即可在android平台上打印出 hello world!
在linux上使用NDK编译的hello.c,使其生成能够在android平台上运行的可执行文件hello。
生成的hello能在android4.4上运行,但在android8.0上出现如下问题:
位置独立可执行文件或PIE允许程序重新定位,就像共享对象一样。在程序的每次运行中,程序都可以加载到不同的地址,以使攻击者难以猜测某个程序状态。
-fPIE的意思其实和-fPIC是差不多的. 它们都是产生位置无关的代码.
只不过, -fPIE是为可执行文件产生位置无关代码, -fPIC是为共享库产生位置无关代码.
可以通过以下两种方法来编译和链接PIE可执行文件:编译-fPIE和链接-pie;编译一切-fPIC和链接-pie。如果你正在构建一个共享对象和一个程序,那么编译所有的东西-fPIC。将共享对象-shared链接到链接程序-pie。你不能用另一种方法,也就是说,你不能编译所有的东西,-fPIE并建立共享对象和程序。有关详细信息,请参阅GCC手册中的代码生成选项。
https://stackoverflow.com/questions/30498776/position-independent-executables-and-android-lollipop
gcc -v –help | grep pie
-fpie 为可执行文件尽可能生成与位置无关的代码(小模式)
-pie 生成位置无关可执行文件
解决办法:
其makefile如下:
PREFIX=/home/xlh/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86/bin/ CC=$(PREFIX)/arm-linux-androideabi-gcc SYSROOT=/home/xlh/android-ndk-r10e/platforms/android-21/arch-arm hello: $(CC) -o hello hello.c --sysroot=$(SYSROOT)
1.在当前目录下直接执行命令make即可生成可执行文件hello
2.使用abd push 将hello推进android平台
3.使用./hello执行该文件(可能需要chmod 777 hello)
经过以上三步即可在android平台上打印出 hello world!
在linux上使用NDK编译的hello.c,使其生成能够在android平台上运行的可执行文件hello。
生成的hello能在android4.4上运行,但在android8.0上出现如下问题:
位置独立可执行文件或PIE允许程序重新定位,就像共享对象一样。在程序的每次运行中,程序都可以加载到不同的地址,以使攻击者难以猜测某个程序状态。
-fPIE的意思其实和-fPIC是差不多的. 它们都是产生位置无关的代码.
只不过, -fPIE是为可执行文件产生位置无关代码, -fPIC是为共享库产生位置无关代码.
可以通过以下两种方法来编译和链接PIE可执行文件:编译-fPIE和链接-pie;编译一切-fPIC和链接-pie。如果你正在构建一个共享对象和一个程序,那么编译所有的东西-fPIC。将共享对象-shared链接到链接程序-pie。你不能用另一种方法,也就是说,你不能编译所有的东西,-fPIE并建立共享对象和程序。有关详细信息,请参阅GCC手册中的代码生成选项。
https://stackoverflow.com/questions/30498776/position-independent-executables-and-android-lollipop
gcc -v –help | grep pie
-fpie 为可执行文件尽可能生成与位置无关的代码(小模式)
-pie 生成位置无关可执行文件
解决办法:
$(CC) -fPIE -pie -o hello hello.c --sysroot=$(SYSROOT)
相关文章推荐
- Linux下使用GCC编译并运行第一个helloworldC++程序
- linux下使用ndk编译ffmpeg
- (OK) 交叉编译hello.c for android (--sysroot),不使用Android.mk和ndk-build
- OpenMP在ARM-Linux以及NDK中的编译和使用
- linux中使用NDK编译ffmpeg的android平台的可执行文件
- 使用Android Studio 1.3 版本进行NDK开发 编译运行hello-jni项目及分析
- 使用NDK和CMake在Linux上编译Android动态库
- OpenMP在ARM-Linux以及NDK中的编译和使用
- Linux 下使用 NDK 编译 protobuf 2.6.1
- 使用Android NDK内置编译器为Android编译Linux应用程序
- Linux下使用NDK编译FFMPEG(libstagefright)
- 交叉编译环境以及开发板上-/bin/sh: ./hello: not found(使用arm-linux-gcc -static -o 来进行静态编译)
- FFmpeg编译:Linux下使用NDK编译FFmpeg
- linux 下使用ndk-build编译android使用的c++静态库
- 【ndk】直接使用ndk提供的arm-linux-androideabi-gcc编译android可执行程序
- 【原】Boost下载安装编译配置使用指南(含Windows、Linux以及ARM Linux)
- 解决 linux 编译定制新内核后 virtualbox和vmware无法使用的问题
- 在Linux平台上使用Cmake进行交叉编译替代嵌入式平台所使用的Makefile
- Boost下载安装编译配置使用指南(含Windows和Linux)
- linux下编译hello world c程序。