2007年2月28日

浮動小数点演算ではまった話

浮動小数点演算のありがちな問題ではまりました。 いろいろ調べているうちに x86 特有のちょっとおもしろい 現象に遭遇したので紹介したいと思います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年12月16日

Binary 2.0カンファレンス 2006 発表資料とレポート

Binary 2.0 カンファレンス 2006 は大盛況のうちに無事終了いたしました。開催にご協力いただいた皆様、スピーカーの皆様、参加していただいた皆様、大変ありがとうございました。当日の発表資料とレポートをこのエントリでまとめます。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年12月 9日

Binary 2.0カンファレンス2006

Binary 2.0 カンファレンス2006 を 2006年12月15日に開催します。 当日はビデオストリーミングによるライブ中継を行う予定です。

無事に終了しました。当日の模様は発表資料とレポートをどうぞ。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年9月22日

ファイル記述子をUnixドメインソケット経由で渡す

Unix 系の多くの OSには、ファイル記述子を別のプロセスに Unix ドメインソケット経由で渡す機能があります。一見、何のために使うのかよくわからない機能ですが、 glibc の nscd はこれをうまく使っています。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年9月 9日

Binary Hacks in Action

Development Environment Conferenceで15分ほど喋った内容のスライドを公開しました。

最後のスライドで、来月にオライリージャパンから出版予定の Binary Hacks の宣伝をさせていただきました。従来、あまりまとめられることがなく「知る人ぞ知る」的な存在だった低レイヤの技術のノウハウを集めて誰にでも使えるようにすることが本書の目的です。ご期待ください。

投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年8月10日

再入不可能な関数を C で実装する

一度実行したら二度と中身を実行できなくなる再入不可能な関数を C で実装してみます。通常、このような関数はシングルトンなどの静的なデータの初期化に使いますが、ここではデータについては考えないことにします。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年7月14日

gdb tips

gdb を使う上で便利な tips を紹介します。基本的な使い方をマスターしている人向けです。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年7月 9日

gdb の gcore コマンドを使う

デバッガの理論と実装を読んで以来、デバッガをもっと活用しようという意欲がわいてきました。そこで、gdb について調べていると、 gcore (generate-core-file) というコマンドを見つけました。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年5月 3日

glibc の fopen() で 'm' オプションを使う

最近の glibc の fopen() には 'm' というオプションがあると知りました。 'm' オプションを指定すると、リードオンリーでファイルを開いたとき、可能な場合、 mmap が内部的に使われるようになります。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年4月28日

実行時のスタックの消費量を調べる

先日の記事では checkstack.pl を用いて個々の関数がどのくらいスタックを消費するか調べる方法を紹介しました。今回は、実行時の実際のスタック消費量を調べてみます。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年4月24日

checkstack.pl で関数のスタック消費量を調べる

Linux カーネルのソースコードに付属する checkstack.pl を使うと、C/C++ のプログラムの関数のスタック消費量を調べることができます。checkstack.pl は objdump -d のディスアセンブルの出力からスタックポインタの操作をパターンマッチしてスタックの消費量を計算しています。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年4月23日

子プロセスに LD_PRELOAD を継承させない

Linux で LD_PRELOAD 環境変数を使うと共有オブジェクト (共有ライブラリ) のプリロードを行うことができます。通常、LD_PRELOAD が設定されている間は、あるプロセスから呼んだ子プロセスも同様にプリロードを行いますが、場合によっては子プロセスにはプリロードさせたくないときもあります。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年4月22日

Cのポインタを整数に変換する

Cのポインタを整数に変換したいときがあります。このとき問題になるのは、ポインタのサイズが int と同じとは限らないということです。たとえば、 x86_64 の 64ビットのバイナリでは sizeof(int) = 4, sizeof(void *) = 8 となります。ポインタと同じサイズの整数を使いたい場合は C99 で導入された stdint.h で提供される intptr_t または uintptr_t を使います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年4月 3日

Doug Lea の malloc (dlmalloc)

小さなオブジェクトを大量に new しまくるプログラムを C++ で書いたところ、処理時間の多くが malloc() に費やされていることがわかりました。このような場合、自前でメモリ管理を行って最適化するという方法がありますが、なかなか大変です。

そこで、安易に高速な malloc に置き換えてみようということで、 Doug Lea の malloc (通称 dlmalloc) の最新版を試してみました。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年3月 5日

setitimer システムコールを使って簡単なプロファイラを作る

