<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tipset &#187; Autotools</title>
	<atom:link href="http://hasumi.info/~h2/tag/autotools/feed/" rel="self" type="application/rss+xml" />
	<link>http://hasumi.info/~h2</link>
	<description>MacやiPhone/iPod Touch関連のTipsを書くハズが発散してるページ</description>
	<lastBuildDate>Thu, 04 Mar 2010 16:52:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>DarwinはデフォルトでPosition Independentらしい</title>
		<link>http://hasumi.info/~h2/2008/12/13/darwin%e3%81%af%e3%83%87%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%81%a7position-independent/</link>
		<comments>http://hasumi.info/~h2/2008/12/13/darwin%e3%81%af%e3%83%87%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%81%a7position-independent/#comments</comments>
		<pubDate>Sat, 13 Dec 2008 01:31:46 +0000</pubDate>
		<dc:creator>h2</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[Autotools]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://hasumi.info/~h2/?p=565</guid>
		<description><![CDATA[まだまだMac初心者やなぁと思わされたコト
今までLeopardの共有ライブラリをビルドするには，

$ cc -c -fPIC -fno-common -Wall -o hoge.o hoge.c
$ cc -dyna [...]]]></description>
			<content:encoded><![CDATA[<p>まだまだMac初心者やなぁと思わされたコト</p>
<p>今までLeopardの共有ライブラリをビルドするには，</p>
<pre class="brush: text;">
$ cc -c -fPIC -fno-common -Wall -o hoge.o hoge.c
$ cc -dynamiclib -o hoge.dylib hoge.o
</pre>
<p>とかやって，<code>-fPIC</code>を指定してコンパイルしていたのですが，なんとDarwinは標準でPosition Independentでしたｗ</p>
<p>&nbsp;</p>
<p>そもそも気づいたきっかけは，Libtool</p>
<p>そろそろ更新も安定してきたのでAutotools対応にしようとしたところ・・・Libtoolの吐くコードに<code>-fPIC</code>がない・・・？</p>
<p>Libtoolを使うと，.loファイルにPICと非PICオブジェクトの場所が書いてあります<br />
場所をチェックして，両方のMD5チェックサムを調べたところ・・・なんと同じ！？</p>
<p>不思議なので逆アセンブルしてみたところ，たしかにPICっポイ<br />
でも，オプション指定してないのになんで？？？</p>
<p>っと思ってたら<a title="Fink" href="http://www.finkproject.org/doc/porting/porting.ja.html">Finkのサイト</a>にこんな記述が・・・</p>
<blockquote><p>位置独立コード (PIC: Position Independent Code) の生成は Darwin ではデフォルトです．実際， PowerPC コードは設計上 position-independent となり，パフォーマンスや空間上の損失はありません．このため，共有ライブラリやモジュールへコードをコンパイルする際も，PIC を指定する必要はありません．</p></blockquote>
<p>ABIによってPICと非PICの区別がないシステムもあるけど，Darwinもそうなのか？<br />
それとも，デフォルトがPICなだけで区別はあるのか？<br />
デフォルトでPICということは，実行可能コードはPIE？</p>
<p>ということで，おなじみHello, Worldで試したみた</p>
<p>使ったコードは以下の通り</p>
<pre class="brush: c;">
#include &amp;lt;stdio.h&amp;gt;
int main(int argc, const char* argv[])
{
        printf(&amp;quot;hoge\n&amp;quot;);
        return 0;
}
</pre>
<p>いろいろビルドオプションを変えてみた</p>
<pre class="brush: text;">
$ 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
</pre>
<p>どうやら非PICなコードも吐ける模様なので，両方とも逆アセンブルして比較してみる</p>
<p>まず，PICなコードのtextセクション後半<br />
<code>1fd9</code>の<code>1fde(=次の命令)</code>にジャンプする<code>call</code>命令は一見無意味そうだが，次の<code>1fde</code>でスタックから<code>eip</code>の値を取得するためにある<br />
<code>1fdf</code>と<code>1fe5</code>で<code>スタックの先頭</code>に<code>0x1a+ebx(=0x1fde) = 0x1ffd(=main関数の終端アドレス)</code>が入る<br />
その結果，次の<code>1fe8</code>の<code>call</code>命令は，<code>0x1ffd</code>をリターンアドレスとしてスタックにプッシュして<code>printf</code>を呼び戻ってくるのでPIC</p>
<pre class="brush: text;">
    ・・・
    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)
</pre>
<p>次は，非PICなコードのtextセクション後半<br />
こちらは，<code>1fe8</code>でスタックの先頭に，main関数の終端アドレスである<code>1ffb</code>を直接指定しているのでPICではない</p>
<pre class="brush: text;">
    ・・・
    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
</pre>
<p>ということで，DarwinではやっぱりPICでないコードも吐けるが，標準はPICなコードを吐くようになっている</p>
<p>セキュリティ的にもPIEは大歓迎！！<br />
Macやるなぁ・・・</p>
]]></content:encoded>
			<wfw:commentRss>http://hasumi.info/~h2/2008/12/13/darwin%e3%81%af%e3%83%87%e3%83%95%e3%82%a9%e3%83%ab%e3%83%88%e3%81%a7position-independent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
