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

相关推荐
再遇当年1 天前
因为研究平台arm,RK3588交叉编译误把我笔记本X86平台的/x86_64-linux-gnu文件删除,导致联想拯救者笔记本中的ubuntu系统损坏
linux·arm开发·ros·gnu·交叉编译·x86
vortex54 天前
/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2:Linux 动态链接的核心引擎
linux·gnu
CSDN_RTKLIB21 天前
【GNU、GCC、g++、MinGW、MSVC】上
c++·gnu
Mr_Dwj1 个月前
【运维】GNU/Linux 入门笔记
linux·运维·gnu
万象.1 个月前
GNU汇编语法和Cortex-A7常用汇编指令
服务器·汇编·gnu
CiLerLinux2 个月前
第一章 FreeRTOS简介
单片机·嵌入式硬件·物联网·gnu
序属秋秋秋2 个月前
《Linux系统编程之入门基础》【Linux的前世今生】
linux·运维·服务器·开源·unix·gnu
华强笔记3 个月前
KGDB(Kernel GNU Debugger)工具使用方法详解
网络·安全·gnu
Qiang_san3 个月前
GNU Make | C/C++项目自动构建入门
c语言·c++·gnu
focksorCr3 个月前
C 内存对齐踩坑记录
linux·c语言·gnu