Hexagon Binutils GNU 手册(12)

240 篇文章 11 订阅

3.2.2 Linker options(续3.2.2)

–dynamic-list file
指定一个动态列表文件的名称,该文件包含将由链接器处理的符号列表。
这个选项用于创建包含全局符号的共享库,这些符号的引用不能与共享库内的定义绑定。它也被用来创建动态链接的可执行文件,指定一个符号列表添加到可执行文件的符号表中。
动态列表文件的内容与版本节点的格式相同(第3.3.12节),但没有范围和节点名称。
–dynamic-list-cpp-new
指定C++ new和delete操作符的内置动态列表。这个选项对于构建libstdc++的共享版本很有用。详见 --dynamic-list。
–dynamic-list-cpp-typeinfo
指定用于C++运行时类型识别的内置动态列表。详见 –dynamic-list
–dynamic-list-data
指定所有全局数据符号作为动态列表的一部分。详见 –dynamic-list
-e entry --entry entry
使用entry作为开始执行你的程序的明确符号,而不是默认的入口点。参见第3.3.10节关于默认值和其他指定入口点的方法的讨论。
–exclude-libs lib [,lib]
不自动导出指定归档库中的符号。指定符号ALL作为库的参数会影响所有存档库中的符号。受此选项影响的符号会被视为隐藏的。
-E
–export-dynamic

当创建一个动态链接的可执行文件时,将所有符号添加到动态符号表。动态符号表是在运行时从动态对象中可见的符号集。如果不使用这个选项(或者用***–no-export-dynamic***恢复默认设置),动态符号表通常只包含那些由链接中明确指定的动态对象引用的符号。
如果dlopen被用来加载一个动态对象,而这个动态对象需要回溯到程序所定义的符号(而不是其他动态对象所定义的符号),那么在链接程序本身时可能需要使用这个选项。参见 –dynamic-list
**注意***这个选项隐含地断言 –force-dynamic,以确保即使没有动态库被链接到程序中,也会创建一个动态部分。
-EB
链接big-endian对象。这影响到默认的输出格式。
–eh-frame-hdr
在动态链接的ELF可执行文件中创建.eh_frame_hdr部分和PT_GNU_EH_FRAME段头。
–EL
链接小-endian对象。这将影响到默认的输出格式。
–enable-new-dtags
在ELF可执行文件中创建新的动态标记。
–error-unresolved-symbols
为任何未解决的符号生成错误。该选项为默认设置。
-f
–auxiliary name

当创建一个共享对象时,将内部DT_AUXILIARY字段设置为指定的名称。这通知动态链接器,共享对象的符号表应该被用作共享对象名称的符号表的辅助过滤器。如果你以后针对这个过滤器对象链接一个程序,当你运行这个程序时,动态链接器将看到DT_AUXILIARY字段。如果动态链接器解析过滤器对象的任何符号,它将首先检查共享对象名称中是否有一个定义。如果有,它将被用来代替过滤器对象中的定义。共享对象的名称不需要存在。因此,共享对象名可以用来提供某些函数的替代实现,也许是为了调试或机器的特定性能。
注意 这个选项可以指定一次以上。DT_AUXILIARY条目是按照它们在命令行中出现的顺序创建的。
-F name --filter name
当创建一个共享对象时,将内部DT_FILTER字段设置为指定的名称。这告诉动态链接器,正在创建的共享对象的符号表应该被用作共享对象名称的符号表的过滤器。如果你以后针对这个过滤器对象链接一个程序,当你运行这个程序时,动态链接器将看到DT_FILTER字段。动态链接器将像往常一样根据过滤器对象的符号表解析符号,但实际上它将链接到共享对象名称中找到的定义。因此,过滤器对象可以用来选择对象名称所提供的符号的子集。一些旧的链接器在整个编译工具链中使用-F选项,用于指定输入和输出对象文件的对象文件格式。GNU 链接器为此目的使用了其他机制:-b, --format, --oformat 选项,链接器脚本中的 TARGET 命令,以及 GNUTARGET 环境变量。在不创建共享对象时,GNU 链接器会忽略 -F 选项。
–fatal-warnings
将所有警告视为错误。
参见下面的 –no-fatal-warnings
-fini name
当创建一个ELF可执行文件或共享对象时,当可执行文件或共享对象被取消时,调用指定的名称。
当可执行文件或共享对象被卸载时,通过将DT_FINI设置为该函数的地址来调用指定的名称。默认名称是_fini。
–forced-dynamic
强制输出文件包括动态部分。
–force-exe-suffix
确保输出文件有一个.exe的后缀。如果一个成功构建的、完全链接的输出文件没有.exe或.dll的后缀,这个选项会强制链接器将输出文件复制到一个具有.exe后缀的同名文件。当在Microsoft Windows主机上使用未经修改的UNIX makefiles时,这个选项很有用,因为某些版本的Windows不会运行一个图像,除非它以.exe的后缀结尾。
-g

