在交叉编译Android时遇到system()调用问题

时间:2012-09-09 06:14:42

标签: android cross-compiling

基于NDK独立工具链和仿生的一些限制,我使用crosstool-NG使用这些常规设置来创建自己的工具链:

  • binutils-2.22
  • 启用gfortran的gcc-4.5.3
  • glibc-2.14.1
  • 内核头-2.35.7
  • arch arm4t

使用这个我构建一个可执行文件并将所有依赖项(包括libc,ld-linux等)上传到我的Android设备上。我用ld-linux.so.3手动运行可执行文件--library-path ...

这是一个非常复杂的可执行文件,除了,如果我进行任何system()调用,甚至是基本的东西,如系统(“pwd”)或系统(NULL),我得到127作为状态(未找到)。如果我更进一步使用popen来收集回复,我得到:

* 检测到glibc * 双重免费或损坏

发生了什么事?有没有人成功做过类似的事情?是否存在权限问题?有没有根本不同的Android使system()调用不可能?我在哪里可以找到bionic如何处理系统和popen(源代码)到底,因为我认为如果使用NDK,你可以进行system()调用。

2 个答案:

答案 0 :(得分:1)

我建议您滚动自己的system版本。它根本不复杂,这将使您能够确定失败的确切系统调用以及失败的错误。最有可能的是,shell不正确,这就是产生错误的原因 - 你的库正在指定一个不存在的shell程序。

答案 1 :(得分:1)

(1)SHELL环境变量不太可能在Android上设置。默认shell /bin/sh不存在(AFAIK);它在/system/bin/sh。这可能是导致system失败的原因。

(2)您可以在GitHub上找到实现:systempopen。你在glibc中崩溃听起来像是一个库错误(除非你在信号处理程序或多线程环境中使用popen