<?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>Hamko&#039;s Blog &#187; DebugTools</title>
	<atom:link href="https://home.wakatabe.com/ryo/blog/?cat=21&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://home.wakatabe.com/ryo/blog</link>
	<description>This is an Intellect Hamster.</description>
	<lastBuildDate>Wed, 16 Apr 2014 07:45:37 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>BINARY HACKS #23-#29</title>
		<link>https://home.wakatabe.com/ryo/blog/?p=232</link>
		<comments>https://home.wakatabe.com/ryo/blog/?p=232#comments</comments>
		<pubDate>Thu, 29 Aug 2013 04:36:44 +0000</pubDate>
		<dc:creator>Hamko</dc:creator>
				<category><![CDATA[DebugTools]]></category>

		<guid isPermaLink="false">http://home.wakatabe.com/ryo/blog/?p=232</guid>
		<description><![CDATA[registerの参照 以下のようにすることで、stack_pointerとframe_pointer registerを参照できる。 なんでespとebpなのだろう？ インラインアセンブラ 出力オペランド指定では、以下のような制約の表記をする。=は &#8220;=&#038;S&#8221; (d0) 出力オペランドで指定した変数は、アセンブラテンプレートで順に%0, %1などと参照可能。 また、制約は&#8221;0&#8243;などと表記できる。 入力オペランド指定では、 &#8220;0&#8243; (src) などとする。これは変数srcに&#8221;0&#8243;という制約を付ける。&#8221;0&#8243;は%esiレジスタに割り当てられているので、srcを%esiレジスタに設定するようになっている。 やっていることとしては、 操作によって変わってしまうもの、および__volatile__はC言語の最適化回避。 ビルトイン関数 例えば、strlenに文字列リテラルを渡すと、最適化の段階でstrlenを呼ばずに即値に変換してくれる。 このような機能は数学関連、文字列関連の関数でしばしば実装されている。 先頭の0bitを数える__builtin_clz(unsigned int x)などがハッカーに好んで使われると言われているが、何に使うのか皆目わからない。 なお、gccでは以下の1行目は文字列リテラルと同値に扱われない。2行目のようにしなければならない。 glibcを使わないプログラミング libcが大量にリンクされているために、プログラムのコード単純なHello Worldでも5kbを越える。この無駄を排除したい。 これを解決するために、システムコールのみを使うことが解決策としてあげられる。 しかし、C言語のwrite関数などは、アーキテクチャ依存性を排除するための単なるglibcの関数である。 つまり、アーキテクチャに特化したシステムコールを探してこなければならない。 そこで、_syscallNを探しだし、exit, write関数となるべきマクロをコピペする。すると、マクロによって関数を定義することができて、writeコマンドをCPUの命令で実行できる。 これを TLSの利用 スレッド固有の変数を簡便に利用するためのシステムを使う方法。 TLSはthread local storageといい、グローバル変数に__threadキーワードをつけることで実現できる。 まともな使い道としては、errnoの保持などに利用できる。 pthread_key &#8230; <a href="https://home.wakatabe.com/ryo/blog/?p=232">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>registerの参照<br />
以下のようにすることで、stack_pointerとframe_pointer registerを参照できる。</p>
<pre class="brush: cpp; title: ; notranslate">
 register void* stack_pointer asm (&quot;%esp&quot;);
 register void* frame_pointer asm (&quot;%ebp&quot;);
</pre>
<p>なんでespとebpなのだろう？</p>
<p>インラインアセンブラ</p>
<pre class="brush: cpp; title: ; notranslate">
 __asm__ (&quot;アセンブラテンプレート&quot;:出力オペランド指定:入力オペランド指定:この操作によって変わってしまうもの);
 __asm__ __volatile__ (&quot;アセンブラテンプレート&quot;:出力オペランド指定:入力オペランド指定:この操作によって変わってしまうもの);
</pre>
<p>出力オペランド指定では、以下のような制約の表記をする。=は<br />
 &#8220;=&#038;S&#8221; (d0)<br />
出力オペランドで指定した変数は、アセンブラテンプレートで順に%0, %1などと参照可能。<br />
また、制約は&#8221;0&#8243;などと表記できる。<br />
入力オペランド指定では、<br />
 &#8220;0&#8243; (src)<br />
などとする。これは変数srcに&#8221;0&#8243;という制約を付ける。&#8221;0&#8243;は%esiレジスタに割り当てられているので、srcを%esiレジスタに設定するようになっている。<br />
やっていることとしては、</p>
<pre class="brush: plain; title: ; notranslate">
入力オペランドで、C言語の入力される変数をレジスタに割り当て
アセンブラテンプレートを処理する
出力オペランドで、レジスタの値を出力の変数に代入する
</pre>
<p>操作によって変わってしまうもの、および__volatile__はC言語の最適化回避。</p>
<p>ビルトイン関数<br />
例えば、strlenに文字列リテラルを渡すと、最適化の段階でstrlenを呼ばずに即値に変換してくれる。<br />
このような機能は数学関連、文字列関連の関数でしばしば実装されている。<br />
先頭の0bitを数える__builtin_clz(unsigned int x)などがハッカーに好んで使われると言われているが、何に使うのか皆目わからない。<br />
なお、gccでは以下の1行目は文字列リテラルと同値に扱われない。2行目のようにしなければならない。</p>
<pre class="brush: cpp; title: ; notranslate">
const char* str = &quot;hoge&quot;;
const char* const str = &quot;hoge&quot;;
</pre>
<p>glibcを使わないプログラミング<br />
libcが大量にリンクされているために、プログラムのコード単純なHello Worldでも5kbを越える。この無駄を排除したい。<br />
これを解決するために、システムコールのみを使うことが解決策としてあげられる。<br />
しかし、C言語のwrite関数などは、アーキテクチャ依存性を排除するための単なるglibcの関数である。<br />
つまり、アーキテクチャに特化したシステムコールを探してこなければならない。<br />
そこで、_syscallNを探しだし、exit, write関数となるべきマクロをコピペする。すると、マクロによって関数を定義することができて、writeコマンドをCPUの命令で実行できる。<br />
これを</p>
<pre class="brush: bash; title: ; notranslate">
 gcc -Os -fno-builtin -fomit-frame-pointer -no-ident -c hello.c
 strip -s hello
 strip -R .data hello #dataセクションはreadelf -S曰く、0バイトだからいらない
</pre>
<p>TLSの利用<br />
スレッド固有の変数を簡便に利用するためのシステムを使う方法。<br />
TLSはthread local storageといい、グローバル変数に__threadキーワードをつけることで実現できる。<br />
まともな使い道としては、errnoの保持などに利用できる。</p>
<p>pthread_key<br />
TLSはポータブルではなく、gccに特有の機能である。<br />
ポータブルに実装するならば、以下のようにpthreadの機能を用いる。</p>
<pre class="brush: cpp; title: ; notranslate">
 pthread_key_t key; 
 pthread_key_create(&amp;key, destructor);

 void* value;
 pthread_thread_setspecific(key, value);
 value = pthread_thread_setspecific(key);

 pthread_key_delete(key);
</pre>
<p>#27を一回飛ばします。</p>
<p>weekを用いて、リンクされているライブラリによって挙動を変化させる<br />
weekはリンク時にundefinedであればそれを0に設定する、というキーワードである。<br />
つまり、例えばlibmがあるかどうかを判別するためのプログラムを以下のように実装することができる。</p>
<pre class="brush: cpp; title: ; notranslate">
extern double sqrt(double x) __attribute__ ((week));

void foo {
    if (sqrt) 
        cout &lt;&lt; &quot;found&quot; &lt;&lt; endl;
    else 
        cout &lt;&lt; &quot;not found&quot; &lt;&lt; endl;
}
</pre>
<p>バージョンスクリプトでライブラリ外に出るシンボルを限定する<br />
別のファイルにあるfooとbarが存在し、fooがbarに依存するが、barはライブラリの外部に漏らしたくない、という状況を考える。<br />
この時、以下のバージョンスクリプトlibfoo.mapと、動的ライブラリ作成のためのリンクで-Wl,&#8211;version-script,libfoo.mapオプションをつけることで、外部に公開するシンボルを限定できる。</p>
<pre class="brush: cpp; title: ; notranslate">
{
    global: foo;
    local: *;
};
</pre>
<p>C++の場合は、デマングルするためにextern &#8220;C++&#8221;が必要であることと、デマングルしたときに引数の違いによって関数名の後に後続する文字列があるので、以下のようにする。</p>
<pre class="brush: cpp; title: ; notranslate">
{
    global:
        extern &quot;C++&quot; {
            foo::hoge*;
        };
    local *;
};
</pre>
<p>gcc拡張のvisualityを用いて関数の公開性を制御する<br />
上のversion scriptによる方法は単に隠しているだけなので、PICでコンパイルするとhiddenな関数もPLTを通り、低速である。<br />
gccでは__attribute__ ((visuality(&#8220;default&#8221;)))を用いることで、より簡便かつ高速な公開非公開の制御ができる。</p>
<pre class="brush: cpp; title: ; notranslate">
 #define EXPORT __attribute__ ((visuality(&quot;default&quot;)))
</pre>
<p>このオプションをつけて、さらにコンパイル時に、以下をつけることで、defaultと明示的に指定していないシンボルが全てhiddenになる。</p>
<pre class="brush: bash; title: ; notranslate">
-fvisuality=hidden
</pre>
<p>（attributeはクラスの後、型名の前に付ける）</p>
]]></content:encoded>
			<wfw:commentRss>https://home.wakatabe.com/ryo/blog/?feed=rss2&#038;p=232</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BINARY HACKS #20-#22</title>
		<link>https://home.wakatabe.com/ryo/blog/?p=203</link>
		<comments>https://home.wakatabe.com/ryo/blog/?p=203#comments</comments>
		<pubDate>Tue, 27 Aug 2013 03:07:37 +0000</pubDate>
		<dc:creator>Hamko</dc:creator>
				<category><![CDATA[DebugTools]]></category>

		<guid isPermaLink="false">http://home.wakatabe.com/ryo/blog/?p=203</guid>
		<description><![CDATA[PICを付ける意味 PICは.rel.dynamicを.textに押し付けるオプションである。 PICをつけなくとも、共有ライブラリを正常に動かすことは可能である。しかし、速度面からPICを付ける必要がある。 PICをつけ{ずに, て}コンパイルしたファイルのELFを見る。TEXTRELはテキストの再配置が必要であること、RELCOUNTは再配置の数を表す。 readelf -d fpic-no-pic.so &#124; egrep &#8216;TEXTREL&#124;RELCOUNT&#8217; readelf -d fpic-pic.so &#124; egrep &#8216;TEXTREL&#124;RELCOUNT&#8217; とすると、下ではTEXTRELが見つかり、RELCOUNTが多い。 （テキストの再配置って何？RELCOUNTって何？.rel.dynamicって何？） statifier 動的リンクが必要な実行ファイルを、必要のない実行ファイルに変換する。 statifiere /usr/bin/php php2 実行してみないと動的リンク先が決められないライブラリを利用している場合は、&#8211;set=LD_PRELOAD=&#8221;a.so b.so&#8221;などとする。 これが必要な状況は、/lib/libnss*.soと、/usr/lib/gconv/*.soである。 gccのGNU拡張 (1) ビルトイン関数 文字列リテラルを出力するだけのprintfはputsに置き換えられるなど。 LD_PRELOADのオーバライドで問題が起きることがあるので、これの状況を知るための関数が用意されている。 (2) アトリビュート 関数やデータの性質を記述し、特別な意味を付加したり、呼び出しの最適化を期待する。 宣言時に int foo(void) __attribute__((つけたいアトリビュート)); などとする。 &#8230; <a href="https://home.wakatabe.com/ryo/blog/?p=203">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>PICを付ける意味<br />
PICは.rel.dynamicを.textに押し付けるオプションである。<br />
PICをつけなくとも、共有ライブラリを正常に動かすことは可能である。しかし、速度面からPICを付ける必要がある。<br />
PICをつけ{ずに, て}コンパイルしたファイルのELFを見る。TEXTRELはテキストの再配置が必要であること、RELCOUNTは再配置の数を表す。<br />
 readelf -d fpic-no-pic.so | egrep &#8216;TEXTREL|RELCOUNT&#8217;<br />
 readelf -d fpic-pic.so | egrep &#8216;TEXTREL|RELCOUNT&#8217;<br />
とすると、下ではTEXTRELが見つかり、RELCOUNTが多い。<br />
（テキストの再配置って何？RELCOUNTって何？.rel.dynamicって何？）</p>
<p>statifier<br />
動的リンクが必要な実行ファイルを、必要のない実行ファイルに変換する。<br />
 statifiere /usr/bin/php php2<br />
実行してみないと動的リンク先が決められないライブラリを利用している場合は、&#8211;set=LD_PRELOAD=&#8221;a.so b.so&#8221;などとする。<br />
これが必要な状況は、/lib/libnss*.soと、/usr/lib/gconv/*.soである。</p>
<p>gccのGNU拡張<br />
(1) ビルトイン関数<br />
文字列リテラルを出力するだけのprintfはputsに置き換えられるなど。<br />
LD_PRELOADのオーバライドで問題が起きることがあるので、これの状況を知るための関数が用意されている。<br />
(2) アトリビュート<br />
関数やデータの性質を記述し、特別な意味を付加したり、呼び出しの最適化を期待する。<br />
宣言時に<br />
 int foo(void) __attribute__((つけたいアトリビュート));<br />
などとする。<br />
(3) ラベルの参照<br />
ラベルを&#038;&#038;をつけることで、関数ポインタとして扱うことが出来る。なお、関数ポインタなので減算加算が可能である。<br />
 void *label = &&error;<br />
 goto *label;<br />
 error:<br />
     &#8230;<br />
(これは実際に使ってみないと、何が使えるのかよくわからなそう)</p>
]]></content:encoded>
			<wfw:commentRss>https://home.wakatabe.com/ryo/blog/?feed=rss2&#038;p=203</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BINARY HACKS #14-#19</title>
		<link>https://home.wakatabe.com/ryo/blog/?p=177</link>
		<comments>https://home.wakatabe.com/ryo/blog/?p=177#comments</comments>
		<pubDate>Mon, 26 Aug 2013 02:05:07 +0000</pubDate>
		<dc:creator>Hamko</dc:creator>
				<category><![CDATA[DebugTools]]></category>

		<guid isPermaLink="false">http://home.wakatabe.com/ryo/blog/?p=177</guid>
		<description><![CDATA[c++filtについて nm cpp.o とすると、cppの名前マングリングによって、_Z3fooiのような読みづらいシンボルが得られる。 これは、 nm cpp.o &#124; c++filt nm &#8211;demangle cpp.o によって解決できる。 addr2line(needs -g) ポインタからソースコードの行を特定するためのコマンド。 addr2line -e ./a.out 0&#215;8048764 -fオプションをつけることで、関数名もわかるようになる。 addr2line -e ./a.out 0&#215;8048764 strip ユーザのプログラムをstripして、開発者のところにしていないバイナリを残すと、コアファイルをコピーすることで開発環境でデバッグ可能。 strip ./a.out -dオプションは、だいたい-gによる部分だけを削除する。すると、完全にデバッグできなくなる状況を避けられる。 strip -d ./a.out .o, .aをstripするとシンボルが全部消えてしまう。 ar 作成(r: 新規挿入既存置換、c: 警告抑止, u: &#8230; <a href="https://home.wakatabe.com/ryo/blog/?p=177">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>c++filtについて<br />
 nm cpp.o<br />
とすると、cppの名前マングリングによって、_Z3fooiのような読みづらいシンボルが得られる。<br />
これは、<br />
 nm cpp.o | c++filt<br />
 nm &#8211;demangle cpp.o<br />
によって解決できる。</p>
<p>addr2line(needs -g)<br />
ポインタからソースコードの行を特定するためのコマンド。<br />
 addr2line -e ./a.out 0&#215;8048764<br />
-fオプションをつけることで、関数名もわかるようになる。<br />
 addr2line -e ./a.out 0&#215;8048764</p>
<p>strip<br />
ユーザのプログラムをstripして、開発者のところにしていないバイナリを残すと、コアファイルをコピーすることで開発環境でデバッグ可能。<br />
 strip ./a.out<br />
-dオプションは、だいたい-gによる部分だけを削除する。すると、完全にデバッグできなくなる状況を避けられる。<br />
 strip -d ./a.out<br />
.o, .aをstripするとシンボルが全部消えてしまう。</p>
<p>ar<br />
作成(r: 新規挿入既存置換、c: 警告抑止, u: 新規のみ置換, s: ranlib)、閲覧、展開<br />
 ar rcus libhoge.a 1.o 2.o 3.o &#8230;<br />
 ar tv libhoge.a<br />
 ar xv libhoge.a</p>
<p>C++からCを呼び出す<br />
一点のみ注意が必要である。Cのheaderで以下のようにすればよい。<br />
 #ifdef __cplusplus<br />
 extern &#8220;C&#8221; {<br />
     /*Cのコードいっぱい*/<br />
 }<br />
 #endif<br />
extern &#8220;C&#8221;をつけると、C++の名前マングルの対象外となる。C++ではリンクが通れば型のミスはないと思われるが、Cでは間違ったプロトタイプ宣言が可能。extern &#8220;C&#8221;をつけた部分では、型の安全性がCレベルまで低下する。でも、普通に考えたらヘッダファイルが存在するはずなので、CからでもC++からでも使えるプロトタイプ宣言を作っておけば問題ない。<br />
参考: http://hakobe932.hatenablog.com/entry/20090104/1231073299</p>
<p>CからC++を呼び出す<br />
C++コードをg++でコンパイル、Cコードをgccでコンパイル、g++でリンクすることを考える。<br />
4点注意が必要である。(1)(2)は「C++からCを呼び出す」の理由、(3)はCのコードにC++の例外が通るとプログラムが落ちることによる。<br />
(1) C++のheaderをifdef, extern &#8220;C&#8221;でくくる。<br />
 #ifdef __cplusplus<br />
 extern &#8220;C&#8221; {<br />
     /*Cのコードいっぱい*/<br />
 }<br />
 #endif<br />
(2) C++のソースをextern &#8220;C&#8221;でくくる<br />
 extern &#8220;C&#8221; {<br />
 int cpp_func(void) {return 0;}<br />
 }<br />
(3) C++のソースが例外を投げるならば、例えば以下のようにする。<br />
 extern &#8220;C&#8221; {<br />
 int cpp_func(void) try {throw -1;} catch(&#8230;) {return -1}<br />
 }<br />
(4) 関数ポインタを引数に取るCの関数は-fexceptionsでコンパイルしなければならない。このオプションをつけると、全ての関数についてフレーム解放処理を挿入する。<br />
なお、glibcのqsort, bsearchなどは、このオプションをつけてコンパイルされている。</p>
<p>警告の出ない名前衝突&#8211;C言語<br />
gccでたまに経験する、名前衝突しているのに何故か警告も出ずに、実行時に予想していないほうのシンボルが呼ばれるアレ。<br />
これの原因は<br />
(1) 静的ライブラリを作成する時のarコマンドは、ただのアーカイバなので、シンボル名とか見てない。<br />
(2) 動的リンクのSONAMEとNEEDEDの対応付けも、一番初めに見つかった方を利用している。<br />
逆に、回避可能な条件は以下である。<br />
(1) 動的リンクを利用しておらず<br />
(2) .oを全てまとめてリンクして実行ファイルを作成するとき</p>
<p>警告の出ない名前衝突&#8211;C++言語<br />
C++ではもう一つ罠が増える。.oを全てまとめてリンクしていても期待したシンボルが参照されない可能性がある。<br />
原因は、<br />
(3) inlineで定義するweekシンボルがnon-weekシンボルの存在により無視されるから。これは.hの中に定義が入っていたとしたら、それが複数の.cppにincludeされると重複して定義されてしまうため、後で解決してやろうという気持ちによる。<br />
回避方法は、<br />
(3) inlineで定義するシンボルを作らない、もしくは、無名namespaceでリンケージリークを防ぐ。無名namespaceによってmoduleにシンボルを閉じ込めれば、当然モジュール内でしか利用できなくなるが、今回のような大域領域での名前衝突は解決できる。</p>
]]></content:encoded>
			<wfw:commentRss>https://home.wakatabe.com/ryo/blog/?feed=rss2&#038;p=177</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.so not found</title>
		<link>https://home.wakatabe.com/ryo/blog/?p=95</link>
		<comments>https://home.wakatabe.com/ryo/blog/?p=95#comments</comments>
		<pubDate>Thu, 25 Jul 2013 08:42:01 +0000</pubDate>
		<dc:creator>Hamko</dc:creator>
				<category><![CDATA[DebugTools]]></category>

		<guid isPermaLink="false">http://home.wakatabe.com/ryo/blog/?p=95</guid>
		<description><![CDATA[libxx.soが無いよ，と言われた時の対処方法． ldconfig -p &#124; grep libxx どこに繋がっているかを確認 /etc/ld.so.confにディレクトリを追加 sudo ldconfig]]></description>
			<content:encoded><![CDATA[<p>libxx.soが無いよ，と言われた時の対処方法．</p>
<p>ldconfig -p | grep libxx<br />
どこに繋がっているかを確認</p>
<p>/etc/ld.so.confにディレクトリを追加<br />
sudo ldconfig</p>
]]></content:encoded>
			<wfw:commentRss>https://home.wakatabe.com/ryo/blog/?feed=rss2&#038;p=95</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
