シンボルについて
自分用のメモです。
グローバル変数についてはこちらに。
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章