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. Это, однако, может не потребоваться, если вы работаете в автономной среде (то есть без ОС).

Другие вопросы по тегам