1

-nostdlib添加到链接器标志后,我收到了警告。

tricore/bin/ld.exe: warning: cannot find entry symbol _start; defaulting to c0000000

链接如下:

$(OUTDIR)/$(BINARY_NAME).elf: $(OUTDIR) $(OBJ) $(TRICORE_TOOLS)/bin/tricore-gcc -Tld/iRAM.ld -Wl,--no-warn-flags -Wl, --gc-sections -Wl,-n -nostdlib -o $@ $(OBJ) C:\OpenSSL-Win32\lib\MinGW \libssl-1_1.a C:\OpenSSL-Win32\lib\MinGW\libcrypto-1_1.a

我读到-nostdlib导致链接时不使用标准系统启动文件或库。文件 ld/iRAM.ld 如下所示,据我了解,它包含 _start 符号并传递给链接器:

ENTRY(_start)

/*
 * Global
 */
/*Program Flash Memory (PFLASH0)*/ 
__PMU_PFLASH0_BEGIN = 0x80000000;
__PMU_PFLASH0_SIZE = 2M;
/*Program Flash Memory (PFLASH1)*/ 
........
........
SECTIONS
{
/*Code-Sections*/

/*
 * Startup code for TriCore
 */
.startup_code  :
{
	PROVIDE(__startup_code_start = .);
........
}
.....
}

我已经读过,如果我将-nostdlib标志传递给链接器,我也需要向它提供启动代码。有谁知道我在这里做错了什么?

4

1 回答 1

2

链接描述文件中的ENTRY指令仅指定入口点符号(即函数)的名称。但是,您仍然需要在您的源文件之一中实际提供具有此类名称的函数。

最有可能的解决方案是将main函数重命名为_startfunction,如果你有的话。另请注意,_start不会有argcargv参数,因为它们通常由标准库提供。它也不应该返回,因为没有地方可以返回。相反,您必须调用特定于平台的退出函数:Linux 上的exit()系统调用或 Windows 上的ExitProcess()。但是,如果您在独立环境(即没有操作系统)中工作,这可能不是必需的。

于 2018-07-15T13:33:51.277 回答