前提・実現したいこと
・MingwのGCCにて、-fstack-protectorを使った際のセグメンテーションエラーについて原因を知りたいです。
・また、-fstack-protector以外に、デバッグ(特にメモリ破壊のチェック)に役立つものがありましたらご教授ください。(現在のMingwでは、mudflap は「gcc.exe: warning: switch '-fmudflap' is no longer supported」と拒否されます。ValgrindはWindowsに対応していないようです。)
発生している問題・エラーメッセージ
(元々は別の問題を解決するために)Mingwの最新版で、C言語のソースコードを-fstack-protector-all 指定してコンパイルしたところ、プログラム開始直後に
Program received signal SIGSEGV, Segmentation fault.
が発生します。
検証用のシンプルなプログラムでも同様の問題が発生するため、-fstack-protector-all の使い方?に問題があると考えています。
以下のコードを、次のコンパイルオプションでコンパイル、リンクしています。
コンパイルコマンド1
gcc -std=gnu99 -DUNICODE -D_UNICODE -Ddebug -g3 -O0 -static -Wextra -ftrapv -Wshadow -Wstrict-prototypes -Wmissing-declarations -Winit-self -Wswitch-default -Wswitch-enum -Wfloat-equal -Wcast-align -Wsign-compare -fstack-protector-all -ftrapv -Wall -Wuninitialized -s -c -o debug_tst.obj debug_tst.c
コンパイルコマンド2
gcc -std=gnu99 -static -fstack-protector-all -o debug_tst.exe debug_tst.obj
リンク
gcc -std=gnu99 -g3 -static -fstack-protector-all -ftrapv -o debug_tst.exe debug_tst.obj
該当のソースコード
C言語
1#include <stdio.h> 2#include <tchar.h> 3 4int funct(int a, int b); 5 6int funct(int a, int b){ 7 8 int c; 9 // 無意味な処理です 10 a = b; 11 c = a + b; 12 13 return c; 14} 15int main(int argc, char **argv){ 16//int _tmain(int argc, TCHAR **argv){ 17 18 int a, b, c; 19 20 if( argc>2 || argv==NULL ) return 1; 21 22 a = 1; 23 b = 2; 24 25 c = funct( a, b); 26 _tprintf( _T("c=%d\n"), c ); 27 28 return 0; 29} 30
試したこと
GDBで実行した場合、次のように即死します。
(gdb) run
Starting program: D:\work\debug_tst.exe
[New Thread 4868.0xda4]
Program received signal SIGSEGV, Segmentation fault.
0x0040147a in main (argc=1, argv=0x2d0f40) at debug_tst.c:18
18 int main(int argc, char **argv){
(gdb) bt
#0 0x0040147a in main (argc=1, argv=0x2d0f40) at debug_tst.c:18
(gdb) frame 0
#0 0x0040147a in main (argc=1, argv=0x2d0f40) at debug_tst.c:18
18 int main(int argc, char **argv){
(gdb) disp argc
1: argc = 1
(gdb) disp argv[0]
2: argv[0] = 0x2d1528 "D:\work\debug_tst.exe"
このように、バックトレースしてもほとんど何の情報もありません。
コンパイルオプションをできる限り削っていくと、-fstack-protector-all があるときだけ即死するようなのですが、バグの入るようなソースでもない上、そもそもmain()に入った途端にSegmentation faultというのが理解に苦しみます。
stack-protectorにバグがあるとは思えませんが、使用法の問題でしょうか?
なお、この機能については、「Binary Hacks(オライリー・ジャパン)」の
P168 HACK#46 -fstack-protector でスタックを保護する
を参考にしています。
補足情報(FW/ツールのバージョンなど)
開発環境
Win7 Home 32bit
gcc version 8.2.0 (MinGW.org GCC-8.2.0-3)
GNU gdb (GDB) 7.6.1
stack-protectorのバージョンは、次のように表示されています。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー