【问题标题】:Issue with system() call when cross compiling for Android为 Android 交叉编译时 system() 调用出现问题
【发布时间】:2012-09-09 14:21:42
【问题描述】:

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

  • binutils-2.22
  • gcc-4.5.3 启用 gfortran
  • glibc-2.14.1
  • kernel-headers-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() 调用。

【问题讨论】:

  • 什么时候出现 glibc 错误?在popen 电话上?还是在那之后打电话?
  • /bin/sh 不在 Android 上;它在/system/bin/shAFAIK。 glibc 很可能只使用/bin/sh
  • nneonneo-你知道glibc中的system()调用在哪里处理吗?具体来说,源代码在哪里?除了修改源代码之外,有没有更好的方法来覆盖它的外观和环境变量?
  • David Schwartz-我相信它是在公开电话中。我之前通过它,但我会仔细检查。
  • systemsysdeps/posix/system.c;在 glibc-2.3 中弹出 libio/oldiopopen.c 中。

标签: android cross-compiling


【解决方案1】:

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

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

【讨论】:

  • SHELL 没有设置,但设置它本身并不能解决我的问题。需要回到更简单的测试用例,然后会报告回来。我认为按照你和大卫的建议,我可能会有一条前进的道路,但需要先更好地理解这个问题。
  • 嗯,原来system 使用#define SHELL_PATH "/bin/sh"。通过SHELL影响它太多了...
  • 修改 glibc 源代码以正确定义 shell 路径使系统调用正常工作,但对 popen 进行相同的更改并不能解决问题。现在进一步深入研究。
  • 我自欺欺人,一旦我修改了正确的文件,它确实对 popen 有效。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多