开发Android下纯C程序时,打开时提示not found

这个问题烦了我一天了..郁闷.本人想试验一下使用ndk里面的toolchains直接编译一个纯C的程序,使其在Android下可运行.于是在Ubuntu下写了一个简单的程序:

sayhi.c

 

void main(){
  write(1,"hi\n",3);
}

 

 首先设置export PATH=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/bin:$NDK/toolchains/arm-linuxandroideabi-4.4.3/prebuilt/linux-x86/libexec/gcc/arm-linux-androideabi/4.4.3

 

然后执行gcc -v -o sayhi sayhi.c,其中v参数可以输出gcc的执行过程.

其中有3条重要的命令:

 

ccl -quiet -v -iprefix /home/carmenloklok/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/bin/../lib/gcc/arm-linux-androideabi/4.4.3/ sayhi.c -mbionic -quiet -dumpbase sayhi.c -march=armv5te -mfloat-abi-soft -mfpu=vfp -auxbase sayhi -version -o /tmp/ccM7ROuN.s

 

as -v -march=armv5te -mfloat-abi=soft -mfpu=vfp -meabi=5 -o /tmp/cc4k3VNI.o /tmp/ccM7ROuN.s

 

ld --sysroot=/home/ahsieh/ndk-release/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/sysroot --eh-frame-hdr -dynamic-linker /system/bin/linker -X -m armelf_linux_eabi -o sayhi crtbegin_dynamic.o /tmp/cc4k3VNI.o -lgcc -lc -ldl -lgcc crtend_android.o

 

我们知道编译的过程是:预处理->编译->汇编->连接.所以gcc其实是分别调用了ccl,as,ld来达到这个目的.

从上面可以看到gcc默认给这3个命令加了一些参数.ccl和as的参数我没多理,只是复制了然后自己去调用一次.最后ld的时候,我一开始把 -dynamic-linker /system/bin/linker 这个参数给去掉了.于是编译成功后,放到android手机上运行时发现提示not found.这到底是为什么呢.?

 

用readelf -l查看sayhi程序,发现它的interpreter是/usr/lib/ld.so.1 查看了资料,发现android下的动态连接器是/system/bin/linker.难怪默认下ld有这个参数了!而我把它去掉了.所以该gcc(其他的gcc可能为其他值,看gcc自己的默认实现,如果不想用它的默认值,则最好分开ccl,as,ld三个步骤自己执行)就缺省动态连接器为/usr/lib/ld.so.1 很明显在android下是没有这个文件的.所以才会提示not found!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值