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 | ld -e start1 obj1.o obj2.o # 指定 start1 符号为程序入口点 |
常用的 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 |
生成位置无关代码的可执行文件 |