1.前言

为了尽可能的与其它链接器兼容,GNU链接器ld涵盖了很多情况。因此,有很多选项可以控制链接器的行为。

2. 命令行选项概述

链接器支持很多命令行选项,在特定的上下文,实际应用中只有很少一部分被使用。举例来说,ld用来链接unix系统的标准的unix对象文件,在这个系统中链接文件hello.o:

ld -o output /lib/crt0.o hello.o -lc

如上告知ld生成output输出文件,它是由/lib/crt0.o hello.c和库libc.a链接而成。libc.a会从一些标准的搜索目录中找到(可以参见下面关于’l’的选项)

ld命令行选项可以出现在命令行的任何地方。尽管如此,与目标文件和其它文件选项相比,引用文件的选项如”l”和”T”,在出现的地方会引起文件被读取。

重复不同的参数的non-file选项不会产生进一步的影响,或许会覆盖前面的效果(出现在命令行左侧的参数)。

多余一个的选项可能是更有意义的,将会在下面进行描述。

non-option参数是对象文件或被链接在一起的文件。他们或者跟在命令行选项后面或者位于命令行选项前面或者与命令行选项混杂在一起,除非对象文件参数可能不会放到选项和参数之间。

通常链接器在至少有一个对象文件时才被调用,但是你可以使用”-l” “-R”或脚本命令语言指定其他形式的二进制输入文件,如果没有指定任何二进制输入文件,链接器不会产生任何输出,会产生消息:“No input files”。

如果链接器不能识别对象文件的格式,它会假定它是一个链接脚本。用这种方式指定的脚本会扩充链接器使用的主链接脚本(默认的链接脚本或-T指定的脚本)。

这个特性使得链接器会去链接一些文件,这些文件看上去像是object或archive,而实际上仅仅包含几个符号定义或使用INPUT或GROUP来去load其它objects.

用这种方式指定一个脚本仅仅是扩充了主链接脚本,而用"-T"选项是替换整个链接脚本,但是要主要对"INSERT"命令的影响法(Chapter 3 [Scripts], page 37.)

对于名字是单个字母的选项,选项参数必须跟在选项字母后面,不需要空格,或者作为一些分开的参数跟在选项后面。

对于有多个字母的选项,字母前面可以由一条或者两条的短线,比如:‘-trace-symbol’ and ‘--trace-symbol’是等价的。

注;由一个例外是如果以o开头的多个字母选项,前面必须有两条短线,这是为了避免与-o选项混淆,比如:‘-omagic’设置输出文件名为 ‘magic’ 而‘--omagic’输出时设置 NMAGIC标记
对于多字母选项必须用"="将选项名分开,或者作为参数直接跟在选项名后面,如:‘--trace-symbol foo’ and ‘--trace-symbol=foo’是等价的。多字母选项的唯一缩写也是可以的

注:如果链接脚本是通过编译器驱动间接调用,则所有的链接器命令行选项必须以'-Wl'为前缀(对有些特定的编译器都是可以的),举例如下:

gcc -Wl,--start-group foo.o bar.o -Wl,--end-group

这是很重要的,否则编译器驱动会悄悄的删除掉这些链接器选项,造成链接错误。

当通过编译器驱动传递的选项需要值的时候,可能引起混乱,因为选项和参数之间的空格扮演一个分隔符,这样编译器驱动只会传递选项给链接器,参数传递给编译器,

这种情况下最简单的处理方法是像下面这样:(单字母选项直接后跟参数,多字母选项用=连接)

gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map

