Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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を静的リンクしたりとかそういう面倒なかんじのものがなかったりするんですかね。(リンカ読めって話っぽい)

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away