徒然ネル

LinuxカーネルとかeBPFとか

itmediaの「main()関数の前には何があるのか」を読んでみる(第四回)

itmediaの「main()関数の前には何があるのか」の連載を読んでわからなかったことや、調べたことをメモする

 

第四回は" OSのシステムコールの呼び出しとは&バイナリエディタの使い方"

 

いきなり前回の記事の途中から始まってて、どうやったら逆アセンブルのこの行にたどりつくのか忘れてた。

以下、思い出しながら実行したら、第四回の頭のところに行けた

  • ```bash
  • gdb hello
  • layout asm
  • break write
  • ```

 

先頭からアセンブリ追ってみたいな

図2.30: write()の内部

https://image.itmedia.co.jp/l/im/ait/articles/1703/01/l_r20_Hello04-01.PNG

 

>__write_nocancel()が__kernel_vsyscall()を呼んでるみたいだけど、それぞれが何なのか?

__write_nocancel()はwriteシステムコールを呼ぶAPI内の関数っぽい

nocancel()はスレッドキャンセルポイントでない関数ということらしい

noncancelの前のwriteはキャンセルポイントということかな

pthread_cancelって関数でキャンセルできるみたい

pthreadがPOSIXスレッドっていうPOSIX標準のスレッドとのこと(?)

ここらへんは、マルチスレッドプログラミングを勉強する必要がありそう

(gdb) where
#0  0x00110416 in __kernel_vsyscall ()
#1  0x08053d92 in __write_nocancel ()
#2  0x08067671 in _IO_new_file_write ()
#3  0x0806819b in _IO_new_do_write ()
#4  0x080683ea in _IO_new_file_overflow ()
#5  0x080673f4 in _IO_new_file_xsputn ()
#6  0x08059738 in vfprintf ()
#7  0x08049381 in printf ()
#8  0x080482e2 in main (argc=1, argv=0xbffffc14) at hello.c:5
(gdb)

 

hexeditの/使った検索は、全文検索じゃなくてカーソル以降の検索なんやね

検索したい箇所通り過ぎた状態で検索してもnot foundって言われて謎だった

 

0x80d6750はどこだ?

objdump -d hello | less で検索してもこのアドレスは入ってなかった。

ちなみに、0x110414<__kernel_vsyscall>もどこなのか気になる

helloが確保するメモリの範囲外な気がしてる