2016-01-14 2 views
-1

Я испытываю что-то таинственное с программой на C, которая отлично работает на моем компьютере, но не удается, когда я скомпилирую ее на сервере, над которым я работаю. В основном выполняется выполнение execve. Оригинальная программа не слишком большая, поэтому я начал резать некоторые части, чтобы попытаться понять, где может быть проблема.Ошибка компилятора из-за ошибки execve?

Здесь крой программы (это просто вырезать так из-конечно, это не имеет никакого смысла), ну, здесь до сих пор execve не удается:

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <sys/wait.h> 

int main(){ 
    // Arguments 
    char *argv[100] = {"/home/input/input", [1 ... 99] = "A"}; 

    //The real program would use some pipes later 
    int pipestdin[2]; 
    int pipestderr[2]; 

    pipe(pipestdin); 
    pipe(pipestderr); 

    // Call 
    char *env = "\xde\xad\xbe\xef=\xca\xfe\xba\xbe"; 
    execve("/home/input/input",argv,&env); // Execute the program 
    printf("ERROR\n"); // printed only if execve fails 

    return 0; 

}

но когда Я вынимаю эту часть:

int pipestdin[2]; 
    int pipestderr[2]; 

    pipe(pipestdin); 
    pipe(pipestderr); 

программа начинает работать снова.

Вот некоторая информация:

  • GCC версии на моем компьютере: 4.8.4
  • GCC версии на сервере: 4.6.3
  • Сборка программы выше: http://pastebin.com/nTagaErP

Программа работает нормально на сервере, когда я использую версию, скомпилированную на моем компьютере, поэтому я полагаю, что есть проблема с компилятором.

+0

И с какой ошибкой происходит 'execve' с? (Подсказка: ваша текущая программа не говорит вам. Вы должны изменить ее так, чтобы она говорила вам, с perror или strerror (errno)) – immibis

+2

Ваши argv и envp построены неправильно. Прочтите страницу руководства. –

ответ

4

argv - массив из char*, который должен быть завершен указателем NULL. Другими словами, элемент, следующий за последним действительным, должен быть NULL.

envp - аналогичная конструкция. Вы должны объявить свой envp как char*[], как и то, что вы сделали с argv, и передать его без & в execve.

Обратите внимание: большую часть времени, когда ваша программа не работает, это не ошибка компилятора. Ваши библиотеки для компилятора и ОС были протестированы миллионами, и если возникла ошибка, она обычно фиксируется до ее достижения.

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