ld
コマンドは、GNU Binutils に含まれる リンカ で、オブジェクトファイル(.o
)やライブラリを結合して実行可能ファイルや共有ライブラリを生成するために利用されます。
通常は gcc
や g++
が内部的に ld
を呼び出しますが、低レベルで制御したい場合に直接使用します。
構文(Syntax)
ld [オプション] <オブジェクトファイル>... -o <出力ファイル>
主なオプション一覧
オプション | 説明 | 使用例 |
---|---|---|
-o <file> | 出力ファイル名を指定 | ld main.o -o main |
-L<dir> | ライブラリ検索パスを追加 | ld main.o -L./lib -lmylib -o main |
-l<name> | ライブラリをリンク | ld main.o -lc -o main |
-r | リロケータブルなオブジェクトを生成(中間リンク) | ld -r a.o b.o -o ab.o |
-static | 静的リンクを行う | ld main.o -static -o main |
-shared | 共有ライブラリを生成 | ld -shared -o libfoo.so foo.o bar.o |
-Map <file> | リンクマップを出力 | ld main.o -o main -Map map.txt |
-dynamic-linker <path> | 動的リンカを指定 | ld main.o -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o main |
実行例
オブジェクトファイルから実行ファイルを作成
ld main.o -lc -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o main
(標準 C ライブラリを手動でリンク)
複数のオブジェクトファイルを結合
ld a.o b.o -lc -o ab
静的リンクで実行ファイルを作成
ld main.o -static -o main
共有ライブラリを作成
ld -shared -o libfoo.so foo.o bar.o
リロケータブルオブジェクトを生成
ld -r a.o b.o -o combined.o
リンクマップを出力
ld main.o -o main -Map linkmap.txt
エラー例(ライブラリ不足)
ld main.o -o main
出力例:
ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000
ld: main.o: in function `main':
main.c:(.text+0x15): undefined reference to `printf'
関連コマンド
gcc
/g++
: コンパイル+リンクをまとめて行う(通常はこちらを利用)。as
: GNU アセンブラ。objdump
: バイナリを解析するツール。
備考
ld
を直接使う場合、標準ライブラリや動的リンカを 明示的に指定 する必要があります。- 実際の開発では
gcc
/g++
を介して使うのが一般的で、ld
を直接操作するのはカーネル開発や特殊なビルドシステムで多いです。 - エントリーポイント(デフォルト
_start
)を指定しないと動作しないことがあります。
参考
- GNU ld ドキュメント: https://sourceware.org/binutils/docs/ld/
- manページ: https://man7.org/linux/man-pages/man1/ld.1.html
コメント