我尝试编译简单实用程序(内核3.4.67),其中 它只是尝试使用系统调用非常简单如下:
int main(void)
{
int rc;
printf("hello 1\n");
rc = system("echo hello again");
printf("system returned %d\n",rc);
rc = system("ls -l");
printf("system returned %d\n",rc);
return 0;
}
然而,系统调用失败,您可以在以下日志中看到:
root@w812a_kk:/ # /sdcard/test
hello 1
system returned 32512
system returned 32512
我将其编译为以下:
arm-linux-gnueabihf-gcc -s -static -Wall -Wstrict-prototypes test.c -o test
这真的很奇怪,因为我过去在不同的linux中使用过系统,从来没有遇到任何问题。 我甚至尝试了另一个交叉cpompiler但我也遇到了同样的失败。
内核版本&交叉编译器:
# busybox uname -a
Linux localhost 3.4.67 #1 SMP PREEMPT Wed Sep 28 18:18:33 CST 2016 armv7l GNU/Linux
arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1-4.7-2013.03-20130313 - Linaro GCC 2013.03) 4.7.3 20130226 (prerelease)
修改:
root@w812a_kk:/ # echo hello again && echo $? && echo $0
hello again
0
tmp-mksh
root@w812a_kk:/ #
但我确实找到了一些有趣的东西: 在使用main调用test_expander()时,它可以正常工作。所以我怀疑也许系统调用试图找到一个没有建立的二进制文件?
int test_expander(void)
{
pid_t pid;
char *const parmList[] = {"/system/bin/busybox", "echo", "hello", NULL};
if ((pid = fork()) == -1)
perror("fork error");
else if (pid == 0) {
execv("/system/bin/busybox", parmList);
printf("Return not expected. Must be an execv error.n");
}
return 0;
}
谢谢你的任何想法。
冉
答案 0 :(得分:1)
system()的返回值,十进制32512,是十六进制的7F00。
此值与0x7F非常相似,如果/bin/sh
无法执行,则为0x(系统)的结果。似乎字节排序存在一些问题(大/小端)。很奇怪。
更新:在撰写答案时,您编辑了问题并提取了有关/system/bin/busybox
。
可能你根本就没有/bin/sh
。
答案 1 :(得分:1)
我想我明白会发生什么
从系统手册页:
The system() library function uses fork(2) to create a child process
that executes the shell command specified in command using execl(3)
as follows:
execl("/bin/sh", "sh", "-c", command, (char *) 0);
但是在我的文件系统sh
中只建立/ system / bin,而不是在/ bin
所以我最好只使用execv。 (我不能做静态链接,因为它是只读文件系统)
谢谢, 然