エロゲとブログと

大変どうでもよろしいが、世の中における行動力とかそういうのには、多分、二種類あって、

  • ポジティブな気分をベースとする行動力
  • ネガティブな気分をベースとする行動力

多分、僕はおもいっきり後者なんだと思う。
んで、まあ、なんだ。エロゲとかやってると、ネガティブな気分が適度に無くなってしまってよくないよなー、とか、そういう考えが。


あと、同じことはブログにも言えて、ネタの小出しによって失われるネガティブ気分の被害は結構大きいのではないのかと、じゃあ、こんな文章書くのやめろよ。


あー、そう、だから、キモいパワーを想像力へと変換することこそがオタとして素晴らしく生きていくために必要な作業であって。そのためには、キモいパワーを溜める必要があって、そんで、それを溜めるために、エロゲで発散とかブログで小出しにしたらよくない。

漫画はいいのか?問題無いように感じるのだけど、漫画は30分くらいで終わるので、発散量が少ないからだろう。多分。

技術文書とキモい文書

あー、そう、キャラが喋ったり対話したりしながら進んでいくような感じの技術文書の問題点は、何よりも、わかりにくいことだよなー。
やろうとしてることは素晴らしいとは思うのだけど、どっちにしても中途半端なので、技術文書としても駄目だし、キモい文書としても、よろしくないし。
つまり、混ぜるな危険という話で、そう考えれば普通の話か。

とりあえず、なんか、ぱっと思い付いたところ
http://www.kab-studio.biz/Programing/PragmaTwice/index.html
http://www6.airnet.ne.jp/manyo/xml/index.html
こういうのは、大体書いてる人が飽きてやめるのが通例だと思うのだけど、pragma twiceのほうはヤバいぜ!!C,STL,MFC,W32API,浮動小数点からトランジスタまで!
あと、この人がid:AjaxErogeの人だと今知った!この人には一生勝てない!!

どうも、えいだです!!VBプログラマに見下されるらしいです!!
参考: http://sevendegrees.blogspot.com/2006/08/blog-post_04.html


文書がわかりにくくなろうとならなかろうと、そういった、まあ、アレのナニであるよーつまり、世間の意見に惑わされてるようでは一流じゃねーとかそういった感じー。
あと、約170歳は約190歳の間違いであったので、お詫びして訂正しまる。


昨日のあらすじは、「Adaを勉強する前にPPCMach-Oを勉強する必要があるですよ」っていう話。
というわけで、今日のえいだはMach-Oについて調べるのですもはやAda関係ぬー!!あだーー!!OSX界の西田亙に俺はなる!それは無理ですー!!


とみせかけて、調べなくても全部書いてあるのだったー!!あとは各自読むるとよいです。
http://developer.apple.com/documentation/DeveloperTools/Conceptual/MachOTopics/Articles/dynamic_code.html

#include <stdio.h>
int main() {
  puts("a");
}

まず、こんなコードがあるとしまして、(とぅーどぅー:こういうのをAdaでさらっと書けるように)これをふとぅーにコンパイルすると

/Users/Ada/test/gcc$ gcc-4.1 main.c -O2 -S 
/Users/Ada/test/gcc$ cat main.s
	.machine ppc
	.cstring
	.align 2
LC0:
	.ascii "a?0"
	.text
	.align 2
	.globl _main
_main:
	mflr r0
	bcl 20,31,"L00000000001$pb"
"L00000000001$pb":
	stw r31,-4(r1)
	mflr r31
	mtlr r0
	addis r3,r31,ha16(LC0-"L00000000001$pb")
	lwz r31,-4(r1)
	la r3,lo16(LC0-"L00000000001$pb")(r3)
	b L_puts$stub
	.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
	.align 5
L_puts$stub:
	.indirect_symbol _puts
	mflr r0
	bcl 20,31,"L00000000001$spb"
"L00000000001$spb":
	mflr r11
	addis r11,r11,ha16(L_puts$lazy_ptr-"L00000000001$spb")
	mtlr r0
	lwzu r12,lo16(L_puts$lazy_ptr-"L00000000001$spb")(r11)
	mtctr r12
	bctr
	.lazy_symbol_pointer
L_puts$lazy_ptr:
	.indirect_symbol _puts
	.long	dyld_stub_binding_helper
	.subsections_via_symbols

あっというまにこんなコードになります!すごい!全然読めぬ!嘘です。ちょっとだけ読めるようになりました。mflr と mtlr がリンクレジスタごにょごにょだってわかればよゆーです。


まず、これはややこすぅいーです!ダイナミックリンクしたコードを呼ぶように、Indirect function callしてるのと、自身のコードをPIC(Positioin Independent Code)にするためのコードが混ざってるからです!!

まず、基本的な知識として、

  • 共有ライブラリは、PICにして、呼ぶときは、Indirect function callするとよろしい
  • PICにしたりIndirect function callしたりするのはコストがかかるので、ただのアプリケーションプログラムはそういうことしないほうがよい

というのがあるまする。これらについては、ELFのPLTとか、GOTとか、PEのidataとか、そういうあたりを調べれば出てくると思わるる。ので、各自調べて。


さて、ここで、驚くべき事実が明らかに!!OSXgccはふとぅーに使うと、PICのコードを生成するんです!!なぜだぁーーー!
よーするに、無駄があるんです!無駄がーー!PICにしなくてよいです!なんか話がずれてきたーーー!


PICにしないほうほうは-mdynamic-no-picとかそんなの。

/Users/Ada/test/gcc$ gcc-4.1 main.c -O2 -S -mdynamic-no-pic
/Users/Ada/test/gcc$ cat main.s
	.machine ppc
	.cstring
	.align 2
LC0:
	.ascii "a?0"
	.text
	.align 2
	.globl _main
_main:
	lis r3,ha16(LC0)
	la r3,lo16(LC0)(r3)
	b L_puts$stub
	.section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16
	.align 4
L_puts$stub:
	.indirect_symbol _puts
	lis r11,ha16(L_puts$lazy_ptr)
	lwzu r12,lo16(L_puts$lazy_ptr)(r11)
	mtctr r12
	bctr
	.lazy_symbol_pointer
L_puts$lazy_ptr:
	.indirect_symbol _puts
	.long	dyld_stub_binding_helper
	.subsections_via_symbols

だいぶすっきりな感じでございまー。
おるるー昨日問題になってたpure_instructionsとかは
http://developer.apple.com/documentation/DeveloperTools/Conceptual/MachORuntime/index.html
ここを読めばわかるかもー。ただのセクションのフラグだー。(説明を省きすぎだー)S_ATTR_PURE_INSTRUCTIONSとかいうの。


さてさて、話がずれまくったので戻しますよ。
まず、共有ライブラリ…と思ったけど、なんか面倒になったのでいいやー。大体わかったし。


まとめ:
アプリケーションをコンパイルするときは -mdynamic-no-pic を付けましょう
参考: http://www.unsanity.org/archives/000044.php

明日はPPC…といきたいところだけど、諸事情で無理なのでAdaやるぜーAdaー