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. sklearn-woe/iv-乳腺癌分类器实战

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  2. SPI设计

    目录 SPI设计 概述 寄存器配置 title: SPI设计 tags: ARM date: 2018-11-05 15:22:59 --- SPI设计 概述 在SPI协议中,有两个值来确定SPI的模 ...

  3. flask SQLALchemy外键及约束

    from flask import Flask,session from flask_sqlalchemy import SQLAlchemy import config app = Flask(__ ...

  4. JAVA核心技术I---JAVA基础知识(异常处理类)

    一:异常分类 Throwable:所有错误的祖先. Error:系统内部错误或者资源耗尽.不用我们管 Exception: 程序有关的异常.重点关注 –RuntimeException: 程序自身的错 ...

  5. struct sock注释

    针对 struct sock 的一些注释: struct sock { /* Socket demultiplex comparisons on incoming packets. */ __u32  ...

  6. angular,vue,react的基本语法—双向数据绑定、条件渲染、列表渲染、angular小案例

    基本语法: 1.双向数据绑定 vue 指令:v-model="msg" react constructor(){ this.state{ msg:"双向数据绑定" ...

  7. 阅读:ECMAScript 6 入门(1)

    参考 ECMAScript 6 入门 ES6新特性概览 ES6 全套教程 ECMAScript6 (原著:阮一峰) JavaScript 教程 重新介绍 JavaScript(JS 教程) 前言 学了 ...

  8. hdu 5179 beautiful number(数位dp)

    原题链接 题意:求[l,r]中高位%低位等于0的数字个数.(不含0)分析:此题有三种方法.1.暴搜,毕竟最多才10个位.2.数位dp,预处理好整体的,再处理细节. dp[i][j]表示第i位上的数字位 ...

  9. MapReduce实现词频统计

    问题描述:现在有n个文本文件,使用MapReduce的方法实现词频统计. 附上统计词频的关键代码,首先是一个通用的MapReduce模块: class MapReduce: __doc__ = ''' ...

  10. html中src与href的区别

    概述 src和href之间存在区别,能混淆使用.src用于替换当前元素,href用于在当前文档和引用资源之间确立联系. src src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档 ...