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