����
�A��

���Ȃ����m��Ȃ��v���O�����̐^�̎n�܂�\�\main()�֐��̑O�ɂ���X�^�[�g�A�b�v�Ƃ��Fmain()�֐��̑O�ɂ͉�������̂��i8�j�i1/3 �y�[�W�j

C����́uHello World�I�v�v���O�����Ŏg����A�uprintf()�v�umain()�v�֐��̒��g���A�f�o�b�K�ɂ���͂Ƌt�A�Z���u���A�\�[�X�R�[�h�lj��Ȃǂ̂��܂��܂ȑ��ʂ���T��A�ځB����́Amain()�̒��g��A���̑O�ɌĂяo�����X�^�[�g�A�b�v�Ƃ��������������ɂ‚��Ċw�ԁB

Share
Tweet
LINE
Hatena

�A�ږڎ�

�n���[�gHello�CWorld�h OS�ƕW�����C�u�����̃V�S�g�Ƃ�����

���Ђ̒�����L�p�ȋZ�p�����s�b�N�A�b�v���ďЉ��{�V���[�Y�B����́A�G�a�V�X�e�����s�̏��Ёw�n���[�gHello, World�h OS�ƕW�����C�u�����̃V�S�g�Ƃ����݁i2015�N9��11�����s�j�x����̔����ł��B

�����ӁF�{�e�́A���ҋy�яo�ŎЂ̋��‚𓾂āA���̂܂ܓ]�ڂ������̂ł��B���̂��ߗp���p��̓��ꃋ�[���Ȃǂ́�IT�̂���Ƃ͈�v���܂���B���炩���߂��������������B


���ҏW�����F�O��L���uLinux�J�[�l���Ɍ���A�V�X�e���R�[���ԍ��ƈ����A�V�X�e���R�[���E���b�p�[�Ƃ��v�͂�����

main()�֐��̑O�ƌ�

�@printf()�̌Ăяo���̐�ɂ�����̂ƃV�X�e���R�[���̎d�g�݂͔��R�Ƃ킩�������A���̓v���O�����̊J�n�ƏI�����ɉ����s����̂������Ă݂悤�B�֐��̌Ăяo�����ǂ��̂ł͂Ȃ��A�Ăяo�����������̂ڂ��Ă݂�킯���B

�@C����̓��发���J���ƁA�v���O�����̎��s��main()�֐�����J�n�����Ɛ�������Ă��邱�Ƃ�����B����������͉R�ł���A���̑O�ɃX�^�[�g�A�b�v�Ƃ�������������������Ɛ�������Ă���{������B

�@���A���̃X�^�[�g�A�b�v�̏����ɂ‚��Đ�������Ă���{�͏��Ȃ��B���������X�^�[�g�A�b�v�ł́A�ǂ̂悤�ȏ������s���Ă���̂��낤���B

�@�܂��v���O������exit()���Ăяo�����ƂŏI������B�ł͂���exit()�ł́A�����s���Ă���̂��낤���B�Ȃ�exit()���Ăяo�����ƂŁA�v���O�����͏I������̂��낤���B�v���O�����̏I����main()�֐�����߂邱�Ƃł��s���邪�Amain()����߂�����ɂ͂���������������̂��낤���B

�@�{�͂ł�main()�֐����Ăяo�����܂łƁA�Ăяo���ꂽ������Ă݂悤�B

�f�o�b�K�ŃX�^�[�g�A�b�v�̏�����ǂ�

�@�A�ڑ�2��ł̓f�o�b�K�ɂ�铮�I��͂�printf()�̌Ăяo���̐��T�������A�����ł������悤�ɂ��āAmain()���Ă΂��܂ł̏�����ǂ��Ă݂悤�B

�@�T���v���E�v���O�����ɂ́A�A�ڑ�2��ʼn�͂̑Ώۂɂ������s�t�@�C��hello�����̂܂ܗ��p����B

�Ƃ肠����main()�Ńu���[�N���Ă݂�

�@�܂���hello���w�肵��GDB���N�����āAmain()�Ƀu���[�N�|�C���g�𒣂��ē�����J�n���悤�B

[user@localhost hello]$ gdb -q hello
Reading symbols from /home/user/hello/hello...done.
(gdb) break main
Breakpoint 1 at 0x80482c5: file hello.c, line 5.
(gdb) run
Starting program: /home/user/hello/hello
 
Breakpoint 1, main (argc=1, argv=0xbffffc14) at hello.c:5
5	printf("Hello World! %d %s\n", argc, argv[0]);
(gdb)

�@main()�֐��̐擪�Ńu���[�N�����B������where�ɂ��A�o�b�N�g���[�X��ǂ��Ă݂悤�B

(gdb) where
#0	main (argc=1, argv=0xbffffc14) at hello.c:5
(gdb)

�@������������main()�֐��̌Ăяo�����ƂȂ��Ă���֐����킩�邩������Ȃ��Ǝv�����̂����A���������킯�ł��Ȃ��悤���B

�@�ǂ̂悤�ɂ���΁Amain()�֐��̌Ăяo�����𒲂ׂ邱�Ƃ��ł��邾�낤���B

�@main()�֐�����߂��Ă݂���ǂ����낤���B�T���v���E�v���O�����ł́Amain()�̍Ō��return 0�ŌĂяo�����ɖ߂��Ă���B

�@�܂�next��printf()�̏��������s����B

(gdb) next
Hello World! 1 /home/user/hello/hello
6	return 0;
(gdb)

�@�uHello World!�v�̃��b�Z�[�W���o�͂���A���s��return�̈ʒu�Ɉړ����Ă���B�����step�ɂ��X�e�b�v���s���Ă݂悤�B

(gdb) step
7	}
(gdb) step
0x08048478 in __libc_start_main ()
(gdb)

�@step��2��s���ƁA__libc_start_main()�Ƃ����֐��ɖ߂����悤���B�\�[�X�R�[�h�͕\������Ȃ��̂ŁA������A�Z���u���Ō��Ă݂悤�B

(gdb) layout asm

�@����Ɛ}5.1�̂悤�ȉ�ʂɂȂ����B

�}5.1: main()����߂����Ƃ���
�}5.1: main()����߂����Ƃ���

�@�����Ƃ���A�m����__libc_start_main()�Ƃ����֐��ɖ߂��Ă���悤���B

�@�Ƃ������Ƃ͂܂�__libc_start_main()�Ƃ����֐�������A��������main()���Ă΂�Ă���Ƃ������Ƃ��낤���H

main()�̌Ăяo������T��

�@__libc_start_main()�Ƀu���[�N�|�C���g�𒣂邱�Ƃ͂ł��邾�낤���H����Ă݂悤�B

(gdb) break __libc_start_main
Breakpoint 2 at 0x80482fb
(gdb)

�@���܂����ꂽ�悤�Ȃ̂ŁA�Ď��s���Ă݂悤�B

�@�A�ڑ�3��ł������������Arun�����s����ƈȉ��̂悤�ɕ������B�v���O���������s���̂��߁u�v���O�������ŏ�������s���邩�H�v�ƕ�����Ă���̂ŁA����ɂ́uy�v�𓚂��Ă����΂����B

(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n)
Starting program: /home/user/hello/hello
 
Breakpoint 2, 0x080482fb in __libc_start_main ()
(gdb)

�@__libc_start_main()�ŁA���܂��u���[�N�ł����悤���B�o�b�N�g���[�X�͂ǂ��Ȃ��Ă��邾�낤���B

(gdb) where
#0	0x080482fb in __libc_start_main ()
#1	0x080481e1 in _start ()
(gdb)

�@���x��_start()�Ƃ����֐����o�Ă����悤���B

�@_start()�Ƀu���[�N�|�C���g�𒣂�A������x���s���Ă݂悤�B

(gdb) break _start
Breakpoint 3 at 0x80481c0
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n)
Starting program: /home/user/hello/hello
 
Breakpoint 3, 0x080481c0 in _start ()
(gdb)

�@���܂��u���[�N�ł��Ă���B�o�b�N�g���[�X�����Ă݂悤�B

(gdb) where
#0	0x080481c0 in _start ()
(gdb)

�@�Ƃ��ɉ����o�͂���Ȃ��B��ʂ͐}5.2�̂悤�ɂȂ��Ă���B

�}5.2: _start()�̌Ăяo��
�}5.2: _start()�̌Ăяo��

�@�A�Z���u���o�͂̉��̂ق���call���߂ɂ��__libc_start_main()���Ăяo����A���̌��hlt�Ƃ������߂��Ă΂�Ă��邱�Ƃɒ��ڂ��Ăق����B

�@hlt�͂�����HALT���߂Ƃ������̂ŁACPU�̓�����~������̂��B�‚܂�__libc_start_main()����߂��Ă����ꍇ�ɂ̓v���O�����̓���͒�~����B���̐�̏����͎��s����Ȃ��A�Ƃ������Ƃ��B

�@�Ƃ������Ƃ͂��ꂪ�Amain()���Ăяo�����߂̂������Ƃ̏������낤���B���������v���O���������s�J�n�����ʒu�́A�ǂ����ɏ��Ƃ��Ċi�[����Ă��Ȃ����̂��낤���B

Copyright © ITmedia, Inc. All Rights Reserved.

�@�@�@�@�@�@ | ���̃y�[�W��

Coding Edge �L�������L���O

�y�[�W�g�b�v�ɖ߂