您的位置:首页 > 运维架构 > Linux

在linux上使用NDK编译hello.c

2018-01-12 08:51 393 查看
为了学习使用NDK进行交叉编译,首次在linux上使用NDK编译hello.c,使其生成能在android平台上运行的可执行文件。

其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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: