忘れたときに備えた記録

トップ 最新 追記
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2008-12-16(Tuesday)

プログラムのスタックサイズを変更する

デフォルトよりも大きなサイズのスタックを使いたい場合にどうしたらいいのか調べたのでメモです。

昔使っていたFM-TOWNSというマシンのCコンパイラだと、リンクするときにオプションで指定出来るようになっていたのを覚えていて、それと同じようにできるのかなと思っていました。

GCCに ld に渡すオプションを与える方法

$ man ld

すると、--stack というオプションでスタックサイズを指定できると分かりました。で、これをGCCから渡す方法はと調べてみると、

$ gcc -Wl,stack,1024 test.c

みたいに "-Wl," で指定できると分かりました。

しかし、Ubuntuでは(というかLinux全般、もしかしたらFreeBSDも?)そもそもldに--stackオプションを与えても「そんなオプションは知らん」と言ってきます。

それでさらに調べたところ、プログラムの実行時にスタックサイズを指定する方法があると分かりました。参考にしたのは実行時スタックサイズ変更 on Linux - 日々の報告書です。

bashのulimitでスタックサイズを指定

$ man bash

で出てくるbashのマニュアルに組み込みのulimitコマンドの解説があって、それによると -s オプションでスタックサイズを指定できるそうです。

実験

こんな感じのサンプルプログラムを用意してみました。

#include <stdio.h>
#include <alloca.h>

int MSIZE = 10;

int main()
{
   void *p;
   p = alloca(MSIZE*1024*1024);

   if(p==NULL)
      printf("NULL\n");
   else
      printf("OK\n");

   return 0;
}

コンパイルして

$ gcc -o test test.c

実行すると、エラーになります。

$ ./test
Segmentation fault

ここでulimitコマンドでスタックサイズを指定すると

$ ulimit -s 20480

問題なく動きます。

$  ./test
OK
Tags: Linux

2008-12-26(Friday)

人当てゲーム

これに僕が適当に思い浮かべたドラえもんとレオン・S・ケネディを当てられてしまいました。どんぴしゃで。