linux命令ld怎么用?linux ld命令详解

在 Linux 系统中,ld 命令是 GNU 链接器(GNU Linker) 的主要工具,它的主要作用是将多个目标文件(.o 文件)、库文件(.a.so 文件)以及其他输入文件组合在一起,生成一个可执行文件或共享库。

虽然大多数开发者直接使用 gccg++ 进行编译链接,但了解 ld 对于深入理解程序构建过程、调试链接错误以及进行底层开发非常有用。

每天一个Linux命令-chown
加载中
每天一个Linux命令-chown

基本语法

ld [选项] 输入文件...

常用选项

linux命令ld怎么用?linux ld命令详解

选项 说明
-o <输出文件> 指定输出文件的名称(默认通常为 a.out
-l<库名> 链接指定的共享库或静态库(-lm 链接数学库)
-L<路径> 指定库文件的搜索路径
-T <脚本> 使用指定的链接脚本(Linker Script)
-r 可重定位输出(用于生成中间目标文件)
-s 从输出文件中移除所有符号表信息
-static 强制链接静态库
-shared 创建共享库(.so 文件)
--verbose 显示链接过程中的详细信息
--help 显示帮助信息

使用示例

示例 1:链接两个目标文件生成可执行文件

假设有两个源文件 main.cutils.c

# 1. 编译为目标文件
gcc -c main.c -o main.o
gcc -c utils.c -o utils.o
# 2. 使用 ld 链接
ld main.o utils.o -o myprogram

⚠️ 注意:直接使用 ld 链接可能会缺少 C 运行时库(如 crt0.olibc 等),导致运行时错误,通常推荐使用 gcc 来自动处理这些依赖。

示例 2:链接标准库(如数学库)

ld main.o -lm -o myprogram

这里 -lm 表示链接数学库 libm.so

示例 3:创建共享库

# 编译为位置无关代码(PIC)
gcc -c -fPIC utils.c -o utils.o
# 链接为共享库
ld -shared utils.o -o libutils.so

示例 4:使用链接脚本

链接脚本允许开发者精确控制内存布局、段(section)分配等。

linux命令ld怎么用?linux ld命令详解

ld -T custom_linker_script.ld main.o -o myprogram

ldgcc 的区别

特性 ld gcc
角色 纯链接器 编译器驱动(包含预处理、编译、汇编、链接)
运行时库 不自动链接 C 标准库(libc 自动链接必要的运行时库(如 crt1.o, libc.so
易用性 需要手动指定所有依赖和入口点 自动处理大多数细节
适用场景 底层开发、嵌入式系统、自定义链接流程 日常 C/C++ 开发

常见问题与注意事项

❌ 错误:undefined reference to 'main'

  • 原因:未指定入口点或目标文件未包含 main 函数。
  • 解决:确保有一个包含 int main() 的目标文件,并使用 -e main 指定入口点(如果需要):
    ld -e main main.o utils.o -o myprogram

❌ 错误:

linux命令ld怎么用?linux ld命令详解

cannot find -lc

  • 原因ld 不知道去哪里找 C 标准库。
  • 解决:使用 gcc 代替 ld,或手动指定库路径:
    ld main.o -lc -o myprogram

✅ 推荐做法

除非你有特殊需求(如嵌入式开发、操作系统内核开发),否则建议始终使用 gccg++ 进行链接,因为它们会自动处理 C 运行时环境、初始化代码和库依赖。


查看链接信息

你可以使用 readelfobjdump 查看 ld 生成的文件信息:

# 查看 ELF 文件头
readelf -h myprogram
# 查看符号表
readelf -s myprogram
# 查看段信息
readelf -l myprogram

  • ld 是 GNU 链接器,用于将目标文件和库组合成可执行文件或共享库。
  • 它不提供 C 运行时支持,需手动处理依赖。
  • 日常开发推荐使用 gcc/g++,它们在底层调用 ld 并自动处理复杂链接过程。
  • 对于高级用户,ld 提供了强大的链接脚本和精细控制能力。

如需进一步了解,可运行 man ld 查看完整手册。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/478084.html

(0)
linux如何安装jstack?jstack命令怎么用
上一篇 2026年7月10日 04:21
Linux UltraEdit怎么破解?UltraEdit永久激活码免费获取
下一篇 2026年7月10日 04:24

相关推荐

  • Linux find命令怎么使用,linux find怎么查找文件?

    Linux find命令是基于文件系统实时检索信息的强大工具,通过组合路径、名称、权限、时间及大小等多种过滤条件,实现对海量文件的高效精准定位与自动化处理,linux find命令按文件名查找文件在Linux系统管理中,最基础且高频的需求就是通过文件名定位目标,find命令的强大之处在于它不仅能进行简单的字符串……

    2026年7月13日
    800
  • 简米云服务器公网IP到底访问多少次会被封,怎么解决

    阿里云服务器公网IP并没有一个固定的访问次数封禁阈值,阿里云不会因为单纯访问次数多就封IP,触发封禁的往往是攻击特征、并发异常、频控规则或违规内容,而非简单的次数统计,如果你正在运营网站、API接口或数据采集服务,担心IP被阿里云封禁,这篇文章会帮你弄清楚封禁的真正逻辑、常见触发场景、自查手段以及降低被封锁概率……

    2026年8月8日
    400
  • 6m服务器到底能支持多少人看视频,视频网站需要多大带宽?

    6M带宽服务器在常规1080P视频流下,通常能支持约2至4人同时流畅观看;若视频经过高效压缩或降低至720P,支持人数可提升至6至10人左右,带宽与视频流量的底层换算逻辑咱们在评估一台服务器的承载力时,首先要剥开各种营销话术,算一笔最基础的流量账,很多人会把家里的宽带概念套用到服务器上,这很容易造成误判,家庭宽……

    2026年8月18日
    600
  • 智合云戴尔服务器6t能挖多少币?,收益高吗

    根据Chia网络当前算力与戴尔服务器6T硬盘的P盘效率,单台设备每日收益约在0.03-0.08XCH之间,但实际收益受P盘速度、网络稳定性及币价波动影响较大,需结合自身成本综合评估,影响挖矿收益的核心因素硬件配置:戴尔服务器6T的实际表现戴尔服务器搭载6T硬盘,通常指大容量存储方案,适用于硬盘挖矿,6T空间在C……

    2026年8月3日
    300
  • linux netcat 下载失败怎么办?netcat 命令使用教程

    利用Linux netcat进行文件下载的核心方法是使用“接收端监听端口+发送端连接发送”的单向管道模式,通过重定向符号将数据流保存为本地文件,这是无需HTTP服务即可实现快速内网传输的最简方案,在Linux系统管理中,当目标服务器无法访问外部互联网,或者需要绕过复杂的防火墙策略进行小文件传输时,Netcat……

    2026年7月6日
    3910
  • 服务器单根内存条最大容量是多少G,怎么选性价比最高?

    服务器单根内存条最大容量目前为512GB,采用DDR5 3DS RDIMM封装技术,部分高端平台借助CXL内存扩展可达单根2TB,这一上限由JEDEC标准、CPU内存控制器以及主板物理层共同决定,实际部署中需根据具体处理器型号和通道数逐一确认,服务器内存容量演进:从单条几百MB到512GB早期服务器的内存容量瓶……

    2026年8月23日
    200
  • 狼神a1服务器主板CPU多少钱?,值得买吗?

    狼神A1服务器主板CPU套装的价格通常在2000至4000元区间,具体由CPU型号、内存规格、是否含散热以及购买渠道决定, 这个价位覆盖了从入门级双路到中端单路配置,当前市场行情下,二手拆机件更便宜,全新行货则偏高端,影响狼神A1服务器主板CPU价格的关键因素硬件配置决定基础成本狼神A1主板的兼容性覆盖了Int……

    2026年8月11日
    1300
  • 1t服务器能同时访问多少人?,怎么配置?

    1t服务器可以同时访问多少人?核心答案是:带宽只是入场券,真正决定并发承载量的是业务类型、服务器硬件配置与架构设计,在理想网络条件下,一台接入1Tbps带宽的高性能物理服务器,可同时支撑的活跃并发连接数通常在数万至数十万量级,但落到实际业务中,动态请求的稳妥并发区间多为数千至两万,静态资源分发则可轻松突破十万以……

    2026年8月20日
    200
  • 一台服务器最多能支持多少个socker?,socker数量上限是多少

    一台服务器支持的socket数量取决于CPU架构与平台定位,x86服务器主流为1至8路,ARM服务器可达64至128路,超级计算机则会扩展至数万路,展开说,单路、双路是绝对主流,四路以上多为关键业务或高性能计算场景,先给结论:你去机房看到的那台服务器,大概率是双路以最常见的x86架构来说,单路和双路加起来覆盖了……

    2026年8月22日
    100
  • Linux调用约定是什么?Linux系统调用约定详解

    Linux下的调用约定(Calling Convention)本质上是函数调用者与被调用者之间关于寄存器使用和栈内存管理的“握手协议”,它决定了参数如何传递、返回值如何获取以及栈帧如何清理,是理解底层代码执行逻辑的关键基石,在Linux系统编程的深水区,调用约定不仅仅是编译器生成的汇编指令,更是连接高级语言与硬……

    2026年7月4日
    4300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注