1. 程式人生 > >初步分析make的一個問題:Argument list too long

初步分析make的一個問題:Argument list too long

一個同事在編譯loadmodule時遇到了一個問題

gmake: execvp: /bin/sh: Argument list too long gmake: *** [     .o] Error 127

  這種情況以前並沒有遇到,一番google之後才知道這個是OS kernal的限制

在某些OS中,定義為ARG_MAX或者NCARGS,用來定義OS中引數的最大長度。

當出現這種問題時,我們應該關注argv[]和envp[],即引數本身和環境變數。對於環境變數,可以通過 env 檢視。若env長度過長,則可以考慮刪除不必要的環境變數。事實上,可以通過如下命令估計process可用於argrment的長度:

expr `getconf ARG_MAX` - `env|wc -c` - `env|wc -l` \* 4 - 2048
其中2048為POSIX所建議用於保證process可以安全修改環境變數所需要的buffer.

由於ARG_MAX/NCARGS 作為核心引數,修改起來並非易事,至少你需要root許可權。。。

比如在AIX中,可以執行 chdev -l sys0 -a ncargs=NewValue  ,指定新的長度

由於這個是在IDE中編譯出現的問題,其實分析起來會很頭疼,不透明啊。後來,我換了命令列編譯,OK了(神奇,無語ing)

至於修改核心引數並沒有試過,有時間還是得試試^_^

PS:

   如果只是在shell或者我們自己的程式中出現問題,可以考慮分割引數,或者使用xargs傳遞引數等等