[Mona] GOの続き
GOの作者のKさんからいろいろフォローいただきました。とりあえず exe形式まで作る事ができたのでその手順を。
go_0020s, go_0020w, go_0023pを用意する
- go_0020wディレクトリにある*.exeをgo_0020s\toolw32にコピーする
- go_0023pディレクトリにある*.exeをgo_0020s\toolw32にコピーする
- go_0023pディレクトリ以下にあるディレクトリをgo_0020sディレクトリにコピーする
- go_0020sディレクトリを go に名前変更
- \goにおいて、コマンド setmode go とする。
- \go\func\m_gasnas.c を編集する
"4incl INC", "2incw INC",
の下に
"1int INT", を追加
- \go\toolw32において make する
- gas2nask.exe 等が新しくビルドされているはず。
- \go\toolw32\hello.c
#define SYSTEM_CALL_PRINT (0x0001)
#define SYSCALL_1(syscall_number, result, arg1) \
asm volatile("movl $%c1, %%ebx \n" \
"movl %2 , %%esi \n" \
"int $0x80 \n" \
"movl %%eax, %0 \n" \
:"=m"(result) \
:"g"(syscall_number), "m"(arg1) \
:"ebx", "esi" \
);
int print(const char* msg)
{
int result;
SYSCALL_1(SYSTEM_CALL_PRINT, result, msg);
return result;
}
void _user_start()
{
print("Hello");
}
- cc1 -I. -Os -quiet -o helloc4.s helloc4.c
- \go\toolw32\hello.s を編集 空白をなくす
movl 8(%ebp) , %esi ⇒movl 8(%ebp),%esi
- gas2nask -a hello.s hello.nas
- nask hello.nas hello.obj hello.lst
- ld -nTtext 0xA0000000 -e __user_start -Bstatic hello.obj -o hello.exe
このhello.exe を Monaで実行したところアドレスエラーで異常終了してしまいました。
obj2bim3, bim2bin3等々を使った方が良いのだろうか。
追記:ld --Mapオプションで出力してみた。
Memory Configuration
Name Origin Length Attributes
*default* 0x00000000 0xffffffff
Linker script and memory map
0x00400000 __image_base__ = 0x400000
0x00000000 __dll__ = 0x0
0x00001000 __section_alignment__ = 0x1000
0x00000200 __file_alignment__ = 0x200
0x00000004 __major_os_version__ = 0x4
0x00000000 __minor_os_version__ = 0x0
0x00000001 __major_image_version__ = 0x1
0x00000000 __minor_image_version__ = 0x0
0x00000004 __major_subsystem_version__ = 0x4
0x00000000 __minor_subsystem_version__ = 0x0
0x00000003 __subsystem__ = 0x3
0x00200000 __size_of_stack_reserve__ = 0x200000
0x00001000 __size_of_stack_commit__ = 0x1000
0x00100000 __size_of_heap_reserve__ = 0x100000
0x00001000 __size_of_heap_commit__ = 0x1000
0x00000000 __loader_flags__ = 0x0
Address of section .text set to 0xa0000000
LOAD hello.obj
.text 0xa0000000 0x200
*(.init)
*(.text)
.text 0xa0000000 0x2a hello.obj
0xa000001b _user_start
0xa0000000 print
*(SORT(.text$*))
*(.glue_7t)
*(.glue_7)
0xa000002a ___CTOR_LIST__ = .
0xa000002a __CTOR_LIST__ = .
0xa000002a 0x4 LONG 0xffffffff
*(SORT(.ctors.*))
*(.ctors)
*(.ctor)
0xa000002e 0x4 LONG 0x0
0xa0000032 ___DTOR_LIST__ = .
0xa0000032 __DTOR_LIST__ = .
0xa0000032 0x4 LONG 0xffffffff
*(SORT(.dtors.*))
*(.dtors)
*(.dtor)
0xa0000036 0x4 LONG 0x0
*(.fini)
*(.gcc_exc)
0xa000003a etext = .
*(.gcc_except_table)
.data 0xa0001000 0x200
0xa0001000 __data_start__ = .
*(.data)
.data 0xa0001000 0x6 hello.obj
*(.data2)
*(SORT(.data$*))
0xa0001006 __data_end__ = .
*(.data_cygwin_nocopy)
.rdata
*(.rdata)
*(SORT(.rdata$*))
*(.eh_frame)
.pdata
*(.pdata)
.bss 0xa0002000 0x0
0xa0002000 __bss_start__ = .
*(.bss)
*(COMMON)
0xa0002000 __bss_end__ = .
.edata
*(.edata)
/DISCARD/
*(.debug$S)
*(.debug$T)
*(.debug$F)
*(.drectve)
.idata 0xa0002000 0x200
SORT(*)(.idata$2)
SORT(*)(.idata$3)
0xa0002000 0x4 LONG 0x0
0xa0002004 0x4 LONG 0x0
0xa0002008 0x4 LONG 0x0
0xa000200c 0x4 LONG 0x0
0xa0002010 0x4 LONG 0x0
SORT(*)(.idata$4)
SORT(*)(.idata$5)
SORT(*)(.idata$6)
SORT(*)(.idata$7)
.CRT
*(SORT(.CRT$*))
.endjunk 0xa0003000 0x0
0xa0003000 end = .
0xa0003000 _end = .
0xa0003000 __end__ = .
.rsrc
*(.rsrc)
*(SORT(.rsrc$*))
.reloc
*(.reloc)
.stab
*(.stab)
.stabstr
*(.stabstr)
OUTPUT(hello.exe pei-i386)