OpenWatcom 1.4 で Linux 版はろーわーるど作ってみたヨ

まあ適当にやってみました。
ちなみにコンパイルしたソース (hw.c)。超なげやり。

#include <stdio.h>

void
main(void)
{
    printf("hello, world!\n");
}

手順1:ヘッダとライブラリがインストールされているか確認する。

とりあえず OpenWatcom のベースディレクトリ(ふつうは C:\WATCOM だと思う)の下に lh というディレクトリ(フォルダ)があるか確認する(じつ言うとさっぱりわからんのですが、たぶん Linux のときはこれ使うんですよね?)。私はインストール時に Selective installation を選んだので、Full installation 時に Linux ターゲットが使えるようになってるのかどうかよくわからない。入ってなかったらもう一度インストーラを実行して、Selective installation → Target で Linux をチェックしてインストール。

手順2:ビルドターゲット向けの INCLUDE パス指定

ターゲットを Linux にするときは lh の下にあるヘッダを使うようにする。具体的には環境変数 linux_INCLUDE の設定。コマンドプロンプトコンパイラを使うならこんな感じ(統合環境の場合はシラネ)。

set linux_INCLUDE=%WATCOM%\lh

つまり、コンパイラオプションに -bt=hoge が指定されたとき、%hoge_INCLUDE% がデフォルトインクルードパスとなる。クロス開発するときはこれを指定しないと面倒なことになる。

手順3:リンカへのオプション、ディレクティブの確認

wlink のテンプレは自分で書かないとダメかなーと思ったけど、%WATCOM%\binw\wlsystem.lnk にちゃんと書いてあった。よかったよかった。

system begin linux
    option osname='Linux x86'
    libpath %WATCOM%/lib386
    libpath %WATCOM%/lib386/linux
    format elf
    op exportall
    op norelocs
end
system begin linuxmips
    option osname='Linux MIPS'
    libpath %WATCOM%/libmps
    libpath %WATCOM%/libmps/linux
    format elf
    op exportall
    op norelocs
end

op caseexact(マイクロソフトのリンカで言うところの /NOI オプション)がついてないけどいいの? もしかして大文字/小文字の区別がデフォルトになったのかな(そういえば option nocaseexact というがあったな。売り物時代はそんなのなかったはず…)

手順4:コンパイルとかリンクとか

リンカのデフォルトテンプレに "linux" があったので、そのまま使う(-l=linux)。

wcl386 -bt=linux hw.c -l=linux

とりあえずできた
生成バイナリのデフォルト拡張子は .elf になるようです。

手順5:んで実際動くの?

VMware Player で Knoppix を立ち上げて、作ったバイナリを実行してみる(ちなみに、実物のフロッピー経由というアタマの悪い方法で転送)

コンソールに hello, world! が表示されたので、たぶん動いてると思う。


つーことで、linux 上で実行可能なバイナリをコンパイル&リンクすることはひとまず可能でした。まあどの程度に実用的かはわかりませんが(gcc との互換性とか、ランタイムライブラリのライセンスとかいろいろあるし)。