1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

コンピュータ・システム シンボルテーブル

Last updated at Posted at 2022-01-02

シンボルについて

自分用のメモです。

グローバル変数についてはこちらに。
C言語 グローバル変数の正しい使い方 - Qiita

ELFファイルについてはこちらにまとめています。
コンピュータ・システム オブジェクト・ファイル 3つの形式 - Qiita

リンカにおけるシンボルおよびシンボル・テーブル

再配置可能オブジェクト・モジュールmには、mで定義・参照されているシンボルに関する情報を含むシンボル・テーブルが存在する。リンカの文脈では3種類に区別されるシンボルがある。

種類 説明 相当
大域シンボル モジュールmで定義され、他のモジュールから参照可能な大域シンボル 静的でないCの関数、グローバル変数
外部的大域シンボル 他のモジュールで定義されている大域シンボル 他のモジュールで定義された静的でないCの関数、グローバル変数
局所シンボル モジュールmでのみ定義・参照される局所シンボル 静的なCの関数およびstatic属性付きで定義されたグローバル変数。モジュールm内のみで参照可能。

readelfコマンドでシンボルテーブルを見る

int	ft_strlen(char *str)
{
    int i;

    i = 0;
    while (str[i])
        i++;
    return (i);
}

Symbol table '.symtab'の中身をreadelfコマンドで参照します。
.symtab内のシンボル・テーブルは局所的であり静的でないプログラム変数に対応するシンボルを含みません。これらは実行時にスタック上で管理されるため、リンカは関心を持ちません。

❯ clang --target=aarch64-unknown-linux-gnu -c strlen.c
❯ readelf -s strlen.o

Symbol table '.symtab' contains 7 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS strlen.c
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    2 .text
     3: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    2 $x.0
     4: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    3 $d.1
     5: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    5 $d.2
     6: 0000000000000000    60 FUNC    GLOBAL DEFAULT    2 ft_strlen

nmコマンドでシンボルを見る

nmコマンドを使います。

❯ nm strlen.o  
0000000000000000 T ft_strlen

Macに最初からインストールされているnmコマンドでは--format=darwinオプションのエイリアスであるmが使えます。
strlen.oの中身だと違いがわからないので、別のファイルのシンボルを参照しています。

❯ /usr/bin/nm -nm a.out   
                 (undefined) external _printf (from libSystem)
                 (undefined) external dyld_stub_binder (from libSystem)
0000000100000000 (__TEXT,__text) [referenced dynamically] external __mh_execute_header
0000000100003f70 (__TEXT,__text) external _main
0000000100008008 (__DATA,__data) non-external __dyld_private

参考

コンピュータ・システム: 7章

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?