LoginSignup
4
2

More than 5 years have passed since last update.

Goのバイナリのエントリポイント

Posted at

Go言語よくわからないけどとりあえず調べてみようというきっかけとして、そういえばGoってlibcにすら依存しないんだっけ、エントリポイントどうなってるだろ、と思って調べてみました。

  • 環境
$ go version                                                         [kubo39:~]
go version go1.7.4 linux/amd64
$ cat /proc/version                                                  [kubo39:~]
Linux version 4.8.0-34-generic (buildd@lcy01-21) (gcc version 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12) ) #36-Ubuntu SMP Wed Dec 21 17:24:18 UTC 2016

まずreadelfを使ってエントリポイントアドレスを調べてみます。

$ readelf -h `command -v go`                                              [kubo39:~]
ELF ヘッダ:
  マジック:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  クラス:                            ELF64
  データ:                            2 の補数、リトルエンディアン
  バージョン:                        1 (current)
  OS/ABI:                            UNIX - System V
  ABI バージョン:                    0
  型:                                EXEC (実行可能ファイル)
  マシン:                            Advanced Micro Devices X86-64
  バージョン:                        0x1
  エントリポイントアドレス:               0x4d1620
  プログラムの開始ヘッダ:          64 (バイト)
  セクションヘッダ始点:          624 (バイト)
  フラグ:                            0x0
  このヘッダのサイズ:                64 (バイト)
  プログラムヘッダサイズ:            56 (バイト)
  プログラムヘッダ数:                10
  セクションヘッダ:                  64 (バイト)
  セクションヘッダサイズ:            36
  セクションヘッダ文字列表索引:      13

nm で調べると、エントリポイントのシンボル名はLinuxの場合は _rt0_amd64_linux であることがわかりました。

$ nm -f posix `command -v go` | grep 4d1620                          [kubo39:~]
_rt0_amd64_linux T 00000000004d1620 0000000000000012

定義されているsrc/runtime/rt0_linux_amd64.sをみると、

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#include "textflag.h"

TEXT _rt0_amd64_linux(SB),NOSPLIT,$-8
    LEAQ    8(SP), SI // argv
    MOVQ    0(SP), DI // argc
    MOVQ    $main(SB), AX
    JMP AX
...

という感じでmainにコマンドライン引数を渡して呼んでるるだけのようです。

というかstaticなバイナリだとcrt*.oを静的リンクしたりとかそういう面倒なかんじのものがなかったりするんですかね。(リンカ読めって話っぽい)

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2