0

基于 NDK 独立工具链和仿生的一些限制,我使用带有这些常规设置的 crosstool-NG 推出了自己的工具链:

  • binutils-2.22
  • 启用了 gfortran 的 gcc-4.5.3
  • glibc-2.14.1
  • 内核头文件 2.35.7
  • 拱臂4t

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

这是一个非常复杂的可执行文件,它似乎都可以工作,除非我进行任何 system() 调用,即使是一些基本的东西,比如 system("pwd") 或 system(NULL) 我得到 127 作为状态(未找到) . 如果我更进一步并使用 popen 来收集响应,我会得到:

*检测到 glibc *双重释放或损坏

到底是怎么回事?有没有人成功地做类似的?有权限问题吗?Android 是否有一些根本不同的东西使得 system() 调用不可能?我在哪里可以找到仿生最终如何处理 system 和 popen(源代码),因为我认为如果您使用 NDK,您可以进行 system() 调用。

4

2 回答 2

1

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

于 2012-09-09T06:18:01.463 回答
1

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

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

于 2012-09-09T06:21:42.270 回答