ld.exe: لا يمكن العثور على رمز الإدخال _start

0

أتلقى التحذير بعد إضافتي -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 [email protected] $(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 إجابة

1
افضل جواب

ال التوجيه في البرنامج النصي linker يحدد فقط اسم رمز نقطة الدخول (أي وظيفة). ومع ذلك ، لا تزال بحاجة إلى توفير الوظيفة بهذا الاسم بالفعل في أحد ملفات المصدر الخاصة بك.

الحل الأرجح هو إعادة تسمية الخاص بك وظيفة ل وظيفة إذا كان لديك واحد. لاحظ أيضا أن لن يكون لديك و المعلمات لأنها عادة ما يتم توفيرها من قبل المكتبة القياسية. كما يجب ألا تعود أبدًا نظرًا لعدم وجود مكان يمكن الرجوع إليه. بدلاً من ذلك ، سيتعين عليك استدعاء وظيفة الخروج الخاصة بالنظام الأساسي: exit () syscall على Linux أو ExitProcess () على Windows. ومع ذلك ، قد لا يكون هذا ضروريًا إذا كنت تعمل في بيئة قائمة بذاتها (أي لا يوجد نظام تشغيل).

:مؤلف
فوق
قائمة طعام