Linker Scripts2--链接器选项概述
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--链接器选项概述的更多相关文章
- C++链接器工具错误:LNK2001, LNK2019(转载)
这是归属于链接器工具错误 这一类. 无法解析的外部符号“symbol” 代码引用了链接器无法在库和对象文件中找到的内容(如函数.变量或标签). 可能的原因 代码请求的内容不存在(例如,符号拼写错误或使 ...
- 深入探究VC —— 链接器link.exe(4)
在程序编译完成后,生成的文件是以.obj为扩展名的对象文件,link.exe是将这些对象文件与库链接起来以创建可执行文件或动态链接库文件的工具. link.exe的输入文件包括obj文件.lib文件. ...
- C入门语言基础一[可移植性、涉及的三种文件、编程7个步骤、编译器、链接器]
Review Questions What dose portability mean in the context of programming? 文中讲到的可移植性是什么意思? C本身是不涉及 ...
- gcc ld 链接器相关知识,调试指令(程序员的自我修养----链接、装载与库)
最近解决一个动态链接上的问题,因为以前从来没有接触过这方面的知识,所以恶补了一下,首先要了解gcc编译指令(makefile),ld链接器的选项(还有连接脚本section指定内存位置),熟悉查看连接 ...
- Linux ToolChain (二) --- Linker (1)链接选项 -L -rpath -rpath-link
一.动态库的链接和链接选项-L,-rpath-link,-rpath (1). 现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开, 用 ...
- 链接器(linker)的作用——CSAPP第7章读书笔记
首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:“Process is fundamentally ...
- ld.so和ld-linux.so* :动态链接器/加载器(转)
概述 动态链接器可以被正在运行的动态链接程序或者动态对象(没有对动态链接器指定命令选项,动态链接器被存储在程序的.interp区域)间接调用,也可以直接运行程序, 例如:/lib/ld-linux.s ...
- LLD-LLVM链接器
LLD-LLVM链接器 LLD是LLVM项目中的链接器,是系统链接器的直接替代,并且运行速度比它们快得多.它还提供了对工具链开发人员有用的功能. 链接器按完整性降序支持ELF(Unix),PE / C ...
- 链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的
解决方法: 1.打开该项目的"属性页"对话框. 2.单击"链接器"文件夹. 3.单击"命令行"属性页. 4.将 /SAFESEH:NO 键入 ...
随机推荐
- Hadoop问题:There are 0 datanode(s) running and no node(s) are excluded in this operation.
问题描述: org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /tmp/hadoop-yarn/staging/hado ...
- java 中对象比较大小
java 中对象比较大小 java 中对象比较大小有两种方法 1:实现Comparable 接口 的 public int compareTo(T o) 方法: 2:实现Comparator 接口 的 ...
- Golang入门教程(四)变量声明
Go 语言变量名由字母.数字.下划线组成,其中首个字母不能为数字. 一.Go的语言结构 1.Go的语言基础部分由这几个部分组成 包声明 引入包 函数 变量 语句&表达式 注释 比如下面这个简单 ...
- Spark源码剖析 - SparkContext的初始化(五)_创建任务调度器TaskScheduler
5. 创建任务调度器TaskScheduler TaskScheduler也是SparkContext的重要组成部分,负责任务的提交,并且请求集群管理器对任务调度.TaskScheduler也可以看作 ...
- Vertica系列: 自动生成Identity 字段值的方法
参考 https://thisdataguy.com/2015/01/05/vertica-some-uses-of-sequences/ 在 vertica 中有三种定义 identity 字段的方 ...
- 二.LinkedList原理及实现学习总结
一.LinkedList实现原理概述 LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同.LinkedList 是基于链表实现的(通过名字也能 ...
- 堵上NFine SubmitForm漏洞
NFine一个隐藏的漏洞(NFine基本上模仿力软的,力软应该也有,不知道新版本改了没),就是任何登录的用户都可以进行权限修改操作.比如所有模块的SumbitForm或者其它弹出窗口上的按钮,本身只有 ...
- 嫁给程序员的好处,你get到了吗?
首先,我们要知道,什么是程序员?程序员是做什么的? "程序员(英文Programmer)是从事程序开发.维护的专业人员.一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚, ...
- docker之搭建私有镜像仓库和公有仓库
一.搭建私有仓库 1.docker pull registry #下载registry镜像并启动 2. docker run -d -v /opt/registry:/var/lib/registry ...
- error.c
#include <stdio.h> #include <errno.h> #include <stdlib.h> #include <string.h> ...