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. Maven Tomcat7+ 实现自动化部署

    首先在Tomcat里配置deploy的用户(tomcat根目录/conf/tomcat-users.xml): <role rolename="tomcat"/> &l ...

  2. 信用评分卡 (part 2of 7)

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...

  3. RocketMQ_问题_启动报错,修改堆内存大小

    1.启动broker报错 虚拟机内存小,导致虚拟机中的JVM内存小,进而在启动broker时分配JVM内存遇到问题 查询网上得知,查看/usr/local/rocketmq-all-4.3.0/dis ...

  4. iptables之端口限速

    #iptables -A FORWARD -p tcp -m tcp --sport 10000 -m limit --limit 500/sec --limit-burst 1000 -j ACCE ...

  5. 【MSSQL】How can i see what IP address made the request to SQL Server?

    How can i see what IP address made the request to SQL Server? #背景 前提:有一个服务定时读取某台服务器上的sql server 数据库, ...

  6. MyBatis-Configuration

    一.引用 properties 配置文件 db.properties driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://192.168.8.136:33 ...

  7. python 面向对象(经典作业讲解)

    #############################总结######################## # lst =['python%s期' %i for i in range(510)]# ...

  8. Linux防火墙开放端口

    # vi /etc/sysconfig/iptables-A INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT -A INPUT - ...

  9. 免费开源.net的pdf操作控件PdfiumViewer

    最终我找到了pdffiumViewer.开源免费的.net组件. 亲测,可以按第一个下载地址,改写开发.如果对源码感兴趣,可以上GitHub网站 效果图:  1.源代码下载地址: https://do ...

  10. dom4j基础教程【转】

    转自 http://blog.csdn.net/whatlonelytear/article/details/42234937 ,但经过大量美化及补充. Dom4j是一个易用的.开源的库,用于XML, ...