日本語訳:2004 年 9 月 17 日 (原文:2003 年 4 月 28 日、バージョン 1.20) この HOWTO はプログラマ向けであり、Linux におけるプログラムライブラリの作成方法と使用方法を説明するものです。 「静的ライブラリ (static library)」、「共有ライブラリ (shared library)」、「動的ライブラリ (dynamically loaded library)」を対象とします。 (訳注:この訳文では、「dynamically loaded library」のことを「動的ライブラリ」と呼ぶことにします。 世の中では、shared library のことを指して動的ライブラリと表現する例もありますが、それとは異なりますので注意してください。) Table of Contents1. はじめに2. 静的ライブラリ3. 共有ライブラリ3.1. 約
普通のやつらの下を行け: objcopy で実行ファイルにデータを埋め込む プログラムの実行に不可欠なデータをファイルから読み込んで利用することがあります。この方法を用いると、データの更新が手軽にできるという利点がある一方で、単体の実行ファイルで実行できない、データファイルが紛失してしまう、といった問題もあります。 普通のやつらの下を行けの第5回として、今回は objcopy を用いて実行ファイルにデータを埋め込む方法を取り上げたいと思います。 データの埋め込み 小さなデータをソースコードに埋め込むのは簡単です。ソースコード中に埋め込まれている "hello, world" などのメッセージはソースコードに埋め込まれたデータといえます。 一方、画像や辞書などの巨大なデータをソースコードに埋め込むのはそう簡単ではありません。まず、データを文字列などに変換する必要がある上に、変換後の巨大なソー
The GNU Binutils are a collection of binary tools. The main ones are: ld - the GNU linker. as - the GNU assembler. gold - a new, faster, ELF only linker. But they also include: addr2line - Converts addresses into filenames and line numbers. ar - A utility for creating, modifying and extracting from archives. c++filt - Filter to demangle encoded C++ symbols. dlltool - Creates files for building and
プログラムヘッダテーブルの各エントリ 32bit struct Elf32_Phdr { Elf32_Word p_type; /* エントリのタイプ */ Elf32_Off p_offset; /* 対応するセグメントのファイル先頭からのオフセット */ Elf32_Addr p_vaddr; /* メモリ上でのセグメントの第一バイトの仮想アドレス */ Elf32_Addr p_paddr; /* 物理番地指定が適切なシステムの為に予約。 */ Elf32_Word p_filesz; /* 対応するセグメントのファイルでのサイズ。0も可。 */ Elf32_Word p_memsz; /* 対応するセグメントのメモリ上に展開された時のサイズ。0も可。 */ Elf32_Word p_flags; /* 対応するセグメントに適切なフラグ。 */ Elf32_Word p_align;
少し不粋ではありますが、何やってるかわかりにくい部分も多いので、解説を試みてみます。昨日だらだら書いてたんですが、途中 yupo5656 さんがご自分で解説書かれてたりしたのでかぶったりしてますがまぁ気にしない方針で。 基本的に、なぜか、拡張機能をたくさん使うとか、危っかしいコードを書く、とかに価値があるとされています。また、なぜか、普段高慢ちきな main を汚すことに快感を覚えていることも重要です。 最初の私のやつ #include <stdio.h> __attribute__((constructor)) int main() { static int i = 0; if (i) puts("world!"); else i = puts("hello"); }GCC 拡張の constructor は main の前に呼ばれることになってます。現在の GCC 環境ではエントリポイ
shinhさんの「ふとイヤなコードを思いつきました」にインスパイヤされてみました。 % cat iyana.c #include <stdio.h> #include <stdlib.h> int main; __attribute__((constructor, destructor)) static void x() { if (main) puts("world!"); else exit(main = puts("hello")); } % gcc -Wall iyana.c iyana.c:4: warning: ‘main’ is usually a function % ./a.out hello world!意味はありません。っていうかこの警告ははじめて見たわ。教えてくれなくても存じていましてよ。 (追記) shinhさんの8/29の日記にさらに凄いのが。 トラックバックし
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く