(案) >pr 1+2*3 → こんなふうに普通に書いたら、インタプリタ実行 7 >!pr 1+2*3 → こんなふうに!を頭に付けたらgccでコンパイルして実行 7
#include <stdio.h>
int main()
{
puts("hello, wolrd");
return 0;
}#include <stdlib.h>
int __getmainargs(int *argc, char ***argv, char ***env, int doWildCard, void *);
int mmain(int argc, char **argv);
void mainCRTStartup()
{
int argc, startupinfo[100/4 /* でもたぶん68バイトしか使ってない */];
char **argv, **env;
__getmainargs(&argc, &argv, &env, 0, startupinfo);
exit(mmain(argc, argv));
}OUTPUT_FORMAT(pei-i386)
SECTIONS
{
. = SIZEOF_HEADERS;
. = ALIGN(__section_alignment__);
.text __image_base__ + ( __section_alignment__ < 0x1000 ? . : __section_alignment__ ) :
{
*(.text)
*(SORT(.text$*))
*(.rdata)
*(SORT(.rdata$*))
}
.idata BLOCK(__section_alignment__) :
{
SORT(*)(.idata$2)
SORT(*)(.idata$3)
/* These zeroes mark the end of the import list. */
LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
SORT(*)(.idata$4)
SORT(*)(.idata$5)
SORT(*)(.idata$6)
SORT(*)(.idata$7)
__data_start__ = . ;
*(.data)
*(.data2)
*(SORT(.data$*))
}
.bss BLOCK(__section_alignment__) :
{
__bss_start__ = . ;
*(.bss)
*(COMMON)
__bss_end__ = . ;
}
}c:\mingw516\bin\gcc -m32 -Os mstartup.c -c -o mstartup.obj c:\mingw516\bin\gcc -m32 -Os %1.c -c -o %1.obj -Dmain=mmain c:\mingw516\bin\ld -T ldscript.txt -o %1.exe -Bdynamic -s mstartup.obj %1.obj -Bdynamic -Lc:/mingw516/bin/../lib/gcc/mingw32/3.4.5 -Lc:/mingw516/bin/../lib/gcc -Lc:/mingw516/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib -Lc:/mingw516/bin/../lib/gcc/mingw32/3.4.5/../../.. -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt
prompt>mcc hello
prompt>gcc --verbose hello.c -O3 -o hello.exeでデフォルトを出力させて、そこから「たぶんここはC言語では使わないだろう」と思うところを削っていって、それでちょっとだけ並べ替えて作りました(.rdataが.textの中に入るように、.dataが.idataの中に入るように)。
prompt>gcc --verbose hello.c -O3 -o hello.exeってやって取得しました。collect2.exe(=ldの実体)への引数もこれで分かります。そのうちの.oファイルについては不要なもの(=消してみても動作に支障がなかったもの)は全部消してサイズを節約しています。
[改造前] APlay *p = aOpenPlay(100000); // 適当な大きさのバッファ. APlay_mml(p, 0, "CDEFEDCR EFGAGFER"); APlay_mml(p, 1, "R1R1 CDEFEDCR"); APlay_run(p); [改造後] PLAY "CDEFEDCR EFGAGFER"; PLAY1 "R1R1 CDEFEDCR" →もはやワンライナーで十分。openもrunも自動でやる。
| コメント | お名前 | NameLink | |