【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

libc

VC++MINIXクロス開発でlibcをサポートしました。

id:n7shi:20100209ではシステムコールを直接呼んでいましたが、libcをサポートしたことで以下のような普通のCプログラムが動きます。

#include <stdio.h>

int main(int argc, char *argv[], char *envp[])
{
    int i;
    printf("argc = %d\n", argc);
    for (i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]);
    for (i = 0; envp[i] ; i++) printf("envp[%d] = %s\n", i, envp[i]);
    return 0;
}

3.1.6リリース

FOSDEM 2010にあわせてMINIX 3.1.6がリリースされました。

id:n7shi:20100203のクロス開発環境の配布物を3.1.6に更新しておきました。

Virtual PC 2007用のNICドライバが入っていますが、やや癖があるため説明します。

続きを読む

PEからa.outに変換して実行

a.outについて調べた結果、仕様的にはPEから変換が可能なようです。変換ツールを作ってみました。

id:n7shi:20100207のコードをgcc(MinGW)でコンパイルして変換してみます。

% i686-mingw32-gcc -o exit.exe -masm=intel -s -Ttext=0 -Wl,--image-base=0 \
  -Wl,--section-alignment=0x200 -nostdinc -nostdlib exit.c
% pe2aout exit.exe
convert PE to a.out: exit.exe => exit

生成したバイナリをMINIXにコピーしたところ、無事に動きました。後日VC++で試してみます。

a.outの分析 (2)

id:n7shi:20100205に引き続いてa.outを分析します。アセンブリ版ではサイズ縮小のためセクションを削りましたが、セクションを確認するためC言語版を分析します。

int m[] = { 0, 1/*EXIT*/, 42, 0, 0, 0, 0, 0, 0 };

void start()
{
	asm("mov eax, 0; mov ecx, 3; int 0x21" :: "b"(m));
}

配列をローカルで定義するとスタックへコピーされて冗長になるため、関数の外に出しました。

続きを読む

a.outの分析

id:n7shi:20100202でアセンブリ化したサンプルのダンプです。

00000000: 01 03 04 10 30 00 00 00-38 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00-38 00 50 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
00000030: B8 00 00 00 00 BB 11 00-00 00 B9 03 00 00 00 CD
00000040: 21 00 00 00 00 01 00 00-00 2A 00 00 00 00 00 00
00000050: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
00000060: 00 00 00 00 00 90 90 90

これを分析してみます。

続きを読む