发布于 ,更新于 

GNU 连接器 ld 的使用指南

ld 是 GNU 的连接器,用于将多个已经编译好的 .o 文件连接成可执行文件或者动态库。

一般使用方式如下:

1
ld  [参数选项]  -o [输出文件名] obj_file1.o  obj_file2.o  obj_file3.o ...

例如,.a 库文件可以跟 .o 文件一起列出来:

1
ld  -o  main  crt0.o  obj1.o  obj2.o  libq1.a 

以上例的 libq1.a 可以用 -l 选项指定:

1
ld  -o  main  crt0.o  obj1.o  obj2.o  -lq1 

gcc/g++ 也可以直接调用 ld 加选项进行连接,例如:

1
2
3
4
5
ld  -e  start1  obj1.o  obj2.o              # 指定 start1 符号为程序入口点

# 换成 gcc 来使用的话,采用 -Wl 选项来传递连接选项参数 :
#
gcc -Wl,-e,start1 obj1.o obj2.o

常用的 ld 的选择项有:

选项 解释
-e address
--entry address
设置程序的执行入口点
-EB 连接对象文件为大端字节序
-EL 连接对象文件为小端字节序
-A arch 指定 CPU 架构
-b target
--format target
指定输入文件的格式
-h filename
-soname filename
设置共享库的内部名字
-I program
--dynamic-linker program
设置动态连接解释程序名称
--no-dynamic-linker 可执行文件不需要动态连接解释程序设置
-l libname
--library libname
指出连接需要的库的名称
-L directory
--library-path directory
指出库文件的搜索路径
-o filename
--output filename
设置输出文件名
-s
--strip-all
去除所有符号
-S
--strip-debug
去除调试用的符号
--strip-discarded 去除标记为 discarded 段中的符号
-T filename
--script filename
读取连接器脚本
-Bdynamic
-dy
-call_shared
使用共享库来连接
-Bstatic
-dn
-non_shared
-static
使用静态库来连接
-init symbol 设置在装载时调用指定符号
-Map FILE/DIR 写入map到文件或者目录
-nostdlib 仅仅连接命令行中指定的库,不连接其他标准库
--oformat TARGET 支持输出文件的格式
-rpath PATH 设置程序运行时,动态库的搜索路径
-rpath-link PATH 设置连接时,动态库的搜索路径
-shared
-Bshareable
生成共享库
-pie
--pic-executable
生成位置无关代码的可执行文件