Android交叉编译时system()调用出现问题
基于NDK standalone toolchain和bionic的一些限制,我使用crosstool NG和以下常规设置推出了自己的工具链: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--库路径手动运行可执行文件 这是一个非常复杂的可执行文件,
- 比努蒂尔斯-2.22
- 启用gfortran的gcc-4.5.3
- glibc-2.14.1
- kernel-headers-2.35.7
- 拱形臂4T
发生了什么事?有人成功地做过类似的事情吗?是否存在权限问题?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确实有效。