[PR]恋愛の悩みなら:こころtoからだで診断!

g++、ネホ羌ー・ュ・罕テ・チ・ワ。シ・

テ貭シ ケァサヒ(wo)

、ェチー、マテッ。ゥ

・ケ。シ・トツイ。ゥ

・ッ。シ・・モ・コ、ヌ、ケ

wo、ヌ、ケ

w_o、マソ萓ゥ、オ、、゙、サ、

、マ、ニ、ハID3ハクサ、ネ、、、ヲタゥクツ、ォ、

エトカュ、ヒヘ・、キ、、テヒ

About

、ウ、、マイソ。ゥ

g++、ホホ羌ース靉、イフタ、キ、゙、ケ

g++、ホホ羌ー、ーキ、、、゙、ケ

テーユサケ

・ュ・罕テ・チ・ワ。シ・、マ、ヌ、ュ、゙、サ、

ナ熙イハヨ、サ、゙、サ、

ナ熙イハヨ、キ、ニ、ュ、゙、サ、

フワナェ

イソクホホ羌ー、ホサナチネ、゚、ウリ、ヨ、ホ、ォ。ゥ

クカヘ、テホ、鬢ハ、、、筅ホ、サネ、ヲ、ホ、マ、「、、゙、熙隍ッ、ハ、、

テホ、、ヲ、ネ、ケ、ソエ、ャツ扈

・ウ・ケ・ネ、ャ、、ォ、鬢ハ、、、ネノン、ッ、ニオ。ヌス、ャサネ、ィ、ハ、、

、ニ、讀ォホ羌ー、ニイソ。ゥ

ホ羌ース靉、マクタク、ホオ。ヌス、ヒ、隍テ、ニ、ハ、、ネ、ォ、ヌ、ュ、、筅ホ、ヌ、マ、ハ、、、ヌ、ケ。ェ。ェ

、ス、ホマテ、マニ簣ニ、ネ、マチエチウエリキクフオ、、、、ヌ、ケ、ャ。ェ。ェ

、ス、ウ、鬢リ、、マ、゙、ソオ、、ャク、、、ソ、鮨、ュ、゙、ケ。」

、ネ、譯シ、ホ、マチエノアウ、ヌ、ケ。ェ。ェ

オ、、ャク、、、ソ、ホ、ヌ、荀熙゙、キ、ソ

、ス、筅ス、磴++、ヌホ羌ー、テ、ニサネ、、ハ、、、キ

フワナェ

gcc 、ヌーネヨ、隍ッサネ、ヲ・ェ・ラ・キ・逾、マ -S 、ヌ、ケ。ェ。ェ

ホ羌ース靉、マイソ、ヌ、ヌ、ュ、ニ、、、。ゥ

unwind

トカreturn

typeinfo

throw、オ、、ソ・ェ・ヨ・ク・ァ・ッ・ネ、ャcatch、ヌ、ュ、、ォ、ノ、ヲ、ォ

ホ羌ース靉、マイソ、ヌ、ヌ、ュ、ニ、、、。ゥ

  1. ナ熙イ、・ェ・ヨ・ク・ァ・ッ・ネタクタョ
  2. unwind、ホシツケヤ
  3. catch、ヌ、ュ、、ォ、ノ、ヲ、ォ、ホネスト
  4. 、ヌ、ュ、、ハ、馗atch
  5. 、ヌ、ュ、ハ、、、ハ、鬢オ、鬢ヒ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 、ネ、マ

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


[PR]薬用プロアクティブ公式サイト:実力派にきびケア、60日間返金保証