ld.exe: невозможно найти символ ввода _start
Я получаю предупреждение после добавления -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
флаг компоновщику, мне нужно предоставить код запуска для него тоже. Кто-нибудь знает, что я здесь делаю не так?
1 ответ
ENTRY
директива в скрипте компоновщика задает только имя символа точки входа (т.е. функции). Однако вам по-прежнему нужно предоставить функцию с таким именем в одном из ваших исходных файлов.
Наиболее вероятным решением является переименование вашего main
функция к _start
функционировать, если у вас есть. Также обратите внимание, что _start
не будет иметь argc
а также argv
параметры, так как они обычно предоставляются стандартной библиотекой. Он также никогда не должен возвращаться, так как возвращаться некуда. Вместо этого вам придется вызывать специфическую для платформы функцию выхода: системный вызов exit() в Linux или ExitProcess() в Windows. Это, однако, может не потребоваться, если вы работаете в автономной среде (то есть без ОС).