リスト54 リスト55


〔リスト54〕destructor属性を使用した例(test77.c)
	#include <stdio.h>
	void init_proc ()  __attribute__ ((constructor ));
	void exit_proc ()  __attribute__ ((destructor ));
	int main(void)
	{
	 printf("main execute\n");
	 return;
	}
	void init_proc()
	{
	 printf("program_start\n");
	 return;
	}
	void exit_proc()
	{
	 printf("program_end\n");
	 return;
	}


〔リスト55〕test77.cから生成されたアセンブラ(test77.s)
	 .file "test77.c"
	 .version "01.01"
	gcc2_compiled.:
	.section .rodata
	.LC0:
	 .string "main execute\n"
	.LC1:
	 .string "program_start\n"
	.section .ctors,"aw"
	 .long  init_proc
	.section .rodata
	.LC2:
	 .string "program_end\n"
	.section .dtors,"aw"
	 .long  exit_proc
	.text
	 .align 4
	.globl init_proc
	 .type  init_proc,@function
	init_proc:
	 pushl %ebp
	 movl %esp,%ebp
	 subl $8,%esp
	 addl $-12,%esp
	 pushl $.LC1
	 call printf
	 movl %ebp,%esp
	 popl %ebp
	 ret
	.Lfe1:
	 .size  init_proc,.Lfe1-init_proc
	 .align 4
	.globl exit_proc
	 .type  exit_proc,@function
	exit_proc:
	 pushl %ebp
	 movl %esp,%ebp
	 subl $8,%esp
	 addl $-12,%esp
	 pushl $.LC2
	 call printf
	 movl %ebp,%esp
	 popl %ebp
	 ret
	.Lfe2:
	 .size  exit_proc,.Lfe2-exit_proc
	 .align 4
	.globl main
	 .type  main,@function
	main:
	 pushl %ebp
	 movl %esp,%ebp
	 subl $8,%esp
	 addl $-12,%esp
	 pushl $.LC0
	 call printf
	 movl %ebp,%esp
	 popl %ebp
	 ret
	.Lfe3:
	 .size  main,.Lfe3-main
	 .ident "GCC: (GNU) 2.95.3 20010315 (release)"