2017-01-13 2 views
1

я пытаюсь скомпилировать простую утилиту (ядро 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; 

} 

Тем не менее, системный вызов не, как вы можете видеть в следующий журнал:

[email protected]_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) 

EDIT:

root[email protected]_kk:/ # echo hello again && echo $? && echo $0 
hello again 
0 
tmp-mksh 
[email protected]_kk:/ # 

Но я нашел кое-что интересное: на вызове 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; 
} 

Благодарим за любую идею.

Ran

+0

Что '$ эхо привет again' возвращение в скорлупе? Попробуйте скопировать «hello again» в буфер и передать его в 'system()'. –

+0

Он ничего не возвращает (вот в чем проблема). Кажется, что системный вызов ничего не делает :(, я не знаю, почему – ransh

+0

Я имел в виду, что такое '$?' После выполнения 'echo', как указано в предыдущей команде? –

ответ

1

Возвращаемое значение системы(), 32512 десятичной, находится в шестнадцатеричном 7F00. Это значение странно похоже на 0x7F, которое является результатом системы(), если /bin/sh не может быть выполнен. Кажется, что есть некоторая проблема с порядком байтов (большой/маленький конец). Очень странно.

Обновление: при написании ответа вы отредактировали вопрос и втянули что-то около /system/bin/busybox.

Возможно, у вас просто нет /bin/sh.

+0

спасибо, я получил это примерно в то же время. – ransh

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 основана только/система/бен, а не в/бен

Так что я лучше просто используйте execv. (Я не могу сделать статическую ссылку becuase это только для чтения файловой системы)

Спасибо, Ран

Смежные вопросы