Linker Scripts2--链接器选项概述的更多相关文章

  1. C++链接器工具错误:LNK2001, LNK2019(转载)

    这是归属于链接器工具错误 这一类. 无法解析的外部符号“symbol” 代码引用了链接器无法在库和对象文件中找到的内容(如函数.变量或标签). 可能的原因 代码请求的内容不存在(例如,符号拼写错误或使 ...

  2. 深入探究VC —— 链接器link.exe(4)

    在程序编译完成后,生成的文件是以.obj为扩展名的对象文件,link.exe是将这些对象文件与库链接起来以创建可执行文件或动态链接库文件的工具. link.exe的输入文件包括obj文件.lib文件. ...

  3. C入门语言基础一[可移植性、涉及的三种文件、编程7个步骤、编译器、链接器]

    Review Questions What dose portability mean in the context of programming? 文中讲到的可移植性是什么意思?   C本身是不涉及 ...

  4. gcc ld 链接器相关知识,调试指令(程序员的自我修养----链接、装载与库)

    最近解决一个动态链接上的问题,因为以前从来没有接触过这方面的知识,所以恶补了一下,首先要了解gcc编译指令(makefile),ld链接器的选项(还有连接脚本section指定内存位置),熟悉查看连接 ...

  5. Linux ToolChain (二) --- Linker (1)链接选项 -L -rpath -rpath-link

    一.动态库的链接和链接选项-L,-rpath-link,-rpath (1). 现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开, 用 ...

  6. 链接器(linker)的作用——CSAPP第7章读书笔记

    首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:“Process is fundamentally ...

  7. ld.so和ld-linux.so* :动态链接器/加载器(转)

    概述 动态链接器可以被正在运行的动态链接程序或者动态对象(没有对动态链接器指定命令选项,动态链接器被存储在程序的.interp区域)间接调用,也可以直接运行程序, 例如:/lib/ld-linux.s ...

  8. LLD-LLVM链接器

    LLD-LLVM链接器 LLD是LLVM项目中的链接器,是系统链接器的直接替代,并且运行速度比它们快得多.它还提供了对工具链开发人员有用的功能. 链接器按完整性降序支持ELF(Unix),PE / C ...

  9. 链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的

    解决方法: 1.打开该项目的"属性页"对话框. 2.单击"链接器"文件夹. 3.单击"命令行"属性页. 4.将 /SAFESEH:NO 键入 ...

随机推荐

  1. MySQL数据库基础学习

    MySQL基础知识 ----------- MySQL数据库简介 内存:一断电数据就没有了---------数据库:可以实现数据的持久化存储,有完整的管理系统管理,方便查询--------- DB:数 ...

  2. eslint相关工具

    eslint工具 1. vscode搜索eslint安装,就可以在写代码时报eslint的错误了 2.文件 --> 首选项 --> 设置 --> 选ESLint --> 勾选A ...

  3. HTTP深入理解

    HTTP被设计于二十世纪九十年代初期,是一种可扩展的协议, 它是应用层的协议, 通过TCP,或TLS加密的TCP连接来发送, 理论上任何可靠的传输协议都可以使用. 因其良好的扩展性,时至今日,它不仅被 ...

  4. input:checked + label用法

    input:checked ~ label   :相邻同胞选择器,选择被选中的input标签后 所有的label标签[input  和 label标签有共同的父元素]: input:checked + ...

  5. SpringMvc+jQuery 文件拖拽上传、选择上传

    最近做了个简易的基于boostrap的文件上传功能,jsp版本的,后续会完善更多的功能,不过现在已经能用了,需要的小伙伴,直接引用下面的文件内容直接copy到自己的项目中就ok了,效果如图: file ...

  6. Ubuntu 云服务器上部署自己的 Rails 应用

    自学rails一段时间了,之前只用heroku部署了网站,想尝试把网站以一个更“正经”的方式呈现出来,就买了一个阿里云服务器.参考了网上部分rails部署教程,过程中也遇到了一些问题,所以在完成之后总 ...

  7. uby on rails 用户密码加密

    运行环境: rails 4.2.1                    ruby 2.0.0p481                   mysql(支持多种数据库) 在实际的项目中,需要注意对用户 ...

  8. 阿里云部署Web项目

    1.首先最基本的购买服务器和域名(学生党可以享受每月9块钱的优惠,不知道为什么,pc端不能购买,只能下载阿里云APP购买)  下载APP后打开:学生专区-学生特权-购买(我选择的是ubuntu,这个随 ...

  9. golang os包使用笔记

    zhangsan os.Stidn 标准输入 os.Stdout 标准输出 os.Stderr 标准错误输出

  10. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...