【发布时间】:2015-10-08 08:57:45
【问题描述】:
我希望使用 GCC 驱动程序(“gcc”)而不是“ld”执行链接,(这样我就可以启用 link-step optimization)。
“gcc”的行为似乎与“ld”完全不同,并且不接受某些相同的命令行选项。更糟糕的是,我认为我遇到了与图书馆有关的问题。使用“gcc”进行链接,我得到了一些“未定义的引用”错误。其中许多是undefined reference to 'operator new(unsigned int)' 和undefined reference to '__aeabi_unwind_cpp_pr0'。
在我的设置中,提供 new 等函数的库是 Newlib。我正在 e2 Studio 中开发——Eclipse 的一个变体,专为瑞萨 MCU 开发而构建。 e2 Studio 被配置为给我一个“预构建”版本的 Newlib,而不是每次构建时都构建 Newlib。
在我的 makefile 中,链接是通过“ld”完成的,并且工作正常:
arm-none-eabi-ld
-o "RZ_A1H_USB_Host_Func_RSK.x"
-T"E:/Renesas e2 workspace/RZ_A1H_USB_Host_Func_RSK\HardwareDebug\LinkerSubCommand.tmp"
-T"E:\Renesas e2 workspace\RZ_A1H_USB_Host_Func_RSK\compiler_specific\GNU_e2studio-IRAM.ld"
$(USER_OBJS) $(LIBS) $(LIBRARY_GENERATOR_OUTPUTTYPE_OUTPUTS)
-L"C:\PROGRA~2\KPIT\GNUARM~1.02-\ARM-NO~1\ARM-NO~1/lib/gcc/arm-none-eabi//4.9-GNUARM-NONE_v14.02/interwork" -L"C:\PROGRA~2\KPIT\GNUARM~1.02-\ARM-NO~1\ARM-NO~1/lib/gcc/arm-none-eabi/4.9-GNUARM-NONE_v14.02/interwork"
-L"C:\PROGRA~2\KPIT\GNUARM~1.02-\ARM-NO~1\ARM-NO~1/arm-none-eabi/lib/interwork"
-lm
-lstdc++
-lc
-lgcc
-estart
但是,我所要做的就是将arm-none-eabi-ld 替换为arm-none-eabi-gcc,这会导致上述“未定义引用”错误。
有什么线索吗?我需要告诉“gcc”而我不需要告诉“ld”的东西?非常感谢您的帮助。
【问题讨论】:
-
一些linker options 被GCC 复制了,对于那些不是你可以使用
-Wl来指定发送到实际链接器的选项(参见链接参考的底部)。 -
啊,谢谢,我想知道如何指定这些额外的选项。然而,主要问题似乎是简单地将命令从“ld”更改为“gcc”会导致所有那些“未定义的引用”错误。有什么特别需要告诉 gcc 的吗?
-
与GCC链接时,是使用
gcc命令还是g++命令?因为如果您使用gcc链接,则 C++ 运行时将不会自动链接。如果您链接 C++ 程序,请改用g++。 -
谢谢,我一直在使用
gcc,但即使使用g++也有同样的问题。它抱怨对很多东西的未定义引用,包括sqrt、round、__aeabi_ui2f、strcmp、free、malloc、__cxa_pure_virtual等等。但如果我只使用带有完全相同的命令行选项的ld,一切都会完美运行。