Android交叉编译时system()调用出现问题

Android交叉编译时system()调用出现问题,android,cross-compiling,Android,Cross Compiling,基于NDK standalone toolchain和bionic的一些限制,我使用crosstool NG和以下常规设置推出了自己的工具链: 比努蒂尔斯-2.22 启用gfortran的gcc-4.5.3 glibc-2.14.1 kernel-headers-2.35.7 拱形臂4T 使用它,我构建了一个可执行文件,并将所有依赖项(包括libc、ld-linux等)上传到我的Android设备上。我使用ld linux.so.3--库路径手动运行可执行文件 这是一个非常复杂的可执行文件,

基于NDK standalone toolchain和bionic的一些限制,我使用crosstool NG和以下常规设置推出了自己的工具链:

  • 比努蒂尔斯-2.22
  • 启用gfortran的gcc-4.5.3
  • glibc-2.14.1
  • kernel-headers-2.35.7
  • 拱形臂4T
使用它,我构建了一个可执行文件,并将所有依赖项(包括libc、ld-linux等)上传到我的Android设备上。我使用ld linux.so.3--库路径手动运行可执行文件

这是一个非常复杂的可执行文件,它似乎都能工作,除了,如果我执行任何system()调用,甚至是一些基本的东西,比如system(“pwd”)或system(NULL),我会得到127作为状态(not found)。如果我进一步使用popen来收集响应,我会得到:

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


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

我建议只运行您自己版本的
系统
。它一点也不复杂,这将使您能够确定失败的确切系统调用以及失败的错误。最有可能的是,shell不正确,这就是产生错误的原因——您的库正在指定一个不存在的shell程序。(1)
shell
环境变量不太可能在Android上设置。默认shell
/bin/sh
不存在(AFAIK);它在
/system/bin/sh
中。这可能是导致
系统
失败的原因


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

什么时候出现glibc错误?在
popen
通话中?或者在那之后打电话?
/bin/sh
不在Android上;它在
/system/bin/sh
AFAIK中。glibc很可能只使用了
/bin/sh
。nnone您知道glibc在哪里处理system()调用吗?具体来说,源代码在哪里?除了修改源代码,还有没有更好的方法来覆盖它的外观,比如和环境变量。我之前已经检查过了,但我会再次检查。
system
位于
sysdeps/posix/system.c
;popen位于glibc-2.3中的libio/oldiopopen.c中。SHELL未设置,但设置它本身并不能解决我的问题。需要返回到一个更简单的测试用例,然后将返回报告。我想按照你和David的建议,我可能会有一条前进的道路,但首先需要更好地理解这个问题。事实证明,
system
使用了
#define SHELL_path”/bin/sh
。通过
SHELL
…修改glibc源代码以正确定义SHELL路径可以使系统调用正常工作,但是对popen进行相同的更改并不能解决问题。现在再深入一点,我骗了自己,一旦我修改了正确的文件,它对popen确实有效。