スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

lobjcをx86_64で動かす

libffiのビルド:

$ CC="gcc -arch x86_64" CXX="g++ -arch x86_64" ./configure
$ make

luaのビルド:

$ make CC="gcc -arch x86_64" -j2 macosx
$ sudo install -p -m 0755 lua /usr/local/bin/lua-x86_64

あとはx86_64用のlibffiをうまくリンクしてやればいい。

一見、何事も無く動くようだが、終了時にクラッシュする。

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000030
0x00007fff82ffd99a in _unload_image ()
(gdb) bt
#0  0x00007fff82ffd99a in _unload_image ()
#1  0x00007fff82ff4af8 in unmap_image ()
#2  0x00007fff5fc02b67 in __dyld__ZN4dyld11removeImageEP11ImageLoader ()
#3  0x00007fff5fc02d6f in __dyld__ZN4dyld20garbageCollectImagesEv ()
#4  0x00007fff5fc0ac56 in __dyld_dlclose ()
#5  0x00007fff813e2755 in dlclose ()
#6  0x000000010001d05a in gctm (L=<value temporarily unavailable, due to optimizations>) at loadlib.c:64
#7  0x0000000100007e09 in luaD_precall (L=0x1000cd0e0, func=0x1000c8c8f, nresults=1885445184) at ldo.c:319
#8  0x00000001000081ae in luaD_call (L=0x1000c8c8f, func=0x0, nResults=839904) at ldo.c:376
#9  0x0000000100009d9b in GCTM (L=0x7fff70619c40) at lgc.c:467
#10 0x0000000100009df8 in luaC_callGCTM (L=0x1000c8c8f) at lgc.c:479
#11 0x00000001000076f7 in luaD_rawrunprotected (L=0x100803c00, f=0x10000f720 <callallgcTM>, ud=0x0) at ldo.c:116
#12 0x000000010000f7a0 in lua_close (L=<value temporarily unavailable, due to optimizations>) at lstate.c:209
#13 0x0000000100001ad4 in main (argc=<value temporarily unavailable, due to optimizations>, argv=0x0) at lua.c:389

_unload_imageでググると、VLCのMLが引っかかった。同様の症状のようだ。Leopardでの64ビットビルドでの既知の問題で、将来のリリースで修正されるだろうということらしい。Snow Leopardにすれば解決なのだろうか。ちなみにArch Linux x86_64+GNUstepでは落ちない。

PPCもRosetta上で試してみたが、何事も無く動作する。Rosettaだからかな。実機は持ってないので分からん。libffiのビルドは↓

CC="gcc -arch ppc" CXX="g++ -arch ppc" ./configure --host=powerpc-apple-darwin9
make
スポンサーサイト

テーマ : プログラミング | ジャンル : コンピュータ

VirtualBoxにArch Linux (x86_64)を入れる

Official Arch Linux Install Guideが必見。

まずダウンロード。archlinux-2009.08-core-x86_64.isoをダウンロードした。sha1sumもチェック。FTPのやつだと最初から最新版が入るのでそっちの方がいいかもしれない。

VirtualBoxで新規VMを作る。Linux / Arch Linux (64 bit)にした。設定のNetworkで、Adapter 2のHost-only Adapterにする。ダウンロードしたばかりのCDイメージをマウント。

起動。Boot Arch Linux Live CDを選択。rootとしてログオン。

# km

でキーボードを指定。i386/qwerty/jp106.map.gzが良さそうだ。Console Fontはよくわからんのでスキップ。

# /arch/setup

インストール開始。Alt+←→とかAlt+F*でコンソールを切り替えられる。

続きを読む

テーマ : OS | ジャンル : コンピュータ

tag : VirtualBox ArchLinux

lobjcをGNUstepで動かす

一番大きな問題は、ランタイムが違うことだ(NeXT↔GNU)。といっても名前が違うだけなものもけっこうあるので、そういうのは#defineしてやればいい。構造体のフィールドへのアクセサは素直に書けばいい。そうでない関数は、自分で書いてやる必要がある。

というわけで、ランタイムの違いを吸収するヘッダを書く。クラスの追加、メソッドの追加、インスタンス変数の追加は対応する関数が見つからない。後ろ二つはClassのフィールドをいじってやればよさそう。クラスの追加は問題だが、後回しにする。

さて、一応コンパイルが終わって、実行してみるが、謎のエラーが出た。

$ lua -lobjc
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> =objc.classes.NSString
: Uncaught exception NSInvalidArgumentException, reason: NSString(class) does not recognize dataUsingEncoding:allowLossyConversion:
アボートしました

他にも謎な症状がいっぱい出て困ったけど解決したので結論だけ書くと、NeXTのobject_getClassとGNUのobject_get_classの挙動の違いが原因だった。NeXTのはクラスを渡すとメタクラスが返ってくるが、GNUのはそのクラス自身が返ってくる。名前に騙された。

これで一応動くようになった訳だが、まだ問題は残っている。GNUstepにはBridgeSupportに対応するものが無いため、例えば、BOOLを返すメソッドが、true/falseではなく1/0を返す。BridgeSupportのメタデータを自分で生成すればいいのかな。

テーマ : プログラミング | ジャンル : コンピュータ

tag : GNUstep

Arch Linuxの環境構築(見ても参考になりません)

VirtualBoxにArch Linuxを入れて環境構築する。 なんかいろいろ設定とかした気がするが、忘れた。

やはりUbuntuとは違う。Ubuntuを使ってLinuxを使った気になっていたのでは甘い。

  • ユーザーは自分で追加
  • sudoも自分で入れる

SSHを入れて、Macのターミナルからアクセスできるようにした。
MacFUSEのSSHFSを使えば、ターミナルだけじゃなくて、FinderからArchのファイルにアクセスできる。他にも、Xcode等の使い慣れたエディタでファイルを編集できる。
また、ssh -Xでアクセスすれば、MacのX11.appにウィンドウを表示できる。フォントが入ってなくて文字が豆腐になってしまったが。
なかなか便利。

これからlobjcをGNUstepで動くようにする(予定)。

tag : VirtualBox ArchLinux

LuaのプログラムでUnicodeの識別子・演算子を使う (Yueliang+ICU4Lua使用)

Yueliangという、LuaによるLuaのコンパイラの実装がある。この字句解析の部分でICU4Luaを使えば、Unicode識別子に容易に対応出来るのではないか。というわけでやってみた。つーかこれをやるためにICU4Luaを入れた。

やったこと

  • ファイルの先頭でlocal string=require "icu.utf8"
  • #strstring.len(str)に置き換える
  • string.findで使っているパターンを少し書き換え(e.g. "%a"→"%!a")

こんなコードが書けるようになった:

-- test.lua
あいうえお = "かきくけこ"
print(あいうえお)
math.π = math.pi
local α,β = math.π+1,math.π-1
print(α×β)
 -- ←全角空白
if あいうえお≠"ほげほげ" then
  print(あいうえお)
end
if math.π≥3 then
 print("π≥3")
end
if math.π≤3 then
 print("π≤3")
end

Metaluaで同じことをすればUnicodeの演算子を活かせると思う。

以下Yueliangへのパッチ。

続きを読む

テーマ : プログラミング | ジャンル : コンピュータ

プロフィール

minoki

Author:minoki
好きなプログラミング言語:
Haskell,Lua
GitHubアカウント
Twitter

最新記事
月別アーカイブ
カテゴリ
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。