web-dev-qa-db-ja.com

GNUコンパイラーによるコンパイル中のLinuxでのC ++アプリケーションのスタックサイズの変更

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を使用して単一のアプリケーションのスタックサイズを増やすにはどうすればよいですか?

41
asdf

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()から後で呼び出される関数でのみ定義する必要があります。

56
Paul R

の代わりに stack_size、 つかいます --stack そのようです:

gcc -Wl,--stack,4194304 -o program program.c

この例では、4 MBのスタックスペースが得られます。 MinGWのGCCで動作しますが、マンページにあるように、「このオプションは、リンカーのi386 PEターゲットポートに固有です」(つまり、Windowsバイナリの出力でのみ動作します)。 ELFバイナリにはオプションがないようです。

14
AndiDog

-fsplit-stackオプションの使用を検討してください https://gcc.gnu.org/wiki/SplitStacks

2
Sergei

Ulimit bashビルトインまたはsetrlimit()を使用して、またはPAM(pam_limits.so)を使用してログイン時に変更します。

設定可能なユーザーリソース制限です。 setrlimit(2)のRLIMIT_STACKを参照してください。

http://bytes.com/topic/c/answers/221976-enlarge-stack-size-gcc

1
f0ster