2016-01-14 289 views
-1

我遇到了一些神祕的東西,它可以在我的電腦上正常工作,但在我正在編譯的服務器上編譯時出現故障。基本上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); 

程序開始再次工作。

下面是一些信息:在我的電腦

當我使用在我的電腦上編譯的版本時,程序在服務器上正常工作,這就是爲什麼我認爲編譯器有問題。

+0

「execve」失敗的原因是什麼? (提示:你目前的程序沒有告訴你,你應該改變它,所以它會告訴你,無論是perror還是strerror(errno)) – immibis

+2

你的argv和envp都構造不正確。閱讀手冊頁。 –

回答

4

argvchar*的一個數組,應該以NULL指針終止。換句話說,最後一個有效的元素後面的元素應該是NULL

envp是一個相似的構造。您應該聲明您的envpchar*[],就像您對argv所做的一樣,並將其不帶&傳遞給execve

注意:大多數情況下,當你的程序不工作時,這不是一個編譯器錯誤。您的編譯器和操作系統庫已經過數百萬次測試,如果有錯誤,它通常在到達您之前已經修復。