タグ

ブックマーク / yupo5656.hatenadiary.org (8)

  • zshで16進→10進変換

    これは便利。bashでも使えます。 % echo $((0x12)) 18 % $((0x12)) zsh: command not found: 18Binary Hacksの校正フェストの際に教えてもらいました。知らなかった〜。さっそく愛用しています。

    zshで16進→10進変換
    mogwaing
    mogwaing 2009/01/31
    これは使える!
  • 関数テンプレートの特殊化について - memologue

    関数テンプレートの特殊化いろいろ なんか日記を書くのを忘れていました。よくない。というわけで、最近おぼえたtipsを書きます。クラステンプレート内のテンプレートの特殊化(もどき)についての自分なりのまとめ。 まず、 namespace A { template<int V> static void YYY() { std::printf("default %d\n", V); } } int main() { YYY<0>(); YYY<128>(); } のような関数テンプレートがあるとき、これを特殊化*1した関数は namespace A { template<int V> static void YYY() { std::printf("default %d\n", V); } template<> static void YYY<128>() { std::printf("for

    関数テンプレートの特殊化について - memologue
    mogwaing
    mogwaing 2008/11/06
    about specialization
  • 50行straceもどき - memologue

    すこし前に、straceコマンドもどきを50行くらいで書いてみたことがあるので、それを貼ってみまーす。いきなりコード。あ、C99です。 // strace_modoki.c: Linux/x86専用です。x86_64カーネルでは-m32でコンパイルしても動きません。 #include <stdio.h> #include <unistd.h> #include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <asm/user.h> #include <asm/ptrace.h> int main() { int i; static const char* syscallstr[1000] = {0}; for(i = 0; i < 1000; ++i) syscallstr[i] = "???";

    50行straceもどき - memologue
    mogwaing
    mogwaing 2007/11/13
    cでstraceもどきを作る
  • ついカッとなって実行バイナリにパッチ - memologue

    とある都合で、ソフトウェア開発の際にソースコードの提供されていないツールを使うことになりました。x86なLinux上で動く、ちょっとしたtoolchainです。が、そのツールの処理速度が遅く、入力サイズに対して、結果が出てくるまでの時間がどうもO(N^2)かそれよりひどい。遅くてイライラするので、昨晩ついカッとなってパッチを当てました。そのメモです。また、ありがちな事態(?)な気もするので、みなさんどうしてるのかなー的なお伺いも兼ねて。 ボトルネックの特定 そのツール(以下A)の実行バイナリはstripされておらず.symtabが残っていました。のでまず、どこが遅いのかgoogle-perftoolsをLD_PRELOADしてそのソフトウェアを実行し、実行プロファイルを取りました。すると、嬉しいことにある一つの関数(以下F)で全体の90%以上の時間を消費していることがわかりました。関数Fは

    ついカッとなって実行バイナリにパッチ - memologue
    mogwaing
    mogwaing 2007/11/13
    実行バイナリのボトルネック関数をラップしてパッチする方法
  • memologue - C++でsynchronized methodを書くのは難しい (1)

    Javaにはsynchronizedという便利なキーワードがあります。このキーワードを使うと、例えば次のように簡単にメソッドを「同期化」することができます。同期化されたメソッドは、複数のスレッドで同時に実行されることがありません。 public class Foo { ... public synchronized boolean getFoo() { ... } さて、C++ (with pthread) で同様の機能を実現するにはどうしたらよいでしょう?まず、一番単純な方法は次のようなものです。 // 方法 a void Foo::need_to_sync(void) { static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex); // 処理 pthread_mutex_un

    memologue - C++でsynchronized methodを書くのは難しい (1)
  • インラインアセンブラと \n\t - memologue

    小ネタ2。 GCCで複数行からなるインラインアセンブラを書くとき、 __asm__ ("movl %0,r9\n\t" "movl %1,r10\n\t" "call _foo" :: "g" (from), "g" (to) : "r9", "r10");のように \n\t 区切りで書くひとと、\n\t のかわりにセミコロン区切りで書く*1ひとがいます。GCCのマニュアル上は、どちらでもOKよん、ということになってるんですが、世間では \n\t 派が多いです。...で、 ; の方が読みやすいだろうに、なぜ世間では\n\t派が多いのか、ちょっと前まで疑問でした。というわけで、\n\tの利点説明です。 gccコマンドが.cをって一時ファイル(/tmp/ランダム文字列.s)を生成するとき、前者(\n\t)の書き方だと.sは ラベル: #APP movl %0,r9 movl %1,r10 c

    インラインアセンブラと \n\t - memologue
    mogwaing
    mogwaing 2007/08/05
    inline記述時に¥n¥tと;とで区切る場合の違いについて
  • name mangling と extern "C" - memologue

    さて、T君と飲んだ理由は、昼間にオシゴトの技術的な相談に乗ってあげたからなのだが…。平日昼に急に携帯に電話がかかってきてビックリした。曰く、 ずっとJ2EEなコードを書いて暮らしていたのだが、わけあって急にVxWorksとC++で組み込み機器向けのコードを書くことになった。が、組み込みやC++に詳しい人間が全く居なくて難航している。 現状誤動作しており、とりあえず早急に修正しなければならないコードがあるのだが、誤動作の原因がさっぱりわからない。相談に乗ってもらえないか。ていうか助けて。コンパイラはGNUのを使っている。Cを学んだ事はある。 へいへいOKOK。 構造体Aがある。この構造体はa.hで定義されている。 構造体Aを操作する関数fooがある。fooのプロトタイプはfoo.hに書いてあり、int foo(A* a); となっている。foo.cppで関数fooが実装されている。 今問題を

    name mangling と extern "C" - memologue
    mogwaing
    mogwaing 2006/12/21
    name mangling の具体的なアルゴリズムは、コンパイラとそのバージョンによっていろいろで、ISOやなんかで標準化は、残念ながらされていない。 とのこと
  • GCCが出力した小さなバイナリからsection headerを除去したりする話 - memologue

    Binary Hacks に、「インラインアセンブラをちょっとだけ使って、gccに小さなhello worldバイナリを出力させる」というネタを書きました(Hack #25: glibcを使わないでHello Worldを書く)。その補足という訳でもないのですが、先日shinh先生と焼肉などべておりましたところ、セクションヘッダを削ってサイズ縮小する話は紹介してもよかったんじゃまいかとツッコミをいただきましたので、(あまり親切な記述ではないですが)書いてみます。「gccにコードを吐かせる」「アセンブリ言語部分にあまり凝らない」という条件で、132バイトまで削ります(書籍だと488バイト)。 えー、hello world なソースコード(末尾に添付)を次のようにコンパイルして*1、 % gcc -m32 -Os -fno-builtin -fomit-frame-pointer -fno-

    GCCが出力した小さなバイナリからsection headerを除去したりする話 - memologue
  • 1