将-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
标志传递给链接器,我也需要为其提供启动代码。有人知道我在这里做错了吗?
答案 0 :(得分:1)
链接脚本中的ENTRY
指令仅指定入口点符号(即函数)的名称名称。但是,您实际上仍然需要在您的一个源文件中为函数提供这样的名称。
最可能的解决方案是将main
函数重命名为_start
函数(如果有)。还要注意,_start
将没有argc
和argv
参数,因为它们通常由标准库提供。它也永远不会返回,因为无处可回。相反,您必须调用特定于平台的退出函数:在Linux上为exit() syscall在Windows上为ExitProcess()。但是,如果您在独立的环境(即无操作系统)中工作,则可能没有必要。