链接器语法:链接器在链接期间不使用所有链接器的标志

Posted

技术标签:

【中文标题】链接器语法:链接器在链接期间不使用所有链接器的标志【英文标题】:Linker syntax : Linker does not use all of the linkers's flag during the linking 【发布时间】:2014-02-24 08:48:16 【问题描述】:

我有研究 makefile 项目。我正在使用 gnu gcc 并作为链接器,我使用带有以下参数的 gcc:

linkerCmdLine=$(exe) -Wl,--start-group -nostdlib -Map=test_mapfile.map -l:libc.a -l:libgcc.a -l:libm.a -Wl,--end-组 -o $(输出)

在链接过程中,链接器不会使用所有这些标志: 不使用标志-Map=test_mapfile.map

为什么??

有一个项目设置文件,其中还存储了链接器设置。

\u201ClinkerCmdLine\=$(exe) -Wl, --start-group -nostdlib -Map\=./99_output/PUZ_GPF.map --gc-sections -l\:libc.a -l\:libgcc. a -l\:libm.a -Wl,--end-group -o $(输出)\u201D

我必须如何正确存储设置?

已编辑:

地图文件工作正常,但链接器文件实际上有问题。我只使用以下标志:

“linkerCmdLine=$(exe) -Wl,--script=C:/workspace/test_project/test_linker_file.ld -static -o $(output)”

我在控制台窗口中收到此错误:

arm-none-eabi-gcc.exe:错误:无法识别的命令行选项'--script=C:/workspace/test_project/test_linker_file.ld'

我不明白为什么,因为映射文件和 .ld 文件属于链接器标志。

【问题讨论】:

【参考方案1】:

-Wl, 前缀只传递当前参数,用逗号分隔链接器参数。所以为了传递-z defs,你可以使用-Wl,-z,defs

此机制仅适用于真正的标志,即当命令行中的位置不相关时。 -l 参数不是标志,gcc 编译器驱动将它们收集到一个单独的列表中,并在单个块中传递它们。

因此,此技术不适用于您想要的确切命令行。另一方面,-nostdlib 禁止默认的-lc -lgcc -lm

通常在 gcc 规范(编译器驱动程序的脚本)中有一条规定,在静态链接时(这似乎是您想要做的)在标准库周围使用 --start-group--end-group

所以我认为

linkerCmdLine=$(exe) -Wl,-Map=test_mapfile.map -static -o $(output)

应该适用于您的情况。

【讨论】:

以上是关于链接器语法:链接器在链接期间不使用所有链接器的标志的主要内容,如果未能解决你的问题,请参考以下文章

如何知道二进制文件是否已与“pie”链接器标志链接?

gcc编译器选项-Wl,--no-undefined(告诉链接器在链接过程中不允许有未定义的符号)(gcc编译器和链接器是分离的工具,它们需要通过选项来进行通信)

第20课 链接过程简介

GLSL语法以及如何与程序链接

学习笔记 链接

-ObjC 链接器标志有啥作用?