ld,GNU 链接器介绍以及命令行参数详解

ld,GNU 链接器介绍以及命令行参数详解

当我们使用GCC编译源代码生成可执行程序,经过预处理、汇编、编译、链接四个阶段。

链接器(Linker)将多个目标文件和库文件链接起来,链接器还解决目标文件之间的符号引用,即函数和变量的外部引用,并确保所有依赖都被正确地包含进来,生成最终的可执行文件或共享库。
ld(Linker)是GCC(GNU Compiler Collection)工具链的一个重要组成部分。

命令行参数详解

ld的命令行参数非常丰富,下面介绍一些常用的参数:

输入和输出

c 复制代码
-o output_file 指定输出文件的名称。
input_files 目标文件和库文件列表,不需要通过 -o 和 -l 参数指定,ld 会自动识别。

控制链接行为

c 复制代码
-r 或 --relocatable 创建一个可重定位的目标文件,而不是可执行文件。
-b bfd_name 或 --binary-format=bfd_name 指定目标文件的二进制格式。
-z flag 或 --wrap=flag 替换某个函数的调用,通常用于调试。

符号和重定位

c 复制代码
-d 或 --as-needed 只加载链接时实际需要的动态库。
-u symbol 或 --undefined=symbol 强制保留未定义的符号。
-l library 或 --library=library 添加一个标准库到链接命令中。
-L path 或 --library-path=path 添加一个目录到库搜索路径。

特殊功能

c 复制代码
-shared 创建一个共享对象文件。
-static 创建一个静态链接的可执行文件或库。
-e entry_point 或 --entry=entry_point 指定程序的入口点。

调试和日志

c 复制代码
-Map map_file 或 --output-map-file=map_file 创建一个映射文件,记录链接器如何布局输出文件的各个部分。
-rpath path 或 --enable-new-dtags 设置运行时库的搜索路径。
-v 或 --verbose 显示详细的链接信息。

高级控制

c 复制代码
-T linker_script 或 --script=linker_script 使用一个链接脚本来控制输出的布局和行为。
-Ttext address 或 --text-base=address 设置代码段的基地址。

示例

假设你有两个目标文件 main.o 和 libfoo.o,想要创建一个名为 myapp 可执行文件,可以这样使用 ld:

c 复制代码
ld -o myapp main.o libfoo.o

如果要链接一个库 libbar.a 并且控制输出的布局,你可以使用一个链接脚本 linker.ld:

c 复制代码
ld -T linker.ld -o myapp main.o libfoo.o -lbar

注意,上述命令在某些环境中可能需要使用特定的前缀,例如在ARM64环境下,可能会使用 aarch64-linux-gnu-ld,而不是简单的 ld。
同时,ld 的完整命令行参数可以通过执行 ld --help 或查阅其手册页获得。

相关推荐
dingdingfish1 天前
GNU Parallel 学习 - 第1章:How to read this book
bash·shell·gnu·parallel
dingdingfish1 天前
GNU Parallel 学习笔记 - 总目录
bash·gnu·parallel
EleganceJiaBao1 天前
【嵌入式】GNU/GCC vs LLVM/Clang
gnu·clang·gcc·llvm
切糕师学AI2 天前
ARM汇编器与GNU汇编器:详细介绍与核心区别
arm开发·gnu·汇编器
心态还需努力呀3 天前
【鸿蒙PC命令行适配】GNU Hello 库在鸿蒙 PC 上的交叉编译与移植部署实战
华为·鸿蒙·gnu·openharmony·开源鸿蒙
加强洁西卡3 天前
【RISC-V】riscv64-linux-gnu工具链都有哪些工具
linux·gnu·risc-v
盛邦安全6 天前
漏洞预警 | GNU InetUtils telnetd 远程认证绕过漏洞(CVE-2026-24061)
服务器·gnu
Gobysec9 天前
Goby 漏洞安全通告|GNU InetUtils Telnetd USER环境变量注入 权限绕过漏洞(CVE-2026-24061)
数据库·安全·gnu·漏洞分析·漏洞预警
钮钴禄·爱因斯晨11 天前
操作系统第一章:计算机系统概述
linux·windows·ubuntu·系统架构·centos·鸿蒙系统·gnu
切糕师学AI19 天前
GDB: GNU 调试器
服务器·gnu