12月
29
2008
0

Mac Giving Tree

まだ間に合うクリスマスプレゼントがありました

超格安のソフト詰め合わせMacHeist Bundle(チャリティです)などで有名なMacHeistから,タダで有料ソフトを入手できます

  • 1Password(超便利なパスワード管理ソフト)
  • Synergy(ネットワークKVMじゃなくてiTunesコントロールの方)
  • Headline(RSSリーダー)
  • Enigmo 2 (有名なパズルゲームだそうです)
  • iConquer(世界征服ゲーム?)

ほかにも人を紹介するともらえるアプリもあるので,もし紹介されてやってもいいって人はコメントでご連絡ください
(投稿されたコメントは非公開です)

前から欲しかったけど買ってなかった1Passwordが手に入りました

28日の段階ではまだ間に合いましたが,急いだ方がいいでしょう

Written by p0n in: PC | タグ:
12月
20
2008
0

不明なエラーが発生しました(1600)

PwnageToolで作成したカスタムイメージを使って復元しようとすると,時々発生する「不明なエラー1600」

自分もiPhone OS 2.1, 2.2の両方で発生

~/Library/iTunes/Device Support内のファイルを削除すればよいという情報もあるが,自分の場合それではうまくいかなかった

PwnageToolの指示を無視してDFUモードではなく,普通のリカバリモードで復元するとうまくいった

他の環境でもうまくいくのかは不明

情報求ム

Written by p0n in: ガジェット | タグ:
12月
13
2008
0

DarwinはデフォルトでPosition Independentらしい

まだまだMac初心者やなぁと思わされたコト

今までLeopardの共有ライブラリをビルドするには,

$ cc -c -fPIC -fno-common -Wall -o hoge.o hoge.c
$ cc -dynamiclib -o hoge.dylib hoge.o

とかやって,-fPICを指定してコンパイルしていたのですが,なんとDarwinは標準でPosition Independentでしたw

 

そもそも気づいたきっかけは,Libtool

そろそろ更新も安定してきたのでAutotools対応にしようとしたところ・・・Libtoolの吐くコードに-fPICがない・・・?

Libtoolを使うと,.loファイルにPICと非PICオブジェクトの場所が書いてあります
場所をチェックして,両方のMD5チェックサムを調べたところ・・・なんと同じ!?

不思議なので逆アセンブルしてみたところ,たしかにPICっポイ
でも,オプション指定してないのになんで???

っと思ってたらFinkのサイトにこんな記述が・・・

位置独立コード (PIC: Position Independent Code) の生成は Darwin ではデフォルトです.実際, PowerPC コードは設計上 position-independent となり,パフォーマンスや空間上の損失はありません.このため,共有ライブラリやモジュールへコードをコンパイルする際も,PIC を指定する必要はありません.

ABIによってPICと非PICの区別がないシステムもあるけど,Darwinもそうなのか?
それとも,デフォルトがPICなだけで区別はあるのか?
デフォルトでPICということは,実行可能コードはPIE?

ということで,おなじみHello, Worldで試したみた

使ったコードは以下の通り

#include <stdio.h>
int main(int argc, const char* argv[])
{
        printf("hoge\n");
        return 0;
}

いろいろビルドオプションを変えてみた

$ cc -Wall -o hoge hoge.c
$ md5 hoge
MD5 (hoge) = e440d2da97997f3d6242426c7af2697d

$ cc -Wall -fPIE -o hoge hoge.c
$ md5 hoge
MD5 (hoge) = e440d2da97997f3d6242426c7af2697d

$ cc -Wall -fno-pie -o hoge hoge.c
$ md5 hoge
MD5 (hoge) = e440d2da97997f3d6242426c7af2697d

$ cc -Wall -fno-pic -o hoge hoge.c
$ md5 hoge
MD5 (hoge) = 3a8543d19ef046c85ada6bc71c144ef2

どうやら非PICなコードも吐ける模様なので,両方とも逆アセンブルして比較してみる

まず,PICなコードのtextセクション後半
1fd91fde(=次の命令)にジャンプするcall命令は一見無意味そうだが,次の1fdeでスタックからeipの値を取得するためにある
1fdf1fe5スタックの先頭0x1a+ebx(=0x1fde) = 0x1ffd(=main関数の終端アドレス)が入る
その結果,次の1fe8call命令は,0x1ffdをリターンアドレスとしてスタックにプッシュしてprintfを呼び戻ってくるのでPIC

    ・・・
    1fd9:    e8 00 00 00 00     call  1fde <LC_SEGMENT.__TEXT+0xfde>
    1fde:    5b                 pop  %ebx
    1fdf:    8d 83 1a 00 00 00  lea  0x1a(%ebx),%eax
    1fe5:    89 04 24           mov  %eax,(%esp)
    1fe8:    e8 18 10 00 00     call  3005 <dyld__mach_header+0xff5>
    1fed:    b8 00 00 00 00     mov  $0x0,%eax
    1ff2:    83 c4 14           add  $0x14,%esp
    1ff5:    5b                 pop  %ebx
    1ff6:    c9                 leave
    1ff7:    c3                 ret
    1ff8:    68 6f 67 65 00     push  $0x65676f
    1ffd:    00 00              add  %al,(%eax)