setitimer システムコールを使うと一定時間間隔でシグナルを発生させることができます。頻繁にシグナルを発生させて、「シグナルが呼ばれたときにどこにいたか」を記録していけばサンプリング方式のプロファイラを作ることができます。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年3月 1日

PIE (位置独立実行形式) を作成する

通常、PIC (位置独立コード) は共有ライブラリに用いられますが、Linux 上で最近の GCC, Glibc および GNU Binutils を使うと、実行ファイルも位置独立にすることができます。本記事では PIE (位置独立実行形式) を作成する方法と特徴を紹介します。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年2月22日

ライブラリの外に公開するシンボルを制限する

C言語にはファイル内 (コンパイル単位) からしかアクセスできない static 関数と、別のファイルからもアクセスできる非static 関数があります。しかし、ライブラリを作成する上では、この2つのスコープだけでは不十分なときがあります。

本記事では GNUの開発環境において、ライブラリの外に公開するシンボルを制限する方法を紹介します。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年2月19日

Linux の共有ライブラリを作るとき PIC でコンパイルするのはなぜか

通常、Linux の共有ライブラリを作るときは各 .c ファイルを PIC (Position Independent Code) となるようコンパイルします。しかし、実は PIC でコンパイルしなくても共有ライブラリは作れます。それでは PIC にする意味はあるのでしょうか。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

リンクされているライブラリによってプログラムの動作を変える

weak シンボルを用いると、リンクされているライブラリによってプログラムの動作を変えることができます。ここでは GNU 拡張を用いて weak シンボルを利用する方法を紹介します。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年2月12日

ltrace で共有ライブラリの関数呼び出しをトレースする

ltrace は共有ライブラリの関数呼び出しをトレースする Linux 用のツールです。システムコールをトレースするstrace と同様に、デバッグに大変役立ちます。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年2月 5日

Cのプログラムの中でブレークポイントを設定する

Cのプログラムをデバッグする際には GDB などのデバッガが役立ちます。通常、ブレークポイントはデバッガの中から設定しますが、デバッグ対象のCのプログラムの中で設定することもできます。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年1月23日

Jockey で Linux のプログラムの実行を記録・再生する

Jockey は Linux のプログラムの実行を記録・再生するツールです。システムコールと一部の CPU命令をフックして実行時の入出力をログに記録することによってプログラムの再生を実現しています。主にデバッグ用途に使います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年1月 8日

C++ のシンボルをデマングルする

C++ コンパイラはシンボルが一意の名前を持つように名前マングル (name mangling) と呼ばれる処理を行います。本記事では GNU の開発環境で C++ のシンボルをデマングル (demangle) する方法を紹介します。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年12月17日

main() の前に関数を呼ぶ

C/C++ のプログラムで、main() の前に関数を暗黙的に呼びたいときがあります。ここでは GCC の拡張を使った方法と、C++ のコンストラクタを使った方法を紹介したいと思います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年12月13日

statifier で動的リンクの実行ファイルを擬似的に静的リンクにする

statifierは動的リンクされた実行ファイルと共有ライブラリを1つのファイルにまとめるための Linux 用のツールです。動的リンクされた実行ファイルを別のホストにコピーして実行したい、というときなどに使えます。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年12月12日

prelink の効果を測定する

prelink は大量の共有ライブラリをリンクしたプログラムの起動時間を短縮するためのツールです。最近の Linux で利用できます。Gentoo Linux Prelink ガイドによると「典型的なKDEプログラムの起動時間は50%も短縮することができます」とのことです。このエントリでは簡単なプログラムを書いて prelink の効果を調べる実験を行ってみます。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年12月 4日

Binary 2.0 カンファレンス 2005 開催の経緯

Binary 2.0 カンファレンス 2005 の開催にいたる経緯について書いてみたいと思います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年12月 3日

Binary 2.0カンファレンス 2005 発表資料とレポート

Binary 2.0 カンファレンス 2005 は大盛況のうちに無事終了いたしました。開催にご協力いただいた皆様、スピーカーの皆様、参加していただいた皆様、大変ありがとうございました。

当日の発表資料とレポートをこのエントリでまとめています。参加報告などはこのエントリへのトラックバックで受け付けています。よろしくお願いいたします。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年11月19日

Binary 2.0 は死んだ

Joel on SoftwareDon't Let Architecture Astronauts Scare Youという記事に、流行のバズワードがたどる運命が紹介されていました。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年11月15日

