[PR]恋愛の悩みなら:こころtoからだで診断!
、ェチー、マテッ。ゥ
・ケ。シ・トツイ。ゥ
・ッ。シ・・モ・コ、ヌ、ケ
wo、ヌ、ケ
w_o、マソ萓ゥ、オ、、゙、サ、
、マ、ニ、ハID3ハクサ、ネ、、、ヲタゥクツ、ォ、
エトカュ、ヒヘ・、キ、、テヒ
About
、ウ、、マイソ。ゥ
g++、ホホ羌ース靉、イフタ、キ、゙、ケ
g++、ホホ羌ー、ーキ、、、゙、ケ
テーユサケ
・ュ・罕テ・チ・ワ。シ・、マ、ヌ、ュ、゙、サ、
ナ熙イハヨ、サ、゙、サ、
ナ熙イハヨ、キ、ニ、ュ、゙、サ、
フワナェ
イソクホホ羌ー、ホサナチネ、゚、ウリ、ヨ、ホ、ォ。ゥ
クカヘ、テホ、鬢ハ、、、筅ホ、サネ、ヲ、ホ、マ、「、、゙、熙隍ッ、ハ、、
テホ、、ヲ、ネ、ケ、ソエ、ャツ扈
・ウ・ケ・ネ、ャ、、ォ、鬢ハ、、、ネノン、ッ、ニオ。ヌス、ャサネ、ィ、ハ、、
、ニ、讀ォホ羌ー、ニイソ。ゥ
ホ羌ース靉、マクタク、ホオ。ヌス、ヒ、隍テ、ニ、ハ、、ネ、ォ、ヌ、ュ、、筅ホ、ヌ、マ、ハ、、、ヌ、ケ。ェ。ェ
、ス、ホマテ、マニ簣ニ、ネ、マチエチウエリキクフオ、、、、ヌ、ケ、ャ。ェ。ェ
、ス、ウ、鬢リ、、マ、゙、ソオ、、ャク、、、ソ、鮨、ュ、゙、ケ。」
、ネ、譯シ、ホ、マチエノアウ、ヌ、ケ。ェ。ェ
オ、、ャク、、、ソ、ホ、ヌ、荀熙゙、キ、ソ
、ス、筅ス、磴++、ヌホ羌ー、テ、ニサネ、、ハ、、、キ
フワナェ
gcc 、ヌーネヨ、隍ッサネ、ヲ・ェ・ラ・キ・逾、マ -S 、ヌ、ケ。ェ。ェ
ホ羌ース靉、マイソ、ヌ、ヌ、ュ、ニ、、、。ゥ
unwind
トカreturn
typeinfo
throw、オ、、ソ・ェ・ヨ・ク・ァ・ッ・ネ、ャcatch、ヌ、ュ、、ォ、ノ、ヲ、ォ
ホ羌ース靉、マイソ、ヌ、ヌ、ュ、ニ、、、。ゥ
- ナ熙イ、・ェ・ヨ・ク・ァ・ッ・ネタクタョ
- unwind、ホシツケヤ
- catch、ヌ、ュ、、ォ、ノ、ヲ、ォ、ホネスト
- 、ヌ、ュ、、ハ、馗atch
- 、ヌ、ュ、ハ、、、ハ、鬢オ、鬢ヒunwind
unwind、マイソ
ツ邁霤ヲスミ
ソァ。ケサナチネ、゚
ナ熙イ、ソ・ェ・ヨ・ク・ァ・ッ・ネエノヘ
・マ・・ノ・鮑。コ
・ッ・遙シ・・「・テ・ラ
、ウ、ウ、鬢リ、、マ Itanium C++ ABI 、
type_info
do_catch() ・皈ス・テ・ノ
catch、ヌ、ュ、、ォ、ノ、ヲ、ォ、ホネスト
ホ羌ー、ハ皃゙、ィ、、ヒ、マ
、ャシォヘウ、ヒサネ、ィ、、ミ、隍、
type_info 、サネ、ヲ
フオヘフヘケスツ、ツホ
スタニ、ハtype_info
C++、ホ、サネ、ヲ
シネエ、ュ
C++、ホtype_info、サネ、ヲ
フセチー mangling ・。シ・、ウミ、ィ、ニextern
extern char _ZTIPKc[];
// TI = type info
// PKc = pointer to const char
mangling、マ、ス、、ハ、ヒニ、キ、ッ、ハ、、、ヌ、ケ
C++ mangling
エキ、、、ミ
class Nanika { };
// _ZTIN6NanikaE
namespace ns { template <class T> class A {}; }
// ns::A<int> 「ェ _ZTIN2ns1AIiEE
template < unsigned int i > struct C { };
// C<0xffff> 「ェ _ZTIN1CILi65535EEE
、ウ、ホ、ー、鬢、、ヌ、ュ、、隍ヲ、ヒ、ハ、熙゙、ケ
イソ、ホフ、ヒ、簧ゥ、チ、゙、サ、、ャ
unwind 、ヘイ、ケ、
unwind-SjLj
setjmp longjmp 、ヘヘム
unwind-dwarf2
DWARF2、ホ・ケ・ソ・テ・ッエャ、ュフ皃キ、ヘヘム
DWARF2、ネ、マ。ゥ
・ヌ・ミ・テ・ーセハ・ユ・ゥ。シ・゙・テ・ネ
・ヌ・ミ・テ・ーセハ。ゥ
int func2( int i ) { return i; }
int func1( int i ) { return func2( i ); }
int main() { func1 ( 3 ); }
(gdb) bt
#0 func2 (i=3) at debug.c:3
#1 0x08048368 in func1 (i=3) at debug.c:8
#2 0x08048388 in main () at debug.c:13
・ケ・ソ・テ・ッ・ユ・。シ・狎ハ、ャオュマソ、オ、、ニ、、マ、コ
DWARF2、ホ・ユ・。シ・狎ハ、マイソ、ヌ、ヌ、ュ、ニ、、、。ゥ
、、、ッ、ト、ォ、ホ・ス。シ・ケ、・ウ・・ム・、・、キ、ニサ、キ、ニ、゚、゙、ケ
void bar(){ throw 4; }
int foo() {
try { bar(); }
catch ( const char *msg ) { return 0x8888; }
return 0;
}
int main() {}
、ウ、、ホ・ウ・・ム・、・キイフ、マ。ゥ
DWARF2、ホ・ユ・。シ・狎ハ、マイソ、ヌ、ヌ、ュ、ニ、、、。ゥ
.LFE7:
.size main, .-main
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zPL"
.uleb128 0x1
.sleb128 -4
.byte 0x8
.uleb128 0x6
.byte 0x0
.long __gxx_personality_v0
.byte 0x0
.byte 0xc
.uleb128 0x4
.uleb128 0x4
.byte 0x88
.uleb128 0x1
.align 4
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB3
.long .LFE3-.LFB3
.uleb128 0x4
.long 0x0
.byte 0x4
.long .LCFI0-.LFB3
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x5
.align 4
.LEFDE1:
.LSFDE3:
.long .LEFDE3-.LASFDE3
.LASFDE3:
.long .LASFDE3-.Lframe1
.long .LFB5
.long .LFE5-.LFB5
.uleb128 0x4
.long .LLSDA5
.byte 0x4
.long .LCFI3-.LFB5
.byte 0xe
.uleb128 0x8
.byte 0x85
.uleb128 0x2
.byte 0x4
.long .LCFI4-.LCFI3
.byte 0xd
.uleb128 0x5
.align 4
.LEFDE3:
ニノ、皃゙、サ、
DWARF2、ホ・ユ・。シ・狎ハ、マイソ。ゥ
サナハ、ャフオ、、、ホ、ヌタ篶タ、キ、゙、ケ
シツケヤ・「・ノ・・ケ、ォ、鬣ェ・ユ・サ・テ・ネ、キラササ、ケ、・ラ・・ー・鬣
・ラ・・ー・鬣゚・・ークタク DWARF2。ェ。ェ
・ラ・・ー・鬣゚・・ークタクDWARF2
、、、ッ、ト、ォ、ホ・・ク・ケ・ソ
・ェ・ユ・サ・テ・ネ
セツヨ
CFA
Return Address
・ェ・ユ・サ・テ・ネキラササ・ラ・・ー・鬣
・ラ・・ー・鬣゚・・ークタクDWARF2
フソホ皈サ・テ・ネ
DW_CFA_def_cfa
DW_CFA_offset
DW_CFA_advance_loc
DW_CFA_def_cfa_expression
・ラ・・ー・鬣゚・・ークタクDWARF2
CIE ( Common Information Entry )
ハ」ソ、ホ・ラ・・ー・鬣爨ヌカヲヘュ、ヌ、ュ、ノハャ
・「・鬣、・・皈・ネナ
DWARF2・・ク・ケ・ソ、ネCPU・・ク・ケ・ソ、ホツミア、゚、ソ、、、ハ、筅ホ
FDE (Frame Description Entry)
シツケヤセス熙ヒーヘツク、ケ、、ホ、ヌカヲヘュ、ヌ、ュ、ハ、、ノハャ
・ユ・。シ・爨ホツ遉ュ、オ
ナ熙イ、
ナ熙イ、、ホ、マエハテア
g++ 、ホナ熙イ、 API 、ヘヘム
__cxa_allocate_exception
__cxa_throw
「ィエャ、ュフ皃キ、ャ、ヌ、ュ、、隍ヲ、ヒDWARF2・ニ。シ・ヨ・、、ッ、テ、ト、ア、ニ、ェ、ッ
ナ熙イ、
#include
struct type_info;
extern char _ZTIPKc[];
void *__cxa_allocate_exception( size_t size );
void __cxa_throw( void *obj,
struct type_info *tinfo,
void (*dest) (void*) ) __attribute__ ((__noreturn__));
void throw_string( void ) {
const char **ptr = (const char**)__cxa_allocate_exception( sizeof(char*) );
*ptr = "nanika";
__cxa_throw( ptr, (struct type_info*)_ZTIPKc, NULL );
}
void throw_string_end(void){}
__asm__ (
".section .eh_frame, \"a\", @progbits\n"
".cie:\n"
".long .cie_end-.cie_begin\n"
".cie_begin:\n"
".long 0\n"
".byte 1\n"
".ascii \"\\0\"\n"
".uleb128 1\n"
".sleb128 -4\n"
".byte 8\n"
".uleb128 0\n"
".byte 0xc # DW_CFA_def_cfa\n"
".uleb128 0x4\n"
".uleb128 0x4\n"
".byte 0x88 # DW_CFA_offset, column 0x8\n"
".uleb128 0x1\n"
".align 4\n"
".cie_end:\n"
);
__asm__ (
".fde:\n"
".long .fde_end-.fde_begin\n"
".fde_begin:\n"
".long .fde_begin-.cie\n"
".long throw_string\n"
".long throw_string_end - throw_string\n"
".uleb128 0x0 # Augmentation size\n"
".byte 0xe # DW_CFA_def_cfa_offset\n"
".uleb128 0x8\n"
".byte 0x85 # DW_CFA_offset, column 0x5\n"
".uleb128 0x2\n"
".byte 0xd # DW_CFA_def_cfa_register\n"
".uleb128 0x5\n"
".align 4\n"
".fde_end:\n");
ニノ、皃゙s(ry
ナ熙イ、
#include
struct type_info;
extern char _ZTIPKc[];
void *__cxa_allocate_exception( size_t size );
void __cxa_throw( void *obj,
struct type_info *tinfo,
void (*dest) (void*) ) __attribute__ ((__noreturn__));
void throw_string( void ) {
const char **ptr = (const char**)__cxa_allocate_exception( sizeof(char*) );
*ptr = "nanika";
__cxa_throw( ptr, (struct type_info*)_ZTIPKc, NULL );
}
void throw_string_end(void){}
__asm__ (
".section .eh_frame, \"a\", @progbits\n"
".cie:\n"
".long .cie_end-.cie_begin\n"
".cie_begin:\n"
".long 0\n"
".byte 1\n"
".ascii \"\\0\"\n"
".uleb128 1\n"
".sleb128 -4\n"
".byte 8\n"
".uleb128 0\n"
".byte 0xc # DW_CFA_def_cfa\n"
".uleb128 0x4\n"
".uleb128 0x4\n"
".byte 0x88 # DW_CFA_offset, column 0x8\n"
".uleb128 0x1\n"
".align 4\n"
".cie_end:\n"
);
__asm__ (
".fde:\n"
".long .fde_end-.fde_begin\n"
".fde_begin:\n"
".long .fde_begin-.cie\n"
".long throw_string\n"
".long throw_string_end - throw_string\n"
".uleb128 0x0 # Augmentation size\n"
".byte 0xe # DW_CFA_def_cfa_offset\n"
".uleb128 0x8\n"
".byte 0x85 # DW_CFA_offset, column 0x5\n"
".uleb128 0x2\n"
".byte 0xd # DW_CFA_def_cfa_register\n"
".uleb128 0x5\n"
".align 4\n"
".fde_end:\n");
ハ皃゙、ィ、
void are( ) {
try {
「ャ catch、ケ、ネマーマ
nanika1(); 。テ
nanika2(); 。テ
「ュ
} catch ( Type t /*catch、ケ、キソ*/ ) {
/// ・マ・・ノ・鬣「・ノ・・ケ
...
}
}
ハ皃゙、ィ、
LSDA (Language Specific Data Area)
ハ皃゙、ィ、ネマーマ
ハ皃゙、ィ、キソ
・マ・・ノ・鬢ホ・「・ノ・・ケ
LSDA、ホ・ユ・ゥ。シ・゙・テ・ネ
.section .gcc_except_table
.align 4
.func_lsda:
.byte 0xff # ・ユ・ゥ。シ・゙・テ・ネ
.byte 0x0 # ・ユ・ゥ。シ・゙・テ・ネ
.uleb128 .ttd_end - .ttd_start # ツ遉ュ、オ
.ttd_start:
.byte 0x1 # ・ユ・ゥ。シ・゙・テ・ネ
# ・ニ。シ・ヨ・ツ遉ュ、オ
.uleb128 .call_site_end-.call_site_begin
.call_site_begin:
.uleb128 .region_begin - func # ハ皃゙、ィ、ネマーマ、マ、ク、
.uleb128 .region_end-.region_begin # ハ皃゙、ィ、ネマーマトケ、オ
.uleb128 .handler_begin - func # ・マ・・ノ・鬣「・ノ・・ケ
.uleb128 0x1 # ハ皃゙、ィ、キソサリト
.call_site_end:
.byte 0x1 # ハ皃゙、ィ、キソ、゙、ヌ、ホ・ェ・ユ・サ・テ・ネ
.byte 0x0
.align 4
.long _ZTIPKc # ハ皃゙、ィ、キソ
.ttd_end:
LSDA ・ユ・ゥ。シ・゙・テ・ネ
LSDA・「・ノ・・ケ、FDE、ヒヒ荀皃ニ、ェ、ッ
.fde_begin:
.long .fde_begin-.cie
.long func
.long .func_end - func
.uleb128 0x4 # Augmentation size
.long .func_lsda # 、ウ、ウ、ヒ
.byte 0xe # DW_CFA_def_cfa_offset
.uleb128 0x8
....
catchス靉
Unwindウォサマ
FDEネックォ
CIEネックォ
LSDAネックォ
・「・ノ・・ケネマーマ・チ・ァ・テ・ッ
catch、ケ、キソ・チ・ァ・テ・ッ
・マ・・ノ・魴ッニー
C、ヌハ皃゙、ィ、
#include <stdio.h>
extern void throw_func( void );
int a;
void func()
{
asm(".region_begin:");
throw_func();
asm(".region_end:");
puts("kokoniha konai");
asm(".handler_begin:");
puts("catch!!!!");
asm(".handler_end:");
}
asm(".func_end:");
asm("\t\n"
"\t.size _Z5func3v, .-_Z5func3v\n"
"\t.section .gcc_except_table\n"
"\t.align 4\n"
".func_lsda:\n"
"\t.byte 0xff # @LPStart format (omit)\n"
"\t.byte 0x0 # @TType format (absolute)\n"
"\t.uleb128 .ttd_end - .ttd_start # @TType base offset\n"
".ttd_start:\n"
"\t.byte 0x1 # call-site format (uleb128)\n"
"\t.uleb128 .call_site_end-.call_site_begin # Call-site table length\n"
".call_site_begin:\n"
"\t.uleb128 .region_begin - func # region 0 start\n"
"\t.uleb128 .region_end-.region_begin # length\n"
"\t.uleb128 .handler_begin - func # landing pad\n"
"\t.uleb128 0x1 # action\n"
".call_site_end:\n"
"\t.byte 0x1 # Action record table\n"
"\t.byte 0x0\n"
"\t.align 4\n"
"\t.long _ZTIi\n"
".ttd_end:\n"
"\t\n");
__asm__ (
"\t.section .eh_frame, \"a\", @progbits\n"
"\t.cie:\n"
"\t.long .cie_end-.cie_begin\n"
"\t.cie_begin:\n"
"\t.long 0\n"
"\t.byte 1\n"
"\t.ascii \"zPL\\0\" # CIE Augmentation\n"
"\t.uleb128 1\n"
"\t.sleb128 -4\n"
"\t.byte 8\n"
"\t.uleb128 0x6 # Augmentation size\n"
"\t.byte 0x0 # Personality (absolute)\n"
"\t.long __gxx_personality_v0\n"
... madamadatuzukuyo-
(ry
、゙、ネ、
・ュ・罕テ・チ・ワ。シ・、マ、ヌ、ュ、゙、サ、
gcc、ヌーネヨサネ、ヲ・ェ・ラ・キ・逾、マ -S 、ヌ、ケ
ハクサ、マツ遉ュ、ッ
コ」ク螟ホインツ
、チ、网、ネ、゙、ネ、皃ソサホチ、コ、
GCC・ユ・・・ネ・ィ・・ノ、ォ、鮑ォ、ソ・、・・ソ。シ・ユ・ァ。シ・ケ
・ラ・・ー・鬣゚・・ークタクDWARF2、ホクヲオ
オ、、ャク、、、ソ、鬢荀熙゙、ケ。」。ハ、ネ。「、、、ヲ、ホ、マ。「、荀鬢ハ、、、ネ、、、ヲーユフ」、ヌ、ケ、陦ヒ
、エタナトー、「、熙ャ、ネ、ヲ、エ、カ、、、゙、キ、ソ
are 、ネ、マ
- ・「・、ホ、ウ、ネ
- 、「、、ホ、ウ、ネ
- are 、ホ、ウ、ネ
are3
foo, hoge, nanika, are
foo - ウーソヘ
hoge - ニヒワソヘ
nanika - イソ、ォ
are - ・「・
are4
foo 、ネ hoge 、コョ、シ、キ
int hoge() { }
int fuga() { }
/* シ。、ャサラ、、ノユ、ォ、ハ、、。ェ。ェ */
int foo() { }
int bar() { }
int baz() { }
、ス、、マ、、、、、ホ、ォ。ェ。ゥ
are5
are 、サネ、ェ、ヲ。ェ。ェ
int are() { }
int sore() { }
int nanika() { }
int doreka() { }
class Asoko { };
ナチナ、ホスナ、゚、ャフオ、、、ホ、ヌサラ、、ノユ、ュ、ヌシォヘウ、ヒサネ、ヲ、ウ、ネ、ャイトヌス。ェ。ェ
are6
are