文章目录

  • 1.命令简介
  • 2.命令格式
  • 3.选项说明
  • 4.常用示例
  • 参考文献

1.命令简介

ld(Link eDitor)命令是二进制工具集 GNU Binutils 的一员,是 GNU 链接器,用于将目标文件与库链接为可执行文件或库文件。

2.命令格式

ld [OPTIONS] OBJFILES

3.选项说明

ld 命令支持众多链接选项,但是大部分选项很少被使用,下面是 GNU ld 命令接受的选项。

-b <input-format>指定目标代码输入文件的格式
-Bstatic只使用静态库
-Bdynamic只使用动态库
-Bsymbolic把引用捆绑到共享库中的全局符号
-c <MRI-commandfile>, --mri-script=<MRI-commandfile>为与 MRI 链接器兼容,ld 接受由 MRI 命令语言编写的脚本文件
--cref创建跨引用表
-d,-dc,-dp即使指定了可重定位的输出文件(使用-r),也会为公共符号分配空间。脚本命令“FORCE_COMMON_ALLOCATION”具有相同的效果
-defsym在输出文件中创建指定的全局符号
-demangle在错误消息中还原符号名称
-e <entry>使用指定的符号作为程序的初始执行点
-E,--export-dynamic对于ELF格式文件,创建动态链接的可执行文件时,把所有符号添加到动态符号表
-f <name>, --auxiliary=<name>对于 ELF 格式共享对象,设置 DT_AUXILIARY 名称
-F <name>, --filter=<name>对于ELF格式共享对象,设置 DT_FILTER 名称。这告诉动态链接器,正在创建的共享对象的符号表应该用作共享对象名称的符号表的筛选器。
-g被忽略。用于提供和其他工具的兼容性
-h对于 ELF 格式共享对象,设置 DT_SONAME 名称
-I<file>, -dynamic-linker <file>, --dynamic-linker=<file>指定动态链接器。这仅在生成依赖动态链接库的 ELF 可执行文件时才有意义。默认的动态链接器通常是正确的,除非您知道正在做什么,否则不要使用该选项。
-l <namespec>, --library=<namespec>把指定的库文件添加到要链接的文件清单
-L <searchdir>, --library-path=searchdir把指定的路径添加添加到搜索库的目录清单
-M, --print-map显示链接映射,用于诊断目的
-Map=<mapfile>:将链接映射输出到指定的文件
-m <emulation>模拟指定的链接器
-N,--omagic指定读取/写入文本和数据段
-n,--nmagic关闭节的页面对齐,并禁用对共享库的链接。如果输出格式支持Unix样式的幻数,则将输出标记为"NMAGIC"
-noinhibit-exec生成输出文件,即使出现非致命链接错误。通常,如果链接器在链接过程中遇到错误,它将不会生成输出文件。
-no-keep-memoryld 通常在内存中缓存输入文件的符号表来优化内存使用速度。此选项告诉 ld 不要缓存符号表。当链接大型可执行文件时,如果ld耗尽内存空间,则可能需要使用该选项
-O <level>对于非零的优化等级,ld将优化输出。此操作会比较耗时,应该在生成最终的结果时使用。
-o <output>, --output=<output>指定输出文件的名称
-oformat=<output-format>指定输出文件的二进制格式
-R <filename>,--just-symbols=<filename>从指定的文件读取符号名称和地址
-r,--relocatable生成可重定位的输出(称为部分连接)
-rpath=<dir>把指定的目录添加到运行时库搜索路径
-rpath-link=<dir>指定搜索运行时共享库的目录
-S,--strip-debug忽略来自输出文件的调试器符号信息
-s,--strip-all忽略来自输出文件的所有符号信息
-shared, -Bshareable创建共享库
-split-by-file[=size]为每个目标文件在输出文件中创建额外的段大小达到size。size默认为1
-split-by-reloc[=count]按照指定的长度在输出文件中创建额外的段
--section-start=<sectionname>=<org>在输出文件中指定的地址定位指定的段
-T <scriptfile>, --script=<scriptfile>使用 scriptfile 作为链接器脚本。此脚本将替换 ld 的默认链接器脚本(而不是添加到其中),因此脚本必须指定输出文件所需的所有内容。如果当前目录中不存在脚本文件,ld 会在 -L 选项指定的目录中查找
-Ttext=<org>使用指定的地址作为文本段的起始点
-Tdata=<org>使用指定的地址作为数据段的起始点
-Tbss=<org>使用指定的地址作为bss段的起始点
-t,--trace在处理输入文件时显示它们的名称
-u <symbol>, --undefined=<symbol>强制指定符号在输出文件中作为未定义符号
-v, -V, --version示ld版本号
-warn-common当一个通用符号和另一个通用符号结合时发出警告
-warn-constructors如果没有使用任何全局构造器,则发出警告
-warn-once对于每个未定义的符号只发出一次警告
-warn-section-align如果为了对齐而改动了输出段地址,则发出警告
--whole-archive对于指定的存档文件,在存档中包含所有文件
-X, --discard-locals删除所有本地临时符号
-x, --discard-al删除所有本地符号

4.常用示例

