0

我有研究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-group -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 文件属于链接器标志。

4

1 回答 1

3

前缀只传递当前-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)

应该适用于您的情况。

于 2014-02-24T09:06:18.423 回答