OSXでは、g++
を使用したC++プログラムのコンパイル中に使用します
LD_FLAGS= -Wl,-stack_size,0x100000000
しかし、SUSE Linuxでは、次のようなエラーが常に発生します。
x86_64-suse-linux/bin/ld: unrecognized option '--stack'
と同様。
私はそれが使用可能であることを知っています
ulimit -s unlimited
ただし、これはニースではありません。常に1人のユーザーができるとは限りません。
LinuxでGCCを使用して単一のアプリケーションのスタックサイズを増やすにはどうすればよいですか?
setrlimit を使用して、プログラムでスタックサイズを設定できます。
#include <sys/resource.h>
int main (int argc, char **argv)
{
const rlim_t kStackSize = 16 * 1024 * 1024; // min stack size = 16 MB
struct rlimit rl;
int result;
result = getrlimit(RLIMIT_STACK, &rl);
if (result == 0)
{
if (rl.rlim_cur < kStackSize)
{
rl.rlim_cur = kStackSize;
result = setrlimit(RLIMIT_STACK, &rl);
if (result != 0)
{
fprintf(stderr, "setrlimit returned result = %d\n", result);
}
}
}
// ...
return 0;
}
注:このメソッドを使用してスタックサイズを増やす場合でも、main()
を入力するとすぐに、getrlimit
/setrlimit
の前にスタックオーバーフローが発生する可能性があるため、main()
自体で大きなローカル変数を宣言しないでください。コードはスタックサイズを変更する機会がありました。したがって、大きなローカル変数は、スタックサイズが正常に増加した後、main()
から後で呼び出される関数でのみ定義する必要があります。
の代わりに stack_size
、 つかいます --stack
そのようです:
gcc -Wl,--stack,4194304 -o program program.c
この例では、4 MBのスタックスペースが得られます。 MinGWのGCCで動作しますが、マンページにあるように、「このオプションは、リンカーのi386 PEターゲットポートに固有です」(つまり、Windowsバイナリの出力でのみ動作します)。 ELFバイナリにはオプションがないようです。
-fsplit-stack
オプションの使用を検討してください https://gcc.gnu.org/wiki/SplitStacks
Ulimit bashビルトインまたはsetrlimit()を使用して、またはPAM(pam_limits.so)を使用してログイン時に変更します。
設定可能なユーザーリソース制限です。 setrlimit(2)のRLIMIT_STACKを参照してください。
http://bytes.com/topic/c/answers/221976-enlarge-stack-size-gcc