次は,非PICなコードのtextセクション後半
こちらは,1fe8でスタックの先頭に,main関数の終端アドレスである1ffbを直接指定しているのでPICではない

    ・・・
    1fd4:    e8 00 00 00 00         call  1fd9 <LC_SEGMENT.__TEXT+0xfd9>
    1fd9:    58                     pop  %eax
    1fda:    8b 80 3f 00 00 00      mov  0x3f(%eax),%eax
    1fe0:    ff e0                  jmp  *%eax
    1fe2:    55                     push  %ebp
    1fe3:    89 e5                  mov  %esp,%ebp
    1fe5:    83 ec 18               sub  $0x18,%esp
    1fe8:    c7 04 24 fb 1f 00 00 	movl  $0x1ffb,(%esp)
    1fef:    e8 11 10 00 00         call 3005 <dyld__mach_header+0xff5>
    1ff4:    b8 00 00 00 00         mov  $0x0,%eax
    1ff9:    c9                     leave
    1ffa:    c3                     ret
    1ffb:    68 6f 67 65 00         push  $0x65676f

ということで,DarwinではやっぱりPICでないコードも吐けるが,標準はPICなコードを吐くようになっている

セキュリティ的にもPIEは大歓迎!!
Macやるなぁ・・・

Written by p0n in: PC | タグ: ,
12月
11
2008
0

Sun SPOT Manager Toolでハマる

Sun SPOT Manager Toolは,ワンクリックでSun SPOTの開発環境を構築してくれる非常にありがたいツールなのですが・・・
便利さ故に見事にハマったのでメモ

問題は,LeopardでAppleのJava for Mac OS X 10.5 Update 2でJava SE 6 (64bit) を使用している場合に起こります

Manager ToolはSDKやDemo,NetBeans用のプラグインなどに加えて,SquawkというVMをインストールしてくれるのですが,VMなので一部アーキテクチャに依存する部分があって,同じLeopardでもIntelとPPCで違ってきます

Intel MacでJava SE 6を使っているとPPCと認識されるようで,PPC版のSquawkが入ってしまいます

SDKやツールのほとんどがJavaで書かれているので最初気づきませんでしたが,Sun SPOTのエミュレータを使おうとしたときに,"Java for ppc cannot run in this configuration." というエラーが発生します

fileコマンドを実行すると,Mach-O executable ppcとかいわれてビックリ!!

Squawkを入れ替えようとして,ソースを落としてきてビルドしようとしたのですが,SquawkのビルドもJava SE 6では通らず,J2SE 5.0でビルドする必要がありました

ビルドして,プロパティを書き換えて一応入れ替えてみたものの,エンディアンが違うと怒られるし,JNIのライブラリがあるので結局あきらめて再インストールすることに・・・

ただ,SDKだけを入れ直せばよくてツールもよくできているので簡単です

手順は以下の通り

  1. J2SE 5.0に切り替えます
  2. FinderとかでSDKを入れたフォルダをリネーム
  3. SPOT ManagerのSDKsタブを開いてRefreshしてリネームを反映
  4. 右側のAvailable SDKsからほしいバージョンを選んでインストール

今度は,バッチリMach-O executable i386です

ちなみにインストール後は,Java SE 6に戻しても大丈夫でした

今日ちょうどSunの方とお会いできたのですが,なんでも前にもPPCと勘違いするエラーはあって修正されたそうです
まぁUpdate 2が出たのは最近だし,Sun配布ではないので仕方ないですが,対応してほしいですね

ちなみにJNIの話ですが,PPCのバイナリでもRosettaで動くんやないかと思ってましたが・・・
RosettaはPowerPCコードとx86コードの混在したプロセスは処理できないのでダメです

Appleのサイトにズバリ書いてありました

PowerPCベースのMacintoshコンピュータ用にビルドされたJNIライブラリは、Java仮想マシンがRosettaなしですでに起動しているため、Rosettaのもとでロードされません。Javaアプリケーションは、インテルベースのMacではPowerPCのみのバイナリをロードしようとすると失敗します。

Written by p0n in: PC | タグ: , ,

TheBuckmaker WordPress Themes Webhosting, MP3, AAC & Co