链接器语法:链接器在链接期间不使用所有链接器的标志
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)
应该适用于您的情况。
【讨论】:
以上是关于链接器语法:链接器在链接期间不使用所有链接器的标志的主要内容,如果未能解决你的问题,请参考以下文章
gcc编译器选项-Wl,--no-undefined(告诉链接器在链接过程中不允许有未定义的符号)(gcc编译器和链接器是分离的工具,它们需要通过选项来进行通信)