-1

私の PC では正常に動作するが、作業中のサーバーでコンパイルすると失敗する C プログラムで、不思議な現象が発生しています。基本的に 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);

プログラムが再び動作を開始します。

ここにいくつかの情報があります:

  • 私のPCのgccバージョン:4.8.4
  • サーバー上の gcc バージョン: 4.6.3
  • 上記のプログラムの組み立て: http://pastebin.com/nTagaErP

私のPCでコンパイルされたバージョンを使用すると、プログラムはサーバー上で正常に動作します。そのため、コンパイラに問題があると思われます。

4

1 に答える 1