忽略不计。为与其他工具兼容而提供。
-G size --gpsize size
如果全局bss部分(第2.4.3节)中的公共符号小于或等于指定的尺寸,则分配这些符号。大小的单位是字节。默认为8。
通用符号是用汇编器指令.comm和.lcomm来声明的(第2.6节)。
汇编器也支持-G选项(第2.2.2.6节)。如果汇编器将一个公共符号分配到全局bss部分,即使链接器的-G选项指定了一个比公共符号小的尺寸,链接器也不会将该符号从该部分移除。比如说。
.comm foo, 8
.comm bat, 16

hexagon-as -mv4 -G 8 -c foo.s -o foo.o
hexagon-ld -mv4 -G 4 foo.o -o foo

在汇编过程中,公共符号foo被汇编器选项-G 8分配到全局bss部分。因此,在链接过程中,foo仍然被分配到全局bss部分,即使它超过了链接器中指定的大小(-G 4)。
如果链接命令被改为如下:

hexagon-ld -mv4 -G 16 foo.o -o foo

…然后由于较大的尺寸限制(-G 16),上面定义的公共符号bat在连接时将被分配到全局bss部分(尽管它太大了,在装配时无法分配)。
–gc-sections
从输出文件中删除所有未使用的输入部分(这个过程被称为垃圾回收)。
该选项与编译器选项-ffunction- sections和-fdata-section一起使用。更多信息请参见 Hexagon GNU C/C++ GNU 编译器。A GNU Manual.
注意 该选项与-r选项不兼容。
-h name -soname name
当创建一个共享对象时,将内部DT_SONAME字段设置为指定的名称。当一个可执行文件与一个有DT_SONAME字段的共享对象链接,然后运行该可执行文件时,动态链接器将尝试加载DT_SONAME字段所指定的共享对象,而不是使用给链接器的文件名。
–hash-size=number
将链接器的哈希表的默认大小设置为接近指定值的素数。增加数字可以减少链接时间,但代价是增加内存用量。相反,减少数字可以在牺牲速度的情况下减少内存的使用。
如果使用了***–reduce-memory-overloads***,并且没有使用–hash-size,默认值是1021。
–help
在标准输出上打印命令行选项的摘要并退出。使用这个选项时,没有指定输入文件。
-i
执行一个增量链接(与选项-r相同)。
-init name
当创建一个ELF可执行文件或共享对象时,当可执行文件或共享对象解开时,调用指定的名称。
可执行文件或共享对象被卸载时,通过将DT_INIT设置为该函数的地址来调用指定的名称。默认名称是_init。
-l[:]archive --library [:]archive
将归档文件archive添加到要链接的文件列表中。这个选项可以使用任意次数。
如果在文件名中指定了可选的冒号前缀(:),链接器将在其路径列表中搜索文件名 "archive “的出现次数。
如果没有指定:前缀,链接器将首先搜索其路径列表中的文件名 “libarchive.so”,然后再搜索 “libarchive.a”。
根据惯例,.so的扩展名表示共享库。链接器只在命令行上指定的位置搜索一次存档。如果归档文件定义了一个符号,而这个符号在命令行中出现在归档文件之前的某个对象中是未定义的,那么链接器将包括归档文件中适当的文件(s)。然而,在命令行中后来出现的对象中未定义的符号不会导致链接器再次搜索存档。请参阅”-("选项,以了解强迫链接器多次搜索存档的方法。你可以在命令行中多次列出同一个存档。这种搜索归档的方式是UNIX链接器的标准。
-Lsearchdir --library-path searchdir
将路径 searchdir 添加到链接器将搜索归档库和链接器控制脚本的路径列表中。你可以使用这个选项的次数不限。这些目录是按照命令行上指定的顺序来搜索的。在命令行中指定的目录会在默认目录之前被搜索到。所有的-L选项适用于所有的-l选项,不管这些选项出现的顺序如何。默认搜索的路径集(没有用-L指定)取决于链接器使用的仿真模式,在某些情况下也取决于它的配置方式。参见第3.2.3节。
路径也可以用SEARCH_DIR命令在链接脚本中指定。以这种方式指定的目录会在链接器脚本出现在命令行中的时候被搜索到。
-memulation
仿真链接器。你可以用 --verbose 或 -V 选项列出可用的仿真。如果没有使用-m选项,仿真就来自LDEMULATION环境变量,如果该变量被定义的话。否则,默认的模拟方式取决于链接器是如何配置的。 使用www.DeepL.com/Translator翻译(免费版)
-M
–print-map

打印一个链接图到标准输出。链接图提供关于链接的信息,包括以下内容。
对象文件和符号在哪里被映射到内存中。普通符号是如何分配的。
链接中包括的所有存档成员,并提及导致存档成员被带入的符号。
分配给符号的值。
注意 在链接图中显示在方括号内的符号值表示该符号值是由一个表达式计算出来的,该表达式包括对同一符号的前一个值的引用。这种值可能是反直觉的。
-Map mapfile
打印一个链接地图到文件mapfile中。见上文对-M选项的描述。
-march archname -mcpu archname
指定输出文件的目标Hexagon处理器架构(即指令集),可以是hexagonv4、hexagonv5或hexagonv55。所有输入文件必须是用指定的体系结构生成的。默认是第一个输入文件中指定的架构。
-mv4
相当于。-march hexagonv4
-mv5*
相当于 -march hexagonv5
-mv55
等同于 -march hexagonv55
-n
–nmagic

将文本段设置为只读,如果可能的话,将输出标记为NMAGIC。
–N --omagic
将文本和数据段设置为可读和可写。另外,不要对数据段进行页对齐。如果输出格式支持UNIX风格的神奇数字,则将输出标记为OMAGIC。
–no-allow-shlib-undefined
不允许共享对象库中出现未定义的符号。–allow-shlib- undefined 恢复默认设置。
–no-add-need
不要为每个共享库添加DT_NEEDED标记,这些标记来自于DT_NEEDED标记。通常情况下,链接器会为这类库添加DT_NEEDED标签。–add-needed 恢复默认行为。
–no-as-needed
不限制将DT_NEEDED标签添加到满足符号参考的库中,该库被链接时未定义。这个选项是默认设置。
–no-check-sections
不检查章节地址是否重叠。
–no-define-common
抑制对公共符号的地址分配。脚本命令INHIBIT_COMMON_ALLOCATION也有同样的效果(第3.3.13节)。
这个选项使用户能够将为公共符号分配地址的决定与输出文件类型的选择脱钩;否则,一个不可重定位的输出类型会强制为公共符号分配地址。
使用这个选项允许从共享对象中引用的公共符号只在主程序中被分配地址。这消除了共享对象中未使用的重复空间,同时也防止了在许多动态模块存在专门的运行时符号解析搜索路径时可能出现的解析到错误重复的混乱。
–no-demangle
不要在错误信息和其他输出中去掉符号名称。
–no-export-dynamic
在创建动态链接的可执行文件时,不要将所有符号添加到动态符号表中。
–no-fatal-warnings
不把警告当作错误处理。这是默认设置。
–no-gc-sections
不从输出文件中删除未使用的输入部分。
–no-keep-memory
链接器通常通过在内存中缓存输入文件的符号表来优化速度而不是内存使用。这个选项告诉链接器,在必要时通过重读符号表来优化内存的使用。如果链接器在链接一个大的可执行文件时内存空间不足,可能需要这样做。
–no-omagic
否定-N选项的大部分作用。将文本部分设置为只读,并强制数据段为页对齐。
注意 这个选项不允许针对共享对象库进行链接。要做到这一点,请使用-Bdynamic选项。
–no-print-gc-sections
不向stderr列出所有在连接过程中被垃圾收集删除的部分。
–no-undefined
报告普通对象文件中未解决的符号引用(即使链接器正在创建一个共享对象)。
–allow-shlib-undefined
选项控制在共享对象库中进行链接时报告未解决的引用。
与下面的-z defs相同。
–no-undefined-version
不允许有未定义版本的符号;如果检测到一个,产生一个致命的错误。通常情况下,链接器会忽略未定义版本的符号。
–no-warn-mismatch
通常情况下,如果你试图将因某种原因而不匹配的输入文件连接在一起,链接器会给出一个错误,也许是因为它们是为不同的处理器或为不同的endian-ness而编译的。这个选项告诉链接器,它应该默默地允许这种可能的错误。只有在你采取了一些特殊措施确保链接器的错误是不恰当的情况下,才应该小心地使用这个选项。
–no-whole-archive
禁用-whole-archive选项对命令行上指定的后续归档文件的影响。
–noinhibit-exec
只要可执行的输出文件仍可使用,就保留它。通常情况下,如果链接器在链接过程中遇到错误,就不会产生输出文件;当它发出任何错误时,就会退出,不写输出文件,无论如何。
-nostdlib*
只搜索在命令行中明确指定的库目录。在链接器脚本中指定的库目录(包括在命令行中指定的链接器脚本)会被忽略。
-o output --output output
使用output作为链接器产生的程序的名字;如果没有指定这个选项,默认使用a.out这个名字。脚本命令OUTPUT也可以指定输出文件名。
-O level
当指定的数值大于0时,优化链接器的输出。 这个选项只影响到共享库的生成。
注意 这个选项可能会大大增加链接时间–因此它应该只在链接最终二进制文件时使用。
–oformat output-format
链接器可以被配置为支持一种以上的对象文件。如果你的链接器是这样配置的,你可以使用 --oformat 选项来指定输出对象文件的二进制格式。即使链接器被配置为支持替代的对象格式,你通常也不需要指定,因为链接器应该被配置为产生默认的输出格式,即每台机器上最常用的格式。 output-format是一个文本字符串,是BFD库支持的特定格式的名称。(你可以用 objdump -i 列出可用的二进制格式。)脚本命令 OUTPUT_FORMAT 也可以指定输出格式,但这个选项会取代它。参见第3.5节。
–print-gc-sections
向stderr列出所有在链接过程中被垃圾回收删除的部分。这个选项只有在用 --gc-sections 启用了垃圾回收后才有效。默认设置可以用–no-print-gc-sections来恢复。
-q
–emit-relocs

在完全链接的可执行文件中保留重定位部分和内容。链接后分析和优化工具可能需要这些信息来对可执行文件进行正确的修改。这个选项会使可执行文件变大。
-r
–relocateable

生成可重定位的输出(即,生成一个输出文件,反过来可以作为链接器的输入)。这通常被称为部分链接。作为一个副作用,在支持标准UNIX魔数的环境中,这个选项也将输出文件的魔数设置为OMAGIC。如果没有指定这个选项,就会产生一个绝对文件。当连接C++程序时,该选项不会解析对构造函数的引用(要解析的话,使用-Ur)。这个选项等同于-i。
-R file --just-symbols file
从指定的文件中读取符号名称和它们的地址,但不重新定位它们,也不把它们包括在输出中。这允许你的输出文件以符号方式引用其他程序中定义的绝对内存位置。为了与其他ELF链接器兼容,如果-R选项后面是一个目录名,而不是一个文件名,它将被当作-rpath选项处理。
注意 这个选项可以被指定一次以上。
–reduce-memory-overheads
在牺牲速度的情况下减少链接内存的使用。这个选项部署了一个O(n2)算法来生成链接图文件,而不是默认的O(n)算法,后者在符号存储方面多用了大约40%的内存。
该选项还将默认的哈希表大小设置为1021,这在牺牲链接时间的情况下节省了内存。哈希表的大小可以用-hash- size选项来覆盖。
–retain-symbols-file file
只保留指定文件中列出的符号,放弃所有其他的符号。文件只是一个平面文件,每行有一个符号名称。这个选项在逐渐积累大型全局符号表的环境中特别有用,可以节省运行时内存。–retain-symbols-file不会丢弃未定义的符号,或重定位所需的符号。你只能在命令行中指定 – retain-symbols-file一次。它取代了-s和-S。
-rpath dir
将一个目录添加到运行时库搜索路径中。这在连接带有共享对象的ELF可执行文件时使用。所有的-rpath参数被连接起来并传递给运行时链接器,它在运行时使用这些参数来定位共享对象。当定位共享对象时也使用-rpath选项,这些共享对象被明确包含在链接中的共享对象所需要;见-rpath-link选项的描述。如果不使用-rpath,环境变量LD_RUN_PATH的内容将被使用,如果它被定义。在SunOS上也可以使用-rpath选项。默认情况下,在SunOS上,链接器将从它所给的所有-L选项中形成一个运行时搜索补丁。如果使用了-rpath选项,运行时搜索路径将完全使用-rpath选项形成,忽略-L选项。这在使用GCC时很有用,GCC增加了许多可能在NFS挂载的文件系统上的-L选项。为了与其他ELF链接器兼容,如果-R选项后面是一个目录名,而不是一个文件名,它将被视为-rpath选项。
-rpath-link dir
一个共享对象可能需要另一个。当链接器-shared link包括一个共享对象作为输入文件之一时,就会发生这种情况。当链接器在做非动态、非可重定位的链接时遇到这样的依赖关系,它会自动尝试定位所需的共享对象并将其包含在链接中,如果它没有被明确包含的话。在这种情况下,-rpath-link选项指定了要搜索的第一组目录。该选项可以通过指定一个由冒号分隔的名称列表,或者多次出现,来指定一个目录名称序列。链接器使用下列搜索路径来定位所需的共享库。

  1. 任何由-rpath-link选项指定的目录。
  2. 任何由-rpath选项指定的目录。-rpath和-rpath-link的区别在于,由-rpath选项指定的目录包含在可执行文件中并在运行时使用;而-rpath-link选项只在链接时有效。
  3. 如果没有使用-rpath和rpath-link选项,搜索环境变量LD_RUN_PATH的内容。
    1. 对于本地链接器来说,环境变量LD_LIBRARY_PATH的内容。
  4. 默认目录,通常是/lib和/usr/lib。
  5. 如果没有找到所需的共享对象,链接器将发出警告并继续链接。
    -s
    –strip-all

    省略输出文件中的所有符号信息。
    -S
    –strip-debug

    从输出文件中省略调试器符号信息(但不是所有符号)。
    –section-start section=org
    在输出文件中找到一个由org指定的绝对地址的部分。这个选项可以在命令行中重复,以定位多个部分。org必须是一个十六进制的整数。为了与其他链接器兼容,你可以省略通常与十六进制值相关的前导0x。
    注意 在section、"="和org之间不能有任何空格。
    –sort-common[=(ascending|descending)]
    将常见的符号(按大小)按指定的顺序排列在适当的输出部分。默认的排序顺序是降序。
    注意 在一个部分中对符号进行排序可以防止符号之间因对齐限制而出现空隙。
    –sort-section=(name|alignment)
    将排序标准SORT_BY_NAME或SORT_BY_ALIGNMENT应用于链接器脚本中的所有通配符部分模式。
    –split-by-file [size]
    类似于 --split-by-reloc,但是当达到指定的大小时,为每个输入文件创建一个新的输出部分。默认大小为1。
    –split-by-reloc [count]
    试图在输出文件中创建额外的部分,使文件中的单个输出部分都不包含超过指定数量的重定位。链接器不会为重新分配而分割单个输入部分,所以如果单个输入部分包含超过指定数量的重定位,一个输出部分将包含这么多重定位。默认的重定位计数是32768。
    –stats
    计算和显示关于链接器操作的统计数据,如执行时间和内存使用情况。
    –sysroot=directory
    指定sysroot的目录位置,覆盖配置时的默认值。这个选项只在用–with-sysroot配置的工具链上支持。
    -t -trace
    在链接器处理输入文件时打印这些文件的名称。
    -T commandfile --script commandfile
    从文件commandfile中读取链接命令。这些命令取代了默认的链接器脚本(第3.4节),而不是添加到脚本中,所以commandfile必须指定描述目标格式的所有必要内容。如果你想使用一个只能在链接器脚本中出现一次的命令,比如SECTIONS或MEMORY命令(第3.3节),你必须使用这个选项。
    如果commandfile不存在,链接器会在前面任何-L选项指定的目录中搜索它。多个-T选项可以累加。
    –target-help
    打印所有针对目标的命令行选项的摘要到标准输出并退出。使用此选项时,不指定输入文件。
    -Tbss org -Tdata org -Ttext org
    使用org作为输出文件的bss、数据或文本段的起始地址,org必须是一个十六进制的整数。为了与其他链接器兼容,你可以省略通常与十六进制值相关的前导0x。
    -Ttext-segment=addr
    当创建ELF可执行文件或共享对象时,将文本段的第一个字节的地址设置为指定地址。
    -tcm
    使用链接器预定义的内存地址符号(第3.4.2节)为Hexagon处理器特定内存(第2.4.4节)定义内存段。参见第3.4.1节。
    –traditional-format
    对于某些目标,链接器的输出在某些方面与某些现有的链接器的输出不同。这个开关要求链接器使用传统格式来代替。
    –trampolines[=(yes|no)]
    每当程序分支的目标地址太远,无法通过常规分支指令到达时,就会产生一个间接分支。默认情况下(对于参数和选项本身)是yes。
    注意 当使用-r选项时,该选项可能不起作用。如果是这种情况,请尝试使用编译器选项-ffunction-section和这个选项。更多信息请参见 Hexagon GNU C/C++ Compiler: A GNU Manual.
    -u symbol --undefined symbol
    强制将符号作为未定义符号输入到输出文件中。例如,这样做可能会触发链接来自标准库的额外模块。-u可以用不同的选项参数重复,以输入更多的未定义符号。这个选项等同于EXTERN链接器脚本命令。
    *** --unique[=section]***
    为每一个符合指定节段名称的输入节段创建一个单独的输出节段。如果没有指定章节名称,则为每个无主输入章节创建一个单独的输出章节。孤儿部分是指在链接器脚本中没有特别提到的部分。
    这个选项可以在命令行中多次使用;它可以阻止具有相同名称的输入部分的正常合并,覆盖链接器脚本中任何输出部分的分配。
    –unresolved-symbols=method
    指定链接器应如何处理任何未解决的符号。方法可以是下列数值之一。
    ignore-all
    不报告任何未解决的符号。
    report-all
    报告所有未解决的符号(默认)。
    ignore-in-object-files
    报告共享库中包含的未解决的符号,但忽略常规对象文件中的任何符号。
    忽略共享库中的符号
    报告常规对象文件中包含的未解决的符号,但忽略共享库中的任何符号。这在创建一个动态二进制文件时很有用,它所引用的所有共享库在链接器命令行中被指定为参数。
    注意 共享库的链接方式也可以用 --allow-shlib-undefined 选项来控制。
    如何报告未解决的符号,可以用 --warn-unresolved-symbols 选项来控制。
    -Ur
    对于C++程序以外的其他程序,这个选项等同于-r。它产生可重定位的输出(即一个输出文件,可以反过来作为链接器的输入。当连接C++程序时,-Ur会解析对构造函数的引用,与-r不同。在本身用-Ur链接的文件上使用-Ur是不起作用的;一旦构造函数表被建立,就不能再添加。只对最后的部分链接使用 -Ur,对其他的使用 -r。
    -v
    –version
    -V

    显示链接器的版本号。-V选项还列出了支持的模拟。使用这些选项时,不指定输入文件。
    –verbose | --dll-verbose
    显示链接器的版本号,并列出支持的链接器仿真。显示哪些输入文件可以和不能被打开。如果使用默认的链接器脚本,则显示链接器脚本(第3.4节)。使用这个选项时,不指定输入文件。
    –version-script file
    指定一个版本脚本的名称。这个选项在创建共享库时使用,用于为正在创建的库指定关于版本层次的额外信息。参见第3.3.12节。
    –warn-alternate-em
    如果一个对象有一个备用的ELF机器码,则发出警告。
    –warn-unresolved-symbols
    对任何未解决的符号产生警告而不是错误。参见–未解决的符号。
    –warn-common
    当一个通用符号与另一个通用符号或符号定义结合时发出警告。UNIX的链接器允许这种有点草率的做法,但其他一些操作系统的链接器则不允许。这个选项允许你从组合全局符号中发现潜在的问题。不幸的是,一些C语言库使用这种做法,所以你可能会收到关于库中和你的程序中的符号的警告。有三种全局符号,这里用C语言的例子来说明。
    int i = 1。
    一个定义,放在输出文件的初始化数据部分。
    extern int i;
    一个未定义的引用,它不分配空间。在某处必须有一个定义或一个变量的通用符号。
    int i;
    一个公共符号。如果一个变量只有(一个或多个)公共符号,它将被放在输出文件的未初始化数据区。链接器将同一变量的多个公共符号合并为一个符号。如果它们的尺寸不同,它将选择最大的尺寸。如果有相同变量的定义,链接器会将一个公共符号变成一个声明。
    –warn-common
    选项可以产生五种警告(下面列出)。每个警告由一对行组成:第一行描述刚刚遇到的符号,第二行描述之前遇到的同名符号。这两个符号中的一个或两个将是一个共同的符号。
    ❒将公共符号变成引用,因为已经有了该符号的定义。
    file(section): warning: common of ‘symbol’ overridden by definition
    file(section): warning: defined here
    ❒ 将一个普通符号变成引用,因为遇到了该符号的后期定义。这与前面的情况相同,只是遇到的符号顺序不同。
    file(section): warning: ‘symbol’ 的定义覆盖了 common
    file(section): warning: common is here
    ❒ 将一个公共符号与之前的相同大小的公共符号合并。
    file(section): warning: ‘symbol’ 的多个公共符号。
    file(section): warning: previous common is here
    ❒ 将一个公共符号与之前一个较大的公共符号合并。
    file(section): warning: common of ‘symbol’ overridden by larger common.
    file(section): warning: larger common is here
    ❒ 将一个公共符号与前一个较小的公共符号合并。这与前面的情况相同,只是遇到的符号的顺序不同。
    file(section): warning: common of ‘symbol’ overriding smaller common
    file(section): warning: smaller common is here
    –warn-once
    对每个未定义的符号只警告一次,而不是对每个引用它的模块警告一次。
    –warn-section-align
    如果一个输出部分的地址因为对齐方式而改变,则发出警告。通常情况下,对齐方式将由输入部分设置。只有在没有明确指定的情况下才会改变地址;也就是说,如果SECTIONS命令没有为该部分指定一个起始地址(见第3.3.9节)。
    –warn-shared-textrel
    如果链接器向共享对象添加DT_TEXTREL标签,则产生警告。
    –whole-archive
    对于命令行中在 --whole-archive 选项后提到的每个归档文件,在链接中包括归档文件中的每个对象文件,而不是在归档文件中搜索所需的对象文件。这通常用于将归档文件变成共享对象,迫使每个对象都包括在产生的共享对象中。
    注意 这个选项可以与 --no_whole-archive 选项一起指定一次以上。
    –wrap symbol
    为符号使用一个封装函数。任何未定义的对符号的引用都将被解析为__wrap_symbol。任何对__real_symbol的未定义的引用都将被解析为symbol。这可以用来为一个系统函数提供一个包装器。封装器函数应该被称为 __wrap_symbol。如果它想调用系统函数,它应该调用 __real_symbol。下面是一个微不足道的例子:
void *
         __wrap_malloc (int c)
         {
printf ("malloc called with %the linker\n", c);
           return __real_malloc (c);
         }

如果你使用 --wrap malloc 将其他代码与这个文件连接起来,那么所有对 malloc 的调用将调用函数 __wrap_malloc 来代替。在 __wrap_malloc 中对 __real_malloc 的调用将调用真正的 malloc 函数。
你可能想同时提供一个 __real_malloc 函数,这样没有 --wrap 选项的链接就会成功。如果你这样做,你不应该把 __real_malloc 的定义和 __wrap_malloc 放在同一个文件中;如果你这样做,汇编器可能会在链接器有机会把它封装为 malloc 之前解决这个调用。
-x
–discard-all

删除所有的本地符号。
-X
–discard-locals

删除所有临时符号(第2.5.2节)。
-y symbol --trace-symbol symbol
打印符号出现在其中的每个链接文件的名称。这个选项可以被赋予任何数量的次数。在许多系统上,有必要在前面加一个下划线。当你的链接中有一个未定义的符号,但不知道引用来自何处时,这个选项很有用。
-Y path
将路径添加到默认的库搜索路径中。这个选项的存在是为了兼容Solaris。
-z keyword
执行与共享库有关的各种操作。选项字符和下面的关键字之间必须有一个空格。
combreloc
对多个重定位部分进行组合和排序。这可以实现动态符号查找的缓存。
common-page-size=value
将仿真的公共页面大小设置为指定值。
defs
报告来自常规对象文件的未解决的符号引用(即使链接器正在创建一个共享对象)。与上面的-no-undefined相同。
execstack
将对象标记为需要可执行栈。
initfirst
当构建共享库时,指定其运行时初始化发生在同时带入进程的任何其他对象的初始化之前,并且其运行时最终化发生在任何其他对象的最终化之后。
interpose
指定该对象的符号表将除主可执行文件的符号外的所有符号进行穿插。
lazy
当构建一个共享库时,指定函数调用的绑定被推迟到函数被实际调用时(即懒惰绑定),而不是在加载时绑定。这是默认设置。
loadfltr
指定对象的过滤器在运行时立即被处理。
max-page-size=value
将仿真的最大页面大小设置为指定值。
muldefs
允许多个定义。
nocombreloc
禁用多个重定位部分的合并。
nocopyreloc
禁用复制重定位部分的产生。
nodefaultlib
指定对象的依赖性搜索忽略默认的库搜索路径。 nodelete
指定对象在运行时不应该被卸载。
nodlopen
指定该对象不能被dlopen使用。
nodump
指定该对象不能被dldump使用。
noexecstack
将对象标记为需要可执行堆栈。
norelro
不在对象中创建PT_GNU_RELRO段头。
now
在生成可执行文件或共享对象时,指定动态链接器在程序启动时(或使用dlopen链接到共享库时)解析所有符号,而不是将符号解析推迟到函数第一次被调用时。也被称为非懒惰运行时绑定。
origin
指定对象需要立即处理$ORIGIN。 relro
在对象中创建PT_GNU_RELRO段头。
-( archive … -)
–start-group archive … --end-group
反复搜索指定的档案,直到没有新的未定义引用被创建。档案可以被指定为明确的文件名或作为-l选项。
档案通常只被搜索一次,而且是按照它们的名字出现在命令行中的顺序。这个顺序很关键;如果一个归档文件中定义的符号需要用来解决另一个归档文件中未定义的符号引用,而这个归档文件出现在命令行的后面,那么链接器就无法解决这个符号引用。在这个选项中指定归档文件会使链接器反复搜索归档文件,直到所有这样的符号参考被解决。
使用这个选项有很大的性能代价。只有在两个或多个存档之间存在不可避免的循环引用时,才最好使用这个选项。
这个选项的括号形式在某些命令壳上可能不起作用,因为括号是由壳解释的。
@file
使用存储在指定文件中的命令参数(第3.2.1节)。
注意 at符号(@)和文件名之间不能有空格。

3.2.2 Linker options(完结)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值