(1)链接目标文件生成可执行文件。如给定 C++ 目标文件 test.o 与 main.o,生成可执行文件 test.out。

ld /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib64/crtn.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib64 -L/usr/lib -lstdc++ -lm -lgcc_s -lc -lgcc  main.o test.o -o test.out

因为生成一个C++可执行文件,需要依赖很多系统库和相关的目标文件,比如C语言库libc.a,所以使用ld进行链接时,需要注意添加较长的命令选项,不然会报链接错误。使用g++ -v命令可以查看最后一行collect2使用的命令选项,进而了解生成可执行文所需的相关依赖。

g++ -v main.o test.o
...
usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib64/crt1.o /usr/lib64/crti.o /usr/lib64/crtn.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbegin.o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtend.o -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/usr/lib64 -L/usr/lib -lstdc++ -lm -lgcc_s -lc -lgcc  main.o test.o

参考文献

ld manual
GNU Binutils
wikipedia.Linker (computing)
使用ld命令链接目标文件生成可执行文件

Linux 命令(65)—— ld 命令相关推荐

  1. linux下的ld命令(1)

    使用ld 本文档介绍GNU连接器ld的2.14版本. 本文档在GNU自由文档许可证下发行.在"GNU自由文档许可证"一章中有关于本许可证的一份拷贝. 概述 'ld'把一定量的目标文 ...

  2. Linux命令(65)——ld命令

    命令简介 ld命令是二进制工具集GNU Binutils的一员,是GNU链接器,用于将目标文件与库链接为可执行程序或库文件. 命令格式 ld [options] <objfile...> ...

  3. 【Linux】一步一步学Linux——ld命令(256)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 ld命令是GNU的连接器,将目标文件连接为可执行程序. 0 ...

  4. Linux——ld命令

    命令概述 ld 命令是GNU的连接器,将目标文件连接为可执行程序. 命令格式 用法:ld [选项] 文件... 常用选项 -b: 指定目标代码输入文件的格式 -Bstatic: 只使用静态库 -Bdy ...

  5. Linux 命令-ld 命令

    1.命令简介 ld(Link eDitor)命令是二进制工具集GNU Binutils的一员,是GNU链接器,用于将目标文件与库链接为可执行文件或库文件. 2.命令格式 ld [OPTIONS] OB ...

  6. 【Linux】一步一步学Linux——bzip2命令(65)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 Linux系统中bzip2命令的英文是"bunz ...

  7. linux目标文件链接命令,ld 命令:将目标文件链接为可执行程序 - dute.org

    说明 ld 命令是二进制工具集 GNU Binutils 的一员,是 GNU 链接器,用于将目标文件与库链接为可执行程序或库文件. 语法ld [选项] [目标文件...] 选项-b:指定目标代码输入文 ...

  8. Linux 后台开发常用命令目录(更新 ing)

    文章目录 前言 帮助命令 进程与作业管理 文本查看 文本编辑 编程相关 系统管理 文件传输 网络管理 文件与目录管理 磁盘管理 权限管理 用户与组管理 备份压缩 代码版本控制 性能检测 实用工具 前言 ...

  9. Linux中常用的命令都是哪些单词的缩写

    作者:蓬岸 Dr.Quest 链接:https://www.zhihu.com/question/49073893/answer/114986798 来源:知乎 著作权归作者所有.商业转载请联系作者获 ...

最新文章

  1. php中空心字体怎么打,php打印一个边长为N的实心和空心菱型的方法
  2. 在SQL Server上该做的和不该做的
  3. python os模块方法_python os模块的常用方法
  4. Pandas处理数据太慢,来试试Polars吧!
  5. 3750交换机简要配置手册(中文)
  6. Spring的4种事务管理(1种编程式事务+三种声明事务)
  7. python解释器配置_Python解释器的配置
  8. winform打开PDF,显示在窗口
  9. 手机PIN码解锁过程
  10. idea文件过大解决方法
  11. word页眉页脚页码设置详解
  12. 复制pdf文字到word
  13. 如何用ppt做自我介绍
  14. Dual-Resolution Correspondence Networks 2020
  15. 初学Linux很土鳖?带你认识Linux,如何安装Linux?
  16. FL Studio乐理教程之和弦进行
  17. android网卡调试命令
  18. 商业智能(Business Intelligence)介绍
  19. 用pl/sql解决芬兰数学家因卡拉设计的最难数独
  20. 谷歌天气预报 API

热门文章

  1. 看我如何发现开源 WAF引擎ModSecurity 中的DoS 漏洞
  2. 动手拆解众筹明星产品安全智能锁KeyWe后,发现它不安全且无解
  3. 如何提高实景三维智慧城市项目的建模精度和建模效果
  4. 【leetcode】416. Partition Equal Subset Sum
  5. 【万里征程——Windows App开发】数据绑定——简单示例、更改通知、数据转换...
  6. 类对象工厂设计模式(Factory Pattern)
  7. 解决centos6.4 启动dell omsa 失败
  8. 苹果发布新应用Find My Friends,轻松追踪朋友和家人的所在位置
  9. window启动过程讲解--PPT截图[张银奎]
  10. 决定成败的人生细节(转)