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 或查阅其手册页获得。

相关推荐
lljss202016 小时前
Arm GNU 工具链 命名规则
服务器·arm开发·gnu
wzhao1013 天前
Relink 0.15.1:一个 no_std 的 ELF 加载器/链接器
linux·rust·gnu
wzhao1015 天前
动态链接器(十一):线程局部存储
linux·rust·gnu
jimy122 天前
C语言历史版本和gnu扩展版本
c语言·算法·gnu
✎ ﹏梦醒͜ღ҉繁华落℘1 个月前
Makefile(四)--gcc 和gdb
c语言·gnu·gcc和gdb
无巧不成书02181 个月前
Rust开发环境完全指南:Windows/Linux双平台配置与实战
linux·windows·rust·gnu·msvc·mingw-w64安装·镜像配置
✎ ﹏梦醒͜ღ҉繁华落℘1 个月前
Makefile -GNU和MakeFile关系(二)
服务器·gnu
独小乐1 个月前
012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇
c语言·汇编·笔记·单片机·嵌入式硬件·arm·gnu
独小乐1 个月前
007.GNU C内联汇编杂谈|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·汇编·单片机·嵌入式硬件·arm·gnu
jiayi_19991 个月前
[bug] unsupported GNU version! gcc versions later than 12 are not supported!
服务器·bug·gnu