前提
C言語でUEFIアプリを作っている。
実現したいこと
・UEFIアプリで変数aの番地を表示する。
発生している問題・エラーメッセージ
コンパイル時にx86_64-w64-mingw32でエラー発生
/usr/bin/x86_64-w64-mingw32-ld: /tmp/ccvzH9h3.o:main.c:(.text+0xe1): undefined reference to `___chkstk_ms' collect2: error: ld returned 1 exit status
該当のソースコード
C
1#define EFIAPI 2#define IN 3 4typedef unsigned long long UINTN; 5typedef UINTN EFI_STATUS; 6typedef short CHAR16; 7typedef void * EFI_HANDLE; 8 9typedef 10EFI_STATUS 11(EFIAPI *EFI_TEXT_STRING)( 12 IN struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, 13 IN CHAR16 *String 14); 15 16typedef struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL { 17 char buf1[8]; /*EFI_TEXT_RESET Reset; */ 18 19 EFI_TEXT_STRING OutputString; 20 char buf2[8]; /*EFI_TEXT_TEST_STRING TestString; */ 21 22 char buf3[8]; /*EFI_TEXT_QUERY_MODE QueryMode; */ 23 char buf4[8]; /*EFI_TEXT_SET_MODE SetMode; */ 24 char buf5[8]; /*EFI_TEXT_SET_ATTRIBUTE SetAttribute; */ 25 26 char buf6[8]; /*EFI_TEXT_CLEAR_SCREEN ClearScreen; */ 27 char buf7[8]; /*EFI_TEXT_SET_CURSOR_POSITION SetCursorPosition; */ 28 char buf8[8]; /*EFI_TEXT_ENABLE_CURSOR EnableCursor; */ 29 30 char buf9[8]; /*SIMPLE_TEXT_OUTPUT_MODE *Mode; */ 31} EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL; 32 33typedef struct { 34 char buf1[24]; /* EFI_TABLE_HEADER Hdr; */ 35 36 char buf2[8]; /* CHAR16 *FirmwareVendor; */ 37 char buf3[4]; /* UINT32 FirmwareRevision; */ 38 39 char buf4[8]; /* EFI_HANDLE ConsoleInHandle; */ 40 char buf5[8]; /* EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn; */ 41 42 char buf6[8]; /* EFI_HANDLE ConsoleOutHandle; */ 43 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut; 44 45 char buf7[8]; /* EFI_HANDLE StandardErrorHandle; */ 46 char buf8[8]; /* EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *StdErr; */ 47 48 char buf9[8]; /* EFI_RUNTIME_SERVICES *RuntimeServices; */ 49 char buf10[8]; /* EFI_BOOT_SERVICES *BootServices; */ 50 51 char buf11[8]; /* UINTN NumberOfTableEntries;*/ 52 char buf12[8]; /* EFI_CONFIGURATION_TABLE *ConfigurationTable; */ 53} EFI_SYSTEM_TABLE; 54 55 56EFI_STATUS 57efi_main ( 58 IN EFI_HANDLE ImageHandle, 59 IN EFI_SYSTEM_TABLE *SystemTable 60) { 61 62 short unsigned int *a = L"hogefuga"; 63 64 short unsigned int tmpstr[30]; 65 66 int dig_num = 0; 67 68 int memo = &a; 69 70 int dig = 10; 71 72 int i = 0; 73 74 while(1){ 75 76 if(memo == 0){ 77 break; 78 }else 79 if(memo % dig != 0){ 80 memo -= dig/10; 81 82 dig_num += 1; 83 } 84 if(memo % dig == 0){ 85 86 tmpstr[i] = dig_num; 87 88 dig_num = 0; 89 90 dig = dig * 10; 91 92 i++; 93 } 94 95 } 96 97 short unsigned int outstr[i+1]; 98 99 outstr[i+1] = '\0'; 100 101 for(int j = 0;j < i;j++){ 102 outstr[i-j-1] = tmpstr[j]+48; 103 } 104 105 SystemTable->ConOut->OutputString(SystemTable->ConOut, outstr); 106 107 while (1); 108}
コンパイルコマンド
x86_64-w64-mingw32-gcc -Wall -Wextra -nostdinc -nostdlib -Wl,--subsystem,10 -e efi_main -o main.efi main.c
補足情報(FW/ツールのバージョンなど)
Ubuntu
x86_64-w64-mingw32-gcc 9.3
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。