2014-04-29 95 views
2

我是一個新手,所以我可以用表達式不準確。我需要用匯編語言在C語言中調用「execve」。我不使用任何庫。不工作的部分是無法執行系統調用「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 
+0

你嘗試通過'&argv'通過ECX? – ccKep

+2

爲什麼您需要使用匯編程序從C程序中調用C函數? (我並不是說沒有可能的原因,但知道你的目標可能有助於回答這個問題。) –

+0

'c'也應該是'argv [0]'。指向數組的指針在C中非常罕見且毫無用處;通常你總是在指向第一個*元素的指針上操作。 –

回答

1

如果你看看生成的代碼,你會發現編譯器優化了argvenvp的初始化,假設你的asm塊沒有訪問它們(因爲你只聲明你自己需要指針)。

解決方案:添加一個"memory" clobber告訴編譯器您可以讀取或寫入任何內存。

0

exec()系列函數的參數有點奇怪。

特別是爲arg0和ARG1大致相同的事情:

char *args [] = {"./path/to/program", "arg1", "arg2", NULL}; 

int rc = execve (args[0], args, envp);