Binary 2.0カンファレンス2005

Binary 2.0 カンファレンス2005 を 2005年12月2日に開催します。

  • 主催 - Binary 2.0 カンファレンス実行委員会 (協力 Shibuya.pm)
  • 日時 - 2005年12月2日 (金) 18:30-21:30 (18:00 開場)
  • 会場 - 神保町三井ビル 17F 株式会社インターネットイニシアティブ (IIJ) 大会議室
  • 参加費 - 無料
  • 事前登録 - 定員100名 (定員に達したので締め切りました)
  • プログラム 内容・順番・時間などは予告なく変更する場合があります。

無事に終了しました。当日の模様は 発表資料とレポートをどうぞ。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年11月13日

普通のやつらの下を行け: ptrace で実行中のプロセスにちょっかいを出す

Linux などの多くの Unix 的なOS には ptrace というシステムコールがあります。 ptrace を使うと実行中のプロセスに対して、レジスタの書き換えやメモリ上のデータの書き換えといったさまざまな操作を行うことができます。

普通のやつらの下を行けの第6回として、今回は ptrace を使って実行中のプロセスにちょっかいを出す方法を取り上げたいと思います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年11月12日

普通のやつらの下を行け: objcopy で実行ファイルにデータを埋め込む

プログラムの実行に不可欠なデータをファイルから読み込んで利用することがあります。この方法を用いると、データの更新が手軽にできるという利点がある一方で、単体の実行ファイルで実行できない、データファイルが紛失してしまう、といった問題もあります。

普通のやつらの下を行けの第5回として、今回は objcopy を用いて実行ファイルにデータを埋め込む方法を取り上げたいと思います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年11月 6日

The Catcher in the g++

先日、Binary 2.0 時代の到来について書きましたが、やはり予感は間違っていなかったようです。 w_o 氏による g++の例外を素手で捕まえる話 (その続き) はまさに Binary 2.0 時代の潮流を表した名記事といえそうです。そろそろ Binary 2.0 カンファレンスを行うべきときがきたかもしれません。

投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

普通のやつらの下を行け: BFDでデバッグ情報の取得

gcc に -g オプションを与えるとデバッグ情報をバイナリに埋め込むことができます。この情報は通常 gdb などのデバッガによって利用されますが、普通のプログラムでも利用できれば何かおもしろいことができるかもしれません。

普通のやつらの下を行けの第4回として、今回は BFD (libbfd) を用いてデバッグ情報を取得する方法を取り上げたいと思います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年11月 3日

Binary 2.0

binareal.png 昨今のネット上でのトレンド、とりわけ shinichiro.h 氏による実行時に情報を調べる話や、大和さんによる Binareal の勢いを目の当たりにするにつけ、 Web 2.0 の次にくるのは Binary 2.0 ではないかという予感が確信に変わりつつあります。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年10月25日

普通のやつらの下を行け: Cで動的コード生成・実行

スクリプト言語には動的にコードを生成して実行する機能を持ったものが多くあります。 普通のやつらの下を行けの第3回として、今回は C による動的なコード生成と実行に取り組んでみたいと思います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

普通のやつらの下を行け: C でバックトレース表示

普通のやつらの下を行けの第2回として、今回は glibc の関数を使って C でバックトレース (スタックトレース) の表示を行ってみます。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年10月24日

普通のやつらの下を行け: assert_caller()

以前に、低レベルプログラミングを愛好する知人が「普通のやつらの下を行け」を口癖にしていました。当時は何を言っているのかと聞き流していましたが、自分も最近になってようやく低レベルプログラミングのおもしろさがわかってきました。今回は「普通のやつらの下を行け」企画の第一弾として assert_caller() なるものを作ってみたいと思います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年10月12日

リンクと同名シンボル: weak シンボル編

先日の記事では静的リンクの際に同名シンボルの衝突は検出されると書きました。しかし、 weak シンボルが存在すると話は変わります。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年10月10日

リンクと同名のシンボル: C++の場合

前回の記事で紹介した動的リンクの動作は、 C++ では予期せぬメンバ関数が呼ばれるという問題を引き起こします。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

リンクと同名のシンボル

C や C++ のプログラムで同じ名前のグローバルなシンボルが 2つ以上存在するとどうなるでしょうか。 Debian GNU/Linux sarge + GCC 3.3.5 での動作を見てみます。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク