2

私は初心者なので、表現が不正確かもしれません。アセンブラで C のシステムコール「execve」を作成する必要があります。私はライブラリを使用しません。動かない部分は

char *nul=(char *)0;
char *argv[] = { "/bin/date", nul };
char *envp[] = { nul };
long ret;
asm volatile ("int $0x80" : "=a" (ret) : "a" (11), "b" (argv[0]), "c" (argv), "d" (envp));
//"a" (11) ... 11 correspondes to execve

コードをコンパイルします(エラーも警告も表示されません)

gcc -m32 -nostdlib -nostdinc -static -O2 sysc.c -o sysc

プログラムを実行しようとすると、次のメッセージが表示されます。

A NULL argv[0] was passed through an exec system call.
Aborted
4

2 に答える 2

1

生成されたコードを見ると、 asm ブロックがそれらにアクセスしていないことを前提として、コンパイラがargvandの初期化を最適化していないことがわかりenvpます (ポインター自体が必要であることを宣言しているだけなので)。

解決策: "memory"clobber を追加して、任意のメモリを読み書きできることをコンパイラに伝えます。

于 2014-04-29T23:18:31.870 に答える