2009年11月30日月曜日

maximaをいじる

手元で数式処理できるツールが欲しいなぁ、と、だいぶ前からMaximaに目をつけていた。

気分転換がてら、ちょこちょこいじってみようと思う。

参考書は、

はじめてのMaxima

にする。

ごりごり読むのではなくて、あくまでのんびり遊びながらつまみ食いする予定。

debian-emacs-policyのポイント

ざっとポイントをまとめた。
これ以上理解するには、perlを多少勉強せねばならない。
うーん。どうしたものか。


* debian-emacs-policyのポイント
- debian-emacs-policyでは、debian systemにてemacs
関連のpackagesを作成/管理するためのpolicyが規程
されている。
- 簡明にまとまっている文書なので、メモ化する必要は
ないのだが、確実な理解のためにあえてメモを作成す
る。
- policyの所在
- emacsen-common:
/usr/share/doc/emacsen-common/debian-emacs-policy.gz
- またはWeb。debian.org。

** policyにおける用語
- <emacs>

emacs
xemacs21
emacs21
emacs22

- <flavor>

xemacs21
emacs21
emacs22

- すなわち、<emacs> - 'emacs'。

** policyが求めるload-path
- load-path
- debian emacs policyでは、最低、次の場所が次の
順(優先度が高い順)にload-pathに含まれることを求めている。
これはどのemacsenにおいても、である。

/etc/<flavor>
/etc/emacs
/usr/local/share/emacs/<upstream>/site-lisp
/usr/local/share/emacs/site-lisp
/usr/share/emacs/<flavor>/site-lisp
/usr/share/emacs/site-lisp

- ここで、<upstream>は、'22.2'などのupstream
version number。

** emacsen-common package
- emacsen-commonパッケージは、debian emacs policy
に従ったemacs packagesの管理のためのfacilityを提
供している。
- 提供物一覧

~ $ apt-file list emacsen-common
emacsen-common: /etc/emacs/site-start.d/00debian-vars.el
emacsen-common: /etc/emacs/site-start.el
emacsen-common: /usr/lib/emacsen-common/emacs-install
emacsen-common: /usr/lib/emacsen-common/emacs-package-install
emacsen-common: /usr/lib/emacsen-common/emacs-package-remove
emacsen-common: /usr/lib/emacsen-common/emacs-remove
emacsen-common: /usr/lib/emacsen-common/generate-install-list
emacsen-common: /usr/lib/emacsen-common/packages/install/emacsen-common
emacsen-common: /usr/lib/emacsen-common/packages/remove/emacsen-common
emacsen-common: /usr/share/doc/emacsen-common/changelog.gz
emacsen-common: /usr/share/doc/emacsen-common/copyright
emacsen-common: /usr/share/doc/emacsen-common/debian-emacs-policy.gz
emacsen-common: /usr/share/emacs/site-lisp/debian-startup.el
~ $

- /etc/emacs/site-start.el
- これはpackageに含まれてはいるが、local admin
が中身を管理するもの。

*** 提供物の概要
**** /usr/lib/emacsen-common/emacs-install
- perl script。
- コメント。

# Call emacsen-common/packages/install/* install-flavor other-flavor ...
# for every installed emacs add-on package.

**** /usr/lib/emacsen-common/emacs-remove
- emacs-installの別名。

**** /usr/lib/emacsen-common/emacs-package-install
- perl script。
- コメント。

# Was this called because we're installing/removing a new emacs
# flavor? This should probably be handled with getopt and a command
# line opt, but it's freeze time, and I'm tired...

**** /usr/lib/emacsen-common/emacs-package-remove
- emacs-package-installの別名。

**** /usr/lib/emacsen-common/generate-install-list
- perl script。
- ライブラリ。
- コメント。

# depends on: dpkg, tsort, perl

# This script should be handed a list of add-on packages on stdin, and
# it will sort them according to their dependencies. It will also add
# in other add-on packages that aren't mentioned, but are needed.

# Test code
# my @input_packages = <STDIN>;
# my @result = generate_add_on_install_list(@input_packages);
# print " " . join("\n ", @result);

**** /usr/lib/emacsen-common/packages/install/emacsen-common
- shell script。
- 使い方。
- /usr/lib/emacsen-common/packages/remove/emacsen-common <flavor>
- emacsen-commonパッケージが提供しているelファイ
ルについて、flavor用バイトコンパイルを実施する。
**** /usr/lib/emacsen-common/packages/remove/emacsen-common
- shell script。
- 使い方。
- /usr/lib/emacsen-common/packages/remove/emacsen-common <flavor>
- emacsen-commonパッケージが提供しているelファイ
ルのflavor用バイトコンパイルを削除する。

** emacsen main packages
- 'emacs22'とか'xemacs21'とか、emacsen本体を提供
するパッケージのこと。
*** 必須作法
**** メンテナスクリプト
- postinst
- postinstに記述するもの。
- "/usr/lib/emacsen-common/emacs-install <flavor>"
- この記述によってemacs-installは次のものを実
行する。
- "/usr/lib/emacsen-common/packages/install/<pkg> <flavor> <others>"
- prerm
- prermに記述するもの。
- "/usr/lib/emacsen-common/emacs-remove <flavor>"
- この記述によってemacs-removeは次のものを実
行する。
- "/usr/lib/emacsen-common/packages/remove/<pkg> <flavor> <others>"
**** バイナリシムリンク
- /usr/bin/<package-name>から
/usr/bin/<emacs-binary>へのsymbolic linkが必須。
- というのはadd-on packagesがinstall/removeすると
き、/usr/bin/$ARGV[0]を使ってバイトコンパイルな
どをするから。
**** 依存関係 "Provides: emacsen"
- emacsen main packageは、debian packageとして
controlファイルにおいて、"Provides:"に
"emacsen"と記述する。
- 例:emacs22

Provides: editor, emacsen, info-browser, mail-reader, news-reader

** add-on packages
*** 基本作法
- 必須な作法は少い。
- 何故かというと、もしadd-onしようとしている機能に
ついて、バイトコンパイルが不要であったり、インストー
ル時の調整(emacs毎)も不要であったりするならば、
単にそのadd-on packageは、しかるべき場所にしか
るべきファイルを置くだけで目的をはたせるからだ。
- ここでは必須なものを含めて基本的なものを書く。
**** 設置場所
- add-on packagesが設置できる場所はつぎのとおり。
/etc/<emacs>/site-start.d
/usr/share/<emacs>/site-lisp/<package-name>
- これは必須作法である。
**** load-path
- add-on packagesはload-pathをいじってはいけない。
- これは必須作法である。
**** 依存関係
- 'emacsen-common'をdependsするべきではない。その
かわりに、'emacsen'をdependsするか、対応している
flavorsをdependsする。
**** 初期化ファイルの中身
- site-start.dなどにおく初期化ファイルでは、load
ではなくautoloadを使うべし。

*** 応用作法
- 「バイトコンパイルが必要」など、flavorに依存した
install/remove処理が必要なものの作法。

**** メンテナスクリプト
- まず、次のファイルをパッケージにて提供すべし。

/usr/lib/emacsen-common/packages/install/<pkg>
/usr/lib/emacsen-common/packages/remove/<pkg>

- サンプル
- 仮想的なfooというパッケージに対するもの。
- flavor毎にバイトコンパイルをするもの。
- install

#!/bin/sh
# /usr/lib/emacsen-common/packages/install/foo
# [ This particular script hasn't been tested, so be careful. ]
set -e

FLAVOR=$1
echo install/foo: Handling install of emacsen flavor ${FLAVOR}

byte_compile_options="-batch -f batch-byte-compile"
el_files="some-file.el some-other-file.el etc.el"
el_dir=/usr/share/emacs/site-lisp/foo/
elc_dir=/usr/share/${FLAVOR}/site-lisp/foo/

if [ ${FLAVOR} != emacs ]
then
echo install/foo: byte-compiling for ${FLAVOR}

[ -d ${elc_dir} ] || mkdir ${elc_dir}

# Copy the temp .el files
(cd ${el_dir} && cp ${el_files} ${elc_dir})

# Byte compile them
(cd ${elc_dir} \
&& ${FLAVOR} ${byte_compile_options} ${el_files} 2> /dev/null)

# remove the redundant .el files
# presumes that any .el files in the <flavor> dir are trash.
rm ${elc_dir}/*.el
fi
exit 0;

- remove

#!/bin/sh
# /usr/lib/emacsen-common/packages/remove/foo
# [ This particular script hasn't been tested either, so be careful. ]
set -e

FLAVOR=$1
elc_dir=/usr/share/${FLAVOR}/site-lisp/foo

echo remove/foo: Handling removal of emacsen flavor ${FLAVOR}

if [ ${FLAVOR} != emacs ]
then
echo emacsen-common: purging byte-compiled files for ${FLAVOR}
rm -f ${elc_dir}/*.elc
[ -d ${elc_dir} -a `ls -la ${elc_dir}|wc -l` -gt 3 ] && rmdir ${elc_dir}
fi
exit 0;

- その上で、メンテナスクリプトは次のようにすべき。
- postinst
- /usr/lib/emacsen-common/emacs-package-install <pkg>
- prerm
- /usr/lib/emacsen-common/emacs-package-remove <pkg>


こつこつ。

2009年11月29日日曜日

Ubuntu/GNU Emacs22の起動プロセスにおけるload-pathの構築と利用

ソースを探ったり、いろいろビルドしたりして、結構わかった。
完全とまではいきませんが、現状では十分。

load-pathに限らず、Emacsの起動プロセスをいろいろ調べた。結果として、Emacsの仕組みについて多少詳しくなったのも嬉しい。


* Ubuntu/GNU Emacs22の起動プロセスにおけるload-pathの構築と利用
** src/epaths.in
- epaths.hの素。
- この中のPATH_LOADSEARCHがload-pathの素。
- GNU配布状態:
#define PATH_LOADSEARCH "/usr/local/lib/emacs/lisp"

** src/epaths.h
- makeによって、epaths.inを素に生成される。
- GNU配布状態: [./configure, makeの結果]
#define PATH_LOADSEARCH "/usr/local/share/emacs/22.2/site-lisp:/usr/local/share/emacs/site-lisp:/usr/local/share/emacs/22.2/lisp:/usr/local/share/emacs/22.2/leim"
- Ubuntu: [debuildの結果]
#define PATH_LOADSEARCH "/etc/emacs22:/etc/emacs:/usr/local/share/emacs/22.2/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/22.2/site-lisp:/usr/share/emacs/site-lisp:/usr/share/emacs/22.2/leim:/usr/share/emacs/22.2/lisp:/usr/share/emacs/22.2/leim"

** src/emacs.c
- main
- init_lread関数[lread.c]の実行
- normal = PATH_LOADSEARCH;
- Vload_path = decode_env_path ("EMACSLOADPATH", normal);
- dcode_env_pathはパス達のリストを返す。
- Vtop_level変数の構成
- 起動時に評価するlispを格納。
- 値の形式は(load . (hoge))。すなわちhogeをロー
ドする。
- hogeは、
- emacsオプションで'-l'指定があればそのelファ
イル。
- そうでなければ、'loadup.el'。
- GNU:
(load "loadup.el")
- Frecursive_edit関数の実行
- editor command loop に入る。
- recursive_edit_1 [keyboard.c]
- command_loop [keyboard.c]
- internal_catch (Qtop_level, top_level_1, Qnil)
- top_level_1 [keyboad.c]
- internal_condition_case (top_level_2, Qerror, cmd_error) [eval.c]
- top_level_2 [keyboard.c]
- Feval (Vtop_level) [eval.c]
- ここにいたり、先にVtop_level
で設定した(load "loadup.el")が
評価される。

** lisp/loadup.el
- このelispに入った時点では、emacs.cのVload_path
がload-pathの値である。

*** load-path変数の調整
- bootstrappingするときだけ、load-pathを次のように
加工する。通常はこの加工はしない。

(let ((dir (car load-path)))
;; We'll probably overflow the pure space.
(setq purify-flag nil)
(setq load-path (list dir
(expand-file-name "emacs-lisp" dir)
(expand-file-name "language" dir)
(expand-file-name "international" dir)
(expand-file-name "textmodes" dir))))

*** (load "startup") [lisp/startup.el]
- (defcustom site-run-file "site-start" ...)
- (defconst debian-emacs-flavor 'emacs22 ...)
[*debian patch*]
- (setq top-level '(normal-top-level))
- normal-top-level関数を定義
- この関数の中で次の処理が定義されている。
- load-pathの拡張
- load-pathに含まれるパスを順次処理する。
- 処理は、そのパスに、subdirs.elや
leim-list.elがあれば、それらをloadするとい
うもの。
- subdirs.elの中身の典型は、次の2つ。
- normal-top-level-add-subdirs-\
to-load-path を引数無しで呼ぶ。これは
カレントディレクトリ配下のサブディレク
トリを全てload-pathに追加する。
- normal-top-level-add-subdirs-\
to-load-path を引数有で呼ぶ。これはカ
レントディレクトリ配下のサブディレクト
リについて、引数で指定されたものを
load-pathに追加する。
- leim-list.elの中身の典型は、次のよう。
- register-input-method関数の実行を列記。
- loadやautoloadをここに記述することも
ある。
- command-line関数を実行する。
- emacs-starup-hookを呼ぶ。
- term-startup-hookを呼ぶ。
- command-line関数を定義
- この関数の中で次の処理が定義されている。
- (load site-run-file t t)
- (load "debian-startup" t t nil) [*debian patch*]
- "debian-startup.el"の中身は関数群定義のみ。
- 定義される関数の一覧。
- debian-pkg-add-load-path-item
- debian-unique-strings
- debian-run-directories
- debian-startup
- (debian-startup debian-emacs-flavor)の実行 [*debian patch*]
- (let ((common-dir "/etc/emacs/site-start.d")
(flavor-dir (concat "/etc/" (symbol-name flavor) "/site-start.d")))
(debian-run-directories flavor-dir common-dir))))
- (debian-run-directories flavor-dir common-dir)
- flavor-dirやcommon-dirに入っているすべての
ディレクトリについて、NNfilename.elや
NNfilename.elcの形のファイル名のものを探索
収集し、アルファベティカルにソートして、重
複を削除したリストを作成する。このリス
トをbase-namesと呼ぶ。
- load-pathに、flavor-dirとcommon-dirを追
加する。
- base-namesの中身(file)をひとつずつloadす
る。
- 前項のloadをした結果として、load-pathが
さらに拡張されているかもしれない。そこで、
load-pathをflavor-dirとcommon-dirを追加
しただけの状態に戻す。
- (load site-run-file t t nil) [*debian patch*]

- user-init-file-1の調整
- user-init-file-1は、いわゆる'~/.emacs'となる。
- (load user-init-file-1 t t)
- otherfileの調整
- いわゆる'~/.emacs.d'の中の'init'というファイ
ル。
- (load otherfile t t)
- (load "default" t t)
- inihibit-default-initがnilのときは読み込まな
い。

*** (load "site-load" t)
- 'site-load.el'がload-pathのどこかに存在すれば
それをloadする。

- これはtemacsからemacsをdumpするときに含めたい
elispを指定するために存在している。計算機の速度
が向上しているため最近は使わない。
- そもそもの目的はdumpに含めることなのだが、起動時
に読み込ませるelispの設置場所としても使えると言
えば使える。
- ホストのelisp共通設定は、ここではなく
て'default.el'に書くべきである。そちらはユーザ
によって読み込みの制御ができるから。

*** (load "site-init" t)
- 'site-init.el'がload-pathのどこかに存在すれば
それをloadする。

- これもsite-loadと同種の目的のもの。タイミングが
違う。site-initに書いたものはdumped imageにdoc
stringsが読み込まれる。こちらに書いたものは
dumped imageには読み込まれない。
- そもそもの目的はdumpに含めることなのだが、起動時
に読み込ませるelispの設置場所としても使えると言
えば使える。
- ホストのelisp共通設定は、ここではなく
て'default.el'に書くべきである。そちらはユーザ
によって読み込みの制御ができるから。

- site-init.el [*debian patch*]
- flavor-specificなinfo dirの追加処理が記述され
ている。

*** (eval top-level)
- (eval top-level)
- normal-top-level関数[startup.el]の実行


こつこつ。

2009年11月26日木曜日

【入門DP】4.1 パッケージ作成のための基礎知識

教本で知識を確認しつつ、その知識をつかって、emacs22のパッケージをいじってみる。その様子を掲載する。


** 4 パッケージの作成と配布
*** 4.1 パッケージ作成のための基礎知識
- Ubuntu Interpidのemacs22をサンプルとしよう。

**** apt-cache showsrc emacs22
- これによって、ダウンロード前に情報をみれる。

$ apt-cache showsrc emacs22
Package: emacs22
Binary: emacs22-common, emacs22-bin-common, emacs22, emacs22-gtk, emacs22-nox, emacs22-el, emacs
Version: 22.2-0ubuntu2
Priority: optional
Section: editors
Maintainer: Ubuntu Core Developers
Original-Maintainer: Michael W. Olson (GNU address)
Build-Depends: libncurses5-dev, texinfo, liblockfile-dev, libgif-dev, libtiff-dev, xaw3dg-dev, libpng12-dev, libjpeg62-dev, libgtk2.0-dev, dpkg-dev (>> 1.10.0), quilt (>= 0.42), lsb-release, debhelper (>= 5.0.0), libxaw7-dev, libasound2-dev [!hurd-i386 !kfreebsd-i386 !kfreebsd-amd64]
Architecture: any
Standards-Version: 3.7.2
Format: 1.0
Directory: pool/main/e/emacs22
Files:
04ef020a8f1f98965a6b1f881800414b 1461 emacs22_22.2-0ubuntu2.dsc
d6ee586b8752351334ebf072904c4d51 38694318 emacs22_22.2.orig.tar.gz
2d264719b7d1aea7e446e73c5e68c654 26934 emacs22_22.2-0ubuntu2.diff.gz
Vcs-Bzr: http://code.launchpad.net/%7Eubuntu-elisp/emacs/ubuntu/
Checksums-Sha1:
7a371332cb8400d44e8eb31f19e432bbc93523a0 38694318 emacs22_22.2.orig.tar.gz
b6e448aa81a7bf5a04a754f3b7ed39e4923079ef 26934 emacs22_22.2-0ubuntu2.diff.gz
Checksums-Sha256:
216839e1fb38ca4f2ed0a07689fb47ee80d90845f34e0a56fe781d6aa462e367 38694318 emacs22_22.2.orig.tar.gz
5dcfd2a13f68972124174271d5c7f532954500f107c972df94364ef560f2b1a6 26934 emacs22_22.2-0ubuntu2.diff.gz

$

**** ソースのダウンロード
- '-d'をつけなければ、自動的にorig.tar.gzと
diff.gzが展開される。ここではあえて展開させない。

$ apt-get -d source emacs22
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
NOTICE: 'emacs22' packaging is maintained in the 'Bzr' version control system at:
http://code.launchpad.net/%7Eubuntu-elisp/emacs/ubuntu/
Please use:
bzr get http://code.launchpad.net/%7Eubuntu-elisp/emacs/ubuntu/
to retrieve the latest (possible unreleased) updates to the package.
38.7MB のソースアーカイブを取得する必要があります。
取得:1 http://jp.archive.ubuntu.com intrepid/main emacs22 22.2-0ubuntu2 (dsc) [1461B]
取得:2 http://jp.archive.ubuntu.com intrepid/main emacs22 22.2-0ubuntu2 (tar) [38.7MB]
取得:3 http://jp.archive.ubuntu.com intrepid/main emacs22 22.2-0ubuntu2 (diff) [26.9kB]
38.7MB を 7s で取得しました (5385kB/s)
ダウンロードオンリーモードでパッケージのダウンロードが完了しました
$ ls
emacs22_22.2-0ubuntu2.diff.gz emacs22_22.2-0ubuntu2.dsc emacs22_22.2.orig.tar.gz
$

- dscファイルの確認。

$ cat emacs22_22.2-0ubuntu2.dsc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Format: 1.0
Source: emacs22
Binary: emacs22-common, emacs22-bin-common, emacs22, emacs22-gtk, emacs22-nox, emacs22-el, emacs
Architecture: any
Version: 22.2-0ubuntu2
Maintainer: Ubuntu Core Developers
Standards-Version: 3.7.2
Vcs-Bzr: http://code.launchpad.net/%7Eubuntu-elisp/emacs/ubuntu/
Build-Depends: libncurses5-dev, texinfo, liblockfile-dev, libgif-dev, libtiff-dev, xaw3dg-dev, libpng12-dev, libjpeg62-dev, libgtk2.0-dev, dpkg-dev (>> 1.10.0), quilt (>= 0.42), lsb-release, debhelper (>= 5.0.0), libxaw7-dev, libasound2-dev [!hurd-i386 !kfreebsd-i386 !kfreebsd-amd64]
Checksums-Sha1:
7a371332cb8400d44e8eb31f19e432bbc93523a0 38694318 emacs22_22.2.orig.tar.gz
b6e448aa81a7bf5a04a754f3b7ed39e4923079ef 26934 emacs22_22.2-0ubuntu2.diff.gz
Checksums-Sha256:
216839e1fb38ca4f2ed0a07689fb47ee80d90845f34e0a56fe781d6aa462e367 38694318 emacs22_22.2.orig.tar.gz
5dcfd2a13f68972124174271d5c7f532954500f107c972df94364ef560f2b1a6 26934 emacs22_22.2-0ubuntu2.diff.gz
Files:
d6ee586b8752351334ebf072904c4d51 38694318 emacs22_22.2.orig.tar.gz
2d264719b7d1aea7e446e73c5e68c654 26934 emacs22_22.2-0ubuntu2.diff.gz
Original-Maintainer: Michael W. Olson (GNU address)

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFIv/MoW0JvuRdL8BoRAt5eAJ9vlp/tLgrk4OKHKlqexuK5E2SKcQCdHPuB
5DPs97j8ZSQHIjDU74XphAM=
=MKWY
-----END PGP SIGNATURE-----
$

**** orig.tar.gzの中身を確認
- emacs-22.2として展開される。これはGNU配布版その
ままなのだろう。

$ tar zxf emacs22_22.2.orig.tar.gz
$ ls
emacs-22.2 emacs22_22.2-0ubuntu2.diff.gz emacs22_22.2-0ubuntu2.dsc emacs22_22.2.orig.tar.gz
$ cd emacs-22.2
$ ls
AUTHORS INSTALL configure lib-src mac nt vpath.sed
BUGS Makefile.in configure.in lisp make-dist oldXMenu
CONTRIBUTE README etc lispintro man site-lisp
COPYING config.bat info lispref mkinstalldirs src
ChangeLog config.guess install-sh lwlib move-if-change update-subdirs
FTP config.sub leim m4 msdos vms
$

**** diffファイルの中身を確認
- すべて新規ファイルの作成である。
- すべて、debian/配下のファイルである。

--- emacs22-22.2.orig/debian/emacs-bin-common.overrides.linda
+++ emacs22-22.2/debian/emacs-bin-common.overrides.linda
@@ -0,0 +1,2 @@
+Tag: no-manual-for-binary
+Data: (e|c)(tags|macsclient).emacs22
--- emacs22-22.2.orig/debian/emacsclient.desktop
+++ emacs22-22.2/debian/emacsclient.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Version=1.0
[snip]

**** dpkg-sourceで展開
- ソースパッケージの展開にはdpkg-sourceを使う。
- これまでの作業で展開したものなどは念のため削除
しておく。

$ ls
emacs22_22.2-0ubuntu2.diff.gz emacs22_22.2-0ubuntu2.dsc emacs22_22.2.orig.tar.gz
$ dpkg-source -x emacs22_22.2-0ubuntu2.dsc
gpg: 2008年09月04日 23時39分36秒 JSTにDSA鍵ID 174BF01Aで施された署名
gpg: 署名を検査できません: 公開鍵が見つかりません
dpkg-source: extracting emacs22 in emacs22-22.2
dpkg-source: info: unpacking emacs22_22.2.orig.tar.gz
dpkg-source: info: applying emacs22_22.2-0ubuntu2.diff.gz
$ ls
emacs22-22.2 emacs22_22.2-0ubuntu2.dsc
emacs22_22.2-0ubuntu2.diff.gz emacs22_22.2.orig.tar.gz
$ cd emacs22-22.2/
$ ls
AUTHORS INSTALL configure leim m4 msdos vms
BUGS Makefile.in configure.in lib-src mac nt vpath.sed
CONTRIBUTE README debian lisp make-dist oldXMenu
COPYING config.bat etc lispintro man site-lisp
ChangeLog config.guess info lispref mkinstalldirs src
FTP config.sub install-sh lwlib move-if-change update-subdirs
$

- 確かに、debian/が増えているだけである。
- orig.tar.gzを展開したときはemacs-22.2だったが、
dpkg-sourceした後は、emacs22-22.2になっている。
これは、orig.tar.gzのファイル名はdebianポリシー
にあわせるが、中身は上流のままというのがポリシー
なのだろう。それを展開時に修正しているのが、

dpkg-source: extracting emacs22 in emacs22-22.2

なのだろう。

$ tar -tvf emacs22_22.2.orig.tar.gz
drwxrwxrwx cyd/cyd 0 2008-03-26 22:55 emacs-22.2/
-rw-r--r-- cyd/cyd 92389 2008-03-26 13:55 emacs-22.2/AUTHORS
-rw-r--r-- cyd/cyd 210 2007-04-15 10:34 emacs-22.2/FTP
[snip]

**** debian/の中身
***** debian/control
- このソースツリーから生成するすべてのパッケージ
のメタデータが記載されている。

Source: emacs22
Section: editors
Priority: optional
Maintainer: Ubuntu Core Developers
XSBC-Original-Maintainer: Michael W. Olson (GNU address)
Build-Depends: libncurses5-dev, texinfo, liblockfile-dev, libgif-dev, libtiff-dev, xaw3dg-dev, libpng12-dev, libjpeg62-dev, libgtk2.0-dev, dpkg-dev (>> 1.10.0), quilt (>= 0.42), lsb-release, debhelper (>= 5.0.0), libxaw7-dev, libasound2-dev [!hurd-i386 !kfreebsd-i386 !kfreebsd-amd64]
Standards-Version: 3.7.2
XS-Vcs-Bzr: http://code.launchpad.net/%7Eubuntu-elisp/emacs/ubuntu/

Package: emacs22-common
Section: editors
Priority: optional
Architecture: all
Depends: emacsen-common (>= 1.4.10), dpkg (>= 1.9.0)
Suggests: emacs22-el
Conflicts: emacs22-el (<< ${source:Version}), w3-el, dictionaries-common (<< 0.60.0), emacs22-common-non-dfsg
Replaces: emacs22-common-non-dfsg
Description: The GNU Emacs editor's common infrastructure
GNU Emacs is the extensible self-documenting text editor.
This package contains the infrastructure common between emacs22,
emacs22-gtk, and emacs22-nox.

Package: emacs22-bin-common
Section: editors
Priority: optional
Architecture: any
Depends: emacs22-common (= ${source:Version}), ${shlibs:Depends}
Description: The GNU Emacs editor's shared, architecture dependent files
GNU Emacs is the extensible self-documenting text editor.
This package contains the architecture dependent infrastructure
that's shared by emacs22, emacs22-gtk, and emacs22-nox.
[snip]

***** debian/rules
- パッケージの構築を実施するプログラム。
- rulesファイルの一行目は

#!/usr/bin/make -f

でなければならない。
- またインターフェイスとして次のターゲットは必須
である。

build [必須]
binary [必須]
binary-arch [必須]
binary-indep [必須]
clean
build-arch
build-indep
get-orig-source

- 中身を多少追ってみる。本格的に追うのはdebhelper
の節にて。

- binaryターゲットは?

binary: binary-indep binary-arch

- この前提条件達は?

binary-indep: build install
dh_testdir -i
dh_testroot -i
dh_installchangelogs -i
dh_installdocs -i
dh_link -i
dh_strip -i
dh_compress -XREADME.Debian -i
dh_fixperms -i
dh_installdeb -i
# don't install maintainer scripts in the metapackage
rm -vf debian/emacs/DEBIAN/{post,pre}{inst,rm}
dh_shlibdeps -i
dh_gencontrol -i
dh_md5sums -i
dh_builddeb -i

binary-arch: build install
dh_testdir -a
dh_testroot -a
dh_installinfo -a
dh_installman -a
dh_installchangelogs -a
dh_installdocs -a
dh_installexamples -a
dh_installmenu -a
dh_desktop -a
dh_link -a
dh_strip -a
dh_compress -a
dh_fixperms -a -X${movemail_bin}
dh_installdeb -a
dh_shlibdeps -a
dh_gencontrol -a
dh_md5sums -a
dh_builddeb -a

- buildターゲットは?

build: patch build-stamp

- patchターゲットは?

これはrulesには存在しない。おそらく、

include /usr/share/quilt/quilt.make

こちらの中にあるのでは。

- build-stampターゲットは?

build-stamp: bootstrap emacs emacs-gtk emacs-nox
dh_testdir
touch $@

- bootstrapターゲットは?

bootstrap: bootstrap-stamp
bootstrap-stamp:
dh_testdir

# Emacs must be bootstrapped at least once in order to
# generate .elc files
CFLAGS="${CFLAGS}" ./configure ${emacs_confflags}
${build_cmd} bootstrap
${build_cmd} distclean

touch $@

- ここでAutotoolsのbootstrapをやってるのだな。
- emacsターゲットは?

emacs: bootstrap emacs-stamp
emacs-stamp:
dh_testdir

$(call emacs_build,${emacs_confflags},x-emacs)
${build_cmd} distclean

touch $@

- emacs_buildマクロとは?

define emacs_build
# Build emacs
CFLAGS="${CFLAGS}" ./configure ${1}
${build_cmd}
# Check for pure space overflow
${check_pure_space}
# save binary from deletion
mv src/emacs src/${2}
endef

- ここで./configureをやる。

- build_cmdマクロとは?

define build_cmd
${MAKE} CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}"
endef

- お、ここでmakeを呼ぶのか。

- パッチあてて、./configureとmakeの流れがどう記述
さているかは理解できた。


**** ビルド環境確認
- 環境はそろっているようだ。

$ sudo apt-get -s build-dep emacs22
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
$

スタックをかなり積んだ成果が出ている。rulesの中身など、いろいろよく分かる。

こつこつ。

GNUからDebianへ

調べてみたところ、GNU Autoconf/Automake/Libtoolは、第11章以降について、サンプルの現代化がなされていないようだ。自分で現代化していく、というのも勉強になりそうだが、Autotoolsの知識を得ることはスタックの途中にすぎないので、ちょっと重い。

そこで、この本は第10章(US第11章)でいったん区切りとする。先々、今度は主たる目的としてAutotoolsを攻めてみたい。

さて、スタックがひとつ巻き戻った。

次は、Debian Systemのパッケージ構造の基礎を再確認しよう。

教本は、

[入門] Debian パッケージ

にする。昔一度読んだことがあるので、パッケージ構造に関わる部分だけ復習する。

こつこつ。

【autotools】10(US 11) GNU Libtoolとconfigure.inおよびMakefile.am

Autotoolsの新刊がもうすぐ発売される。

AUTOTOOLS

GNU Autoconf/Automake/Libtoolは、少々古いので、それを補えるかもしれない。楽しみです。


** 10(US 11) GNU Libtoolとconfigure.inおよびMakefile.am
- この章は、Automake&Autoconfと一緒にlibtoolを使
う方法の説明。
- 一通り読み、ソースを追い、サンプルを試してみた。
- しかし、何かを「わかった」という実感はない。
- こういう内容は結局実戦で使うときに、理解が発生
するのだろう。
- 今は、触れておくことによってその準備をしている
と考えておく。
- なお、サンプルは、私の環境では、なぜか
Segmentation fault。。。

convenience-2.0 $ ./convenience
cos (0) => 1
Segmentation fault
convenience-2.0 $


こつこつ。

2009年11月25日水曜日

【autotools】9(US 10) GNU Libtool入門 (2)


** 9(US 10) GNU Libtool入門
- Libtoolを単に利用するだけではなく、中身も探って
みよう、シェルプロンプトからLibtoolを使ってみよ
う、というお話。
- ここで、ざっと読んでみるが困難を感じる。
- GNU Libtool Infoをちらっと見てみる。やはり困難
を感じる。
- Linkers & Loadersで勉強。完了。
- GNU Libtool Infoもざっとやる。問題なし。
- そしてこの章に戻ってきた。
- 内容はわかるが、libtoolの利用例が古いlibtoolの
もので、そのままでは動かない。。。
- 最新のlibtoolでの操作に置き換えてみる。

- 訳書P93
- ltconfigによるホスト用libtoolの生成方法が記載
されている。しかし、現状のlibtoolではltconfig
は廃止されており、configureにてホスト用
libtoolを生成するようである。
- Ubuntuでは、Ubuntu用のlibtoolが生成済みで配布
されており、この作業にはソースパッケージが必
要である。
- ここでは割愛する。
- 訳書P97
- ここはlibtoolのI/Fが変更になっているところ。
- 現在は次のとおり。

9-US10 $ libtool --mode=compile gcc -c hello.c
libtool: compile: gcc -c hello.c -fPIC -DPIC -o .libs/hello.o
libtool: compile: gcc -c hello.c -o hello.o >/dev/null 2>&1
9-US10 $ ls
hello.c hello.lo hello.o
9-US10 $ libtool --mode=link gcc -rpath /usr/local/lib -o libhello.la hello.lo
libtool: link: gcc -shared .libs/hello.o -Wl,-soname -Wl,libhello.so.0 -o .libs/libhello.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libhello.so.0" && ln -s "libhello.so.0.0.0" "libhello.so.0")
libtool: link: (cd ".libs" && rm -f "libhello.so" && ln -s "libhello.so.0.0.0" "libhello.so")
libtool: link: ar cru .libs/libhello.a hello.o
libtool: link: ranlib .libs/libhello.a
libtool: link: ( cd ".libs" && rm -f "libhello.la" && ln -s "../libhello.la" "libhello.la" )
9-US10 $ ls
hello.c hello.lo hello.o libhello.la
9-US10 $

- 次の部分は、本文にコンパイルとあるのでmodeを
compileにしているが、rpathスイッチがあるとい
うことはリンクすべきではないか。

9-US10 $ libtool --mode=compile c89 -rpath /usr/local/lib -c hello.c
libtool: compile: unable to infer tagged configuration
libtool: compile: specify a tag with `--tag'
9-US10 $

- 訳書P98

9-US10 $ libtool --mode=link gcc -static -o libhello.la hello.lo
libtool: link: ar cru .libs/libhello.a hello.o
libtool: link: ranlib .libs/libhello.a
libtool: link: ( cd ".libs" && rm -f "libhello.la" && ln -s "../libhello.la" "libhello.la" )
9-US10 $ ls
hello.c hello.lo hello.o libhello.la
9-US10 $

- 訳書P100

9-US10 $ libtool --mode=link gcc -o libtrim.la trim.lo
libtool: link: ar cru .libs/libtrim.a .libs/trim.o
libtool: link: ranlib .libs/libtrim.a
libtool: link: ( cd ".libs" && rm -f "libtrim.la" && ln -s "../libtrim.la" "libtrim.la" )
9-US10 $

- 訳書P100からP101へのまたぎ

9-US10 $ libtool --mode=link gcc -o libgraphics.la -lpng -ltiff -ljpeg -lz
libtool: link: ar cru .libs/libgraphics.a
libtool: link: ranlib .libs/libgraphics.a
libtool: link: ( cd ".libs" && rm -f "libgraphics.la" && ln -s "../libgraphics.la" "libgraphics.la" )
9-US10 $

- 訳書P101からP102へのまたぎ
- 実行可能ファイルのリンクをする前の仮定が省略
されているのでそこもやっておく。

hello $ ls
Makefile.am bootstrap configure.ac hello.c main.c
hello $ libtool --mode=compile gcc -c hello.c
libtool: compile: gcc -c hello.c -fPIC -DPIC -o .libs/hello.o
libtool: compile: gcc -c hello.c -o hello.o >/dev/null 2>&1
hello $ libtool --mode=link gcc -rpath /usr/local/lib -o libhello.la hello.lo
libtool: link: gcc -shared .libs/hello.o -Wl,-soname -Wl,libhello.so.0 -o .libs/libhello.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libhello.so.0" && ln -s "libhello.so.0.0.0" "libhello.so.0")
libtool: link: (cd ".libs" && rm -f "libhello.so" && ln -s "libhello.so.0.0.0" "libhello.so")
libtool: link: ar cru .libs/libhello.a hello.o
libtool: link: ranlib .libs/libhello.a
libtool: link: ( cd ".libs" && rm -f "libhello.la" && ln -s "../libhello.la" "libhello.la" )
hello $ ls
Makefile.am bootstrap configure.ac hello.c hello.lo hello.o libhello.la main.c
hello $ libtool --mode=link gcc -o hello main.c libhello.la
libtool: link: gcc -o .libs/hello main.c ./.libs/libhello.so
hello $ ls
Makefile.am configure.ac hello.c hello.o main.c
bootstrap hello hello.lo libhello.la
hello $ ./hello
Hello, World!
hello $

- 訳書P102

hello $ libtool --mode=link gcc -static -o hello main.c libhello.la
libtool: link: gcc -o hello main.c ./.libs/libhello.a
hello $

- 訳書P103

- この例は、loader.oが存在しないので実行できな
い。

- 訳書P105

intro-hello $ rm hello *.a *.o
intro-hello $ libtool --mode=compile gcc -c trim.c
libtool: compile: gcc -c trim.c -fPIC -DPIC -o .libs/trim.o
libtool: compile: gcc -c trim.c -o trim.o >/dev/null 2>&1
intro-hello $ libtool --mode=link gcc -rpath /usr/local/lib -o libtrim.la trim.lo
libtool: link: gcc -shared .libs/trim.o -Wl,-soname -Wl,libtrim.so.0 -o .libs/libtrim.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libtrim.so.0" && ln -s "libtrim.so.0.0.0" "libtrim.so.0")
libtool: link: (cd ".libs" && rm -f "libtrim.so" && ln -s "libtrim.so.0.0.0" "libtrim.so")
libtool: link: ar cru .libs/libtrim.a trim.o
libtool: link: ranlib .libs/libtrim.a
libtool: link: ( cd ".libs" && rm -f "libtrim.la" && ln -s "../libtrim.la" "libtrim.la" )
intro-hello $

- 訳書P106

intro-hello $ libtool --mode=compile gcc -c hello.c
libtool: compile: gcc -c hello.c -fPIC -DPIC -o .libs/hello.o
libtool: compile: gcc -c hello.c -o hello.o >/dev/null 2>&1
intro-hello $ libtool --mode=link gcc -rpath /usr/local/lib -o libhello.la hello.lo libtrim.la
libtool: link: gcc -shared .libs/hello.o -Wl,-rpath -Wl,/home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs ./.libs/libtrim.so -Wl,-soname -Wl,libhello.so.0 -o .libs/libhello.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libhello.so.0" && ln -s "libhello.so.0.0.0" "libhello.so.0")
libtool: link: (cd ".libs" && rm -f "libhello.so" && ln -s "libhello.so.0.0.0" "libhello.so")
libtool: link: ar cru .libs/libhello.a hello.o
libtool: link: ranlib .libs/libhello.a
libtool: link: ( cd ".libs" && rm -f "libhello.la" && ln -s "../libhello.la" "libhello.la" )
intro-hello $ ls
hello.c hello.lo hello.o libhello.la libtrim.la main.c trim.c trim.lo trim.o
intro-hello $ libtool --mode=link gcc -o hello main.c libhello.la
libtool: link: gcc -o .libs/hello main.c ./.libs/libhello.so /home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs/libtrim.so
main.c: In function 'main':
main.c:7: warning: incompatible implicit declaration of built-in function 'exit'
intro-hello $ ./hello
Hello, World!
intro-hello $

- 訳書P107

intro-hello $ libtool --mode=link gcc -o hello-again -static main.c libhello.la
libtool: link: gcc -o hello-again main.c ./.libs/libhello.a /home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs/libtrim.a
main.c: In function 'main':
main.c:7: warning: incompatible implicit declaration of built-in function 'exit'
intro-hello $ ls
hello hello.c hello.o libtrim.la trim.c trim.o
hello-again hello.lo libhello.la main.c trim.lo
intro-hello $ ./hello-again
Hello, World!
intro-hello $

intro-hello $ libtool --mode=link gcc -o hello main.c libhello.la
libtool: link: gcc -o .libs/hello main.c ./.libs/libhello.so -Wl,-rpath -Wl,/home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/_inst
main.c: In function 'main':
main.c:7: warning: incompatible implicit declaration of built-in function 'exit'
intro-hello $ ./hello
Hello, World!
intro-hello $

- 訳書P109

intro-hello $ libtool --mode=execute gdb hello
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...
(gdb) run
Starting program: /home/aka/local/work/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs/lt-hello
Hello, World!

Program exited normally.
(gdb)

- 訳書P109
- libhelloはインストールできるが、libtrimはイン
ストールできない。なぜか。

intro-hello $ sudo libtool --mode=install cp libtrim.la /usr/local/lib/
libtool: install: cp .libs/libtrim.lai /usr/local/lib/libtrim.la
cp: cannot stat `.libs/libtrim.lai': No such file or directory
intro-hello $ sudo libtool --mode=install install -c libtrim.la /usr/local/lib/
libtool: install: install -c .libs/libtrim.lai /usr/local/lib/libtrim.la
install: cannot stat `.libs/libtrim.lai': No such file or directory
intro-hello $ sudo libtool --mode=install install -c libhello.la /usr/local/lib/
libtool: install: install -c .libs/libhello.so.0.0.0 /usr/local/lib/libhello.so.0.0.0
libtool: install: (cd /usr/local/lib && { ln -s -f libhello.so.0.0.0 libhello.so.0 || { rm -f libhello.so.0 && ln -s libhello.so.0.0.0 libhello.so.0; }; })
libtool: install: (cd /usr/local/lib && { ln -s -f libhello.so.0.0.0 libhello.so || { rm -f libhello.so && ln -s libhello.so.0.0.0 libhello.so; }; })
libtool: install: install -c .libs/libhello.lai /usr/local/lib/libhello.la
libtool: install: install -c .libs/libhello.a /usr/local/lib/libhello.a
libtool: install: chmod 644 /usr/local/lib/libhello.a
libtool: install: ranlib /usr/local/lib/libhello.a
libtool: install: warning: remember to run `libtool --finish /home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/_inst'
intro-hello $

- そうか。コンビニエンスライブラリの流れ
で、-rpathを一度/usr/local/libから外している
から駄目なんだろうな。通常のライブラリでやり
直していれてみる。

intro-hello $ rm hello hello-again *.la *.lo *.o
intro-hello $ ls
hello.c main.c trim.c
intro-hello $ libtool --mode=compile gcc -c trim.c
libtool: compile: gcc -c trim.c -fPIC -DPIC -o .libs/trim.o
libtool: compile: gcc -c trim.c -o trim.o >/dev/null 2>&1
intro-hello $ libtool --mode=link gcc -rpath /usr/local/lib -o libtrim.la trim.lo
libtool: link: rm -fr .libs/libtrim.a .libs/libtrim.la
libtool: link: gcc -shared .libs/trim.o -Wl,-soname -Wl,libtrim.so.0 -o .libs/libtrim.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libtrim.so.0" && ln -s "libtrim.so.0.0.0" "libtrim.so.0")
libtool: link: (cd ".libs" && rm -f "libtrim.so" && ln -s "libtrim.so.0.0.0" "libtrim.so")
libtool: link: ar cru .libs/libtrim.a trim.o
libtool: link: ranlib .libs/libtrim.a
libtool: link: ( cd ".libs" && rm -f "libtrim.la" && ln -s "../libtrim.la" "libtrim.la" )
intro-hello $ libtool --mode=compile gcc -c hello.c
libtool: compile: gcc -c hello.c -fPIC -DPIC -o .libs/hello.o
libtool: compile: gcc -c hello.c -o hello.o >/dev/null 2>&1
intro-hello $ libtool --mode=link gcc -rpath /usr/local/lib -o libhello.la hello.lo libtrim.la
libtool: link: rm -fr .libs/libhello.a .libs/libhello.la .libs/libhello.lai .libs/libhello.so .libs/libhello.so.0 .libs/libhello.so.0.0.0
libtool: link: gcc -shared .libs/hello.o -Wl,-rpath -Wl,/home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs ./.libs/libtrim.so -Wl,-soname -Wl,libhello.so.0 -o .libs/libhello.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libhello.so.0" && ln -s "libhello.so.0.0.0" "libhello.so.0")
libtool: link: (cd ".libs" && rm -f "libhello.so" && ln -s "libhello.so.0.0.0" "libhello.so")
libtool: link: ar cru .libs/libhello.a hello.o
libtool: link: ranlib .libs/libhello.a
libtool: link: ( cd ".libs" && rm -f "libhello.la" && ln -s "../libhello.la" "libhello.la" )
intro-hello $ libtool --mode=link gcc -o hello main.c libhello.la
libtool: link: gcc -o .libs/hello main.c ./.libs/libhello.so /home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs/libtrim.so
main.c: In function 'main':
main.c:7: warning: incompatible implicit declaration of built-in function 'exit'
intro-hello $ ./hello
Hello, World!
intro-hello $ ls .libs
hello libhello.la libhello.so.0 libtrim.la libtrim.so.0 trim.o
hello.o libhello.lai libhello.so.0.0.0 libtrim.lai libtrim.so.0.0.0
libhello.a libhello.so libtrim.a libtrim.so lt-hello
intro-hello $ sudo libtool --mode=install cp libtrim.la /usr/local/lib
[sudo] password for aka:
libtool: install: cp .libs/libtrim.so.0.0.0 /usr/local/lib/libtrim.so.0.0.0
libtool: install: (cd /usr/local/lib && { ln -s -f libtrim.so.0.0.0 libtrim.so.0 || { rm -f libtrim.so.0 && ln -s libtrim.so.0.0.0 libtrim.so.0; }; })
libtool: install: (cd /usr/local/lib && { ln -s -f libtrim.so.0.0.0 libtrim.so || { rm -f libtrim.so && ln -s libtrim.so.0.0.0 libtrim.so; }; })
libtool: install: cp .libs/libtrim.lai /usr/local/lib/libtrim.la
libtool: install: cp .libs/libtrim.a /usr/local/lib/libtrim.a
libtool: install: chmod 644 /usr/local/lib/libtrim.a
libtool: install: ranlib /usr/local/lib/libtrim.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
intro-hello $

- 入った。

- 訳書P109

intro-hello $ sudo libtool --mode=execute cp hello /usr/local/bin
intro-hello $

- helloではなく、lt-helloとして入る。
- ライブラリパスをみるとローカルになっている。
なんでだろう。

intro-hello $ readelf -d /usr/local/bin/lt-hello

Dynamic section at offset 0xe10 contains 24 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libhello.so.0]
0x0000000000000001 (NEEDED) Shared library: [libtrim.so.0]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [/home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs]
0x000000000000000c (INIT) 0x400568
0x000000000000000d (FINI) 0x4007b8
0x0000000000000004 (HASH) 0x400278
0x000000006ffffef5 (GNU_HASH) 0x4002b8
0x0000000000000005 (STRTAB) 0x4003f8
0x0000000000000006 (SYMTAB) 0x4002f0
0x000000000000000a (STRSZ) 213 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x600fe8
0x0000000000000002 (PLTRELSZ) 72 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x400520
0x0000000000000007 (RELA) 0x400508
0x0000000000000008 (RELASZ) 24 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x4004e8
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0x4004ce
0x0000000000000000 (NULL) 0x0
intro-hello $


- 訳書P115
- lt-helloが謎だ。

intro-hello $ sudo libtool --mode=execute cp hello /usr/local/bin
intro-hello $ sudo libtool --mode=uninstall rm -f /usr/local/bin/hello
intro-hello $ ls /usr/local/bin
gauche-cesconv gauche-config gauche-install gauche-package gosh lt-hello
intro-hello $ sudo libtool --mode=uninstall rm -f /usr/local/lib/libhello.la
libtool: uninstall: rm -f /usr/local/lib/libhello.la /usr/local/lib/libhello.so.0.0.0 /usr/local/lib/libhello.so.0 /usr/local/lib/libhello.so /usr/local/lib/libhello.a
intro-hello $ sudo libtool --mode=uninstall rm -f /usr/local/bin/lt-hello
libtool: uninstall: rm -f /usr/local/bin/lt-hello
intro-hello $ sudo libtool --mode=uninstall rm -f /usr/local/lib/libtrim.la
libtool: uninstall: rm -f /usr/local/lib/libtrim.la /usr/local/lib/libtrim.so.0.0.0 /usr/local/lib/libtrim.so.0 /usr/local/lib/libtrim.so /usr/local/lib/libtrim.a
intro-hello $ ls /usr/local/lib
eclipse gauche libgauche.so libgauche.so.0 libgauche.so.0.8.14 python2.5 site_ruby
intro-hello $


こつこつ。

2009年11月24日火曜日

【autotools】9(US 10) GNU Libtool入門

この章、libtoolが古い。
インターフェイスが大幅変更する前のものみたいだ。
サンプルソースは、バージョンアップしており、最新のlibtoolでも動くようだ。

どうしたものか。

ちょっと考えてみる。

【Linkers&Loaders】8 ロードとオーバレイ

オーバレイは、ページングシステム以前の技法。現在は廃れているが、歴史的な意義ありとして記載されている。

ロード自体はシンプルな処理。本章はロード処理の説明は手短に終えて、位置独立コード(PIC)の紹介が主体になっている。

さて、本書も残すは、

9 共有ライブラリ
10 動的なリンクとロード
11 高度なテクニック

の3章となった。このあたりでLibtoolに戻ろう。これら残りの章はLibtoolを学びながら並行して実施することにする。

ふう。スタック、ひとつ巻き戻る。

こつこつ。

【Linkers&Loaders】7 再配置

この章は、再配置の概要。主に再配置エントリの形式の紹介と再配置の計算方法を取り扱っている。リンカの出力ファイルは、再配置可能や再リンク可能にすることができ、それぞれリンカの出力として再配置用情報や再リンク用情報を含めることになる。

再配置の話題になるとアドレスがいろいろでてくるので、アドレスの計算について自分なりに整理した。

*** アドレスの計算いくつか
- アドレスの計算を簡単にできるようになりたい。
- そこで自分なりにまとめておく。
- 32ビットアーキテクチャでバイトアドレッシングを
想定する。
- するとアドレス空間のサイズは、K->M->G で、4Gであ
り、単一のアドレス空間にて取り扱えるメモリの最大
値は4GB。
- アドレスの2進数表記は32桁、16進数表記は8桁にな
る。
b: 00000000 00000000 00000000 00000000
x: 00 00 00 00

- すると、アドレス0x0から0x100がどれだけのバイト
サイズの領域かというと、16進数で100バイトという
こと。そうか、要は16進<->10進になれておけばいい
んだ。
- 16進と10進

0x00000001 <-> 16^0 = 1
0x00000010 <-> 16^1 = 16
0x00000100 <-> 16^2 = 256
0x00001000 <-> 16^3 = 4096
0x00010000 <-> 16^4 = 65536
0x00100000 <-> 16^5 = 1048567
0x01000000 <-> 16^6 = 16777216
0x10000000 <-> 16^7 = 268435456
0xFFFFFFFF <-> 16^8 - 1 = 4294967295

- 巾をつかった表示

0x00000001 <-> 16^0 = 2^0 = 1
0x00000010 <-> 16^1 = 2^4 = 16
0x00000100 <-> 16^2 = 2^8 = 256
0x00001000 <-> 16^3 = 2^12 = 4K
0x00010000 <-> 16^4 = 2^16 = 64K
0x00100000 <-> 16^5 = 2^20 = 1M
0x01000000 <-> 16^6 = 2^24 = 16M
0x10000000 <-> 16^7 = 2^28 = 256M
0xFFFFFFFF <-> 16^8 - 1 = 2^32 = 4G - 1

- 16進と割合

10進だと100の半分は50だ。では16進では?

0x100の半分は、

1234567 8 9ABCDEF

なので、0x80。そうか8は何かの半分なんだな。

10進とちがって1/4が表現しやすい。

0x100の1/4は、0x40、3/4は、0xC0、などなど。

さて、8は半分なので、32ビットアドレス空間の真ん
中あたりというのは、

0x80000000

ということ。

- 上位16ビットと下位16ビット

さて、アドレスを16で分割する。0x00010000 は64K
なので、上位16ビットは64K単位の領域を指定してい
うことになる。このあたりがセグメントシステムの
計算か。


こつこつ。

【Linkers&Loaders】6 ライブラリ 〜サンプルでみるLinuxのライブラリ(私家版)〜

本書では、ライブラリの構造以外に、作成・検索・weak外部シンボルのお話などがある。
ここでは、Linuxにて、ELFオブジェクトファイルを使ったarライブラリを眺めてみる。


**** サンプルでみるLinuxのライブラリ(私家版)
- まずここでは静的にリンクするライブラリを扱う。
- すると基本的にはarで固めてある。
- /usr/lib/libc.aを対象に調べてみよう。
- まず、ar形式ファイルは"!<arch>\n"で始まる。

lib $ od -tx1 -c -N 8 libc.a
0000000 21 3c 61 72 63 68 3e 0a
! < a r c h > \n
0000010
lib $

- これ以降はarメンバが連なる。arメンバは、基本的
にオブジェクトファイルである。ただしすぐ見るよ
うにライブラリディレクトリ情報が例外として含ま
れる。
- 各arメンバは先頭に60Bのヘッダを持つ。
- Linuxにて、ELFライブラリとしてar形式を使う場合、
第一メンバの名前は"/"であり、ライブラリのディレ
クトリ情報を保持する。ヘッダの最後は、"`\n"とな
る。

lib $ od -tx1 -c -N 68 libc.a
0000000 21 3c 61 72 63 68 3e 0a 2f 20 20 20 20 20 20 20
! < a r c h > \n /
0000020 20 20 20 20 20 20 20 20 31 32 33 33 32 35 31 38
1 2 3 3 2 5 1 8
0000040 31 34 20 20 30 20 20 20 20 20 30 20 20 20 20 20
1 4 0 0
0000060 30 20 20 20 20 20 20 20 35 36 30 37 32 20 20 20
0 5 6 0 7 2
0000100 20 20 60 0a
` \n
0000104
lib $

- このヘッダの構造をみてみると、すべて単なる文字
列となっている。headで見てみる。

lib $ head -c 68 libc.a
!<arch>
/ 1233251814 0 0 0 56072 `
lib $

- これの解釈は次のとおり。

/ 1233251814 0 0 0 56072 `
012345678901234567890123456789012345678901234567890123456789
| | | | | | +--終端の"`\n"
| | | | | +--メンバサイズ[バイト](10B)
| | | | +--8進ファイルモード(8B)
| | | +--グループID(6B)
| | +--ユーザID(6B)
| +--修正日時[1970/1/1T00:00:00からの秒数](12B)
+--メンバ名(16)

- すきまは空白文字(0x20)でパディングされている。
- さて、arのメンバヘッダの形式がこういうものだとす
ると、16文字よりも長い名前をもつ要素はどうする
か。

- これは、"/"メンバの次のメンバとして"//"という名
前のメンバをつくり、そこに格納するルール。調べ
てみる。"/"メンバのサイズは56072Bなので、その後
の60Bが次のメンバのヘッダ。

libc-anatomy $ tail -c +56141 libc.a | head -c 60
// 1712 `
libc-anatomy $

- 1772Bなので、そこまで見てみる。

libc-anatomy $ tail -c +56141 libc.a | head -c 1772
// 1712 `
lc-measurement.o/
lc-identification.o/
C-identification.o/
__start_context.o/
isoc99_vfscanf.o/
isoc99_vsscanf.o/
printf-parsemb.o/
printf-parsewc.o/
thread-freeres.o/
argz-stringify.o/
string-inlines.o/
isoc99_vwscanf.o/
isoc99_fwscanf.o/
isoc99_vfwscanf.o/
isoc99_swscanf.o/
isoc99_vswscanf.o/
lc-time-cleanup.o/
getdirentries64.o/
sched_getaffinity.o/
sched_setaffinity.o/
spawn_faction_init.o/
spawn_faction_destroy.o/
spawn_faction_addclose.o/
spawn_faction_addopen.o/
spawn_faction_adddup2.o/
spawnattr_init.o/
spawnattr_destroy.o/
spawnattr_getdefault.o/
spawnattr_setdefault.o/
spawnattr_getflags.o/
spawnattr_setflags.o/
spawnattr_getpgroup.o/
spawnattr_setpgroup.o/
spawnattr_getsigmask.o/
spawnattr_getschedpolicy.o/
spawnattr_getschedparam.o/
spawnattr_setsigmask.o/
spawnattr_setschedpolicy.o/
spawnattr_setschedparam.o/
sched_cpucount.o/
sched_cpualloc.o/
posix_fadvise64.o/
posix_fallocate.o/
posix_fallocate64.o/
have_o_cloexec.o/
internal_statvfs.o/
internal_statvfs64.o/
sync_file_range.o/
remap_file_pages.o/
get_kernel_syms.o/
inotify_add_watch.o/
inotify_rm_watch.o/
timerfd_create.o/
timerfd_settime.o/
timerfd_gettime.o/
argp-fmtstream.o/
libc-lowlevellock.o/
libc-cancellation.o/
register-atfork.o/
unregister-atfork.o/
libc_pthread_init.o/
libc_multiple_threads.o/
service-lookup.o/
network-lookup.o/
backtracesymsfd.o/
readlinkat_chk.o/
getlogin_r_chk.o/
gethostname_chk.o/
getdomainname_chk.o/
mbsnrtowcs_chk.o/
wcsnrtombs_chk.o/
stack_chk_fail.o/
stack_chk_fail_local.o/
getrpcbynumber.o/
getrpcbyname_r.o/
getrpcbynumber_r.o/
getaliasname_r.o/
getipv4sourcefilter.o/
setipv4sourcefilter.o/
getsourcefilter.o/
setsourcefilter.o/
nscd_initgroups.o/
nscd_getserv_r.o/
dl-iteratephdr.o/
libc-anatomy $

- ふむ。極めてシンプル。


こつこつ。

2009年11月23日月曜日

【Linkers&Loaders】5 シンボルの管理

シンボルという言葉を見ると、「男性のシンボル」云々というネタが条件反射で思い出される。「初めての人のためのLisp」のやつだ。これはもう、竹内先生の呪いといってよいだろう。

本章の内容は、シンプル。

コンパイラが作ったシンボルテーブルを、リンカが2passの中でどのようにリンカ自身のシンボルテーブルを構築しリンクに使うかというお話。

こつこつ。

【Linkers&Loaders】4 記憶領域の割り当て


** 4 記憶領域の割り当て
*** セクション、セグメント、ページ、セグメントシステムのセグメント
- ちょっと用語の整理、というか、ここまでの知識の確認を。
- まず、セクションというのは、オブジェクトファイ
ルの内部構造を指すときに使う。これは「記憶領域
の割り当て」の前の整理と考えてよい。

- 次に、セグメントというのは、メモリ上の内部構造
を指す。セグメント毎に読み書きの設定などを行う。

- セクションとセグメントのマッピングをするのが
「記憶領域の割り当て」の作業のひとつ。前回の例
のように、ひとつのセグメントに複数のセクション
を含むのが基本。

- ページはページングシステムがメモリを取り扱う単
位。なのでページングシステムに対応したシステム
では、セグメントのサイズや配置がページングシス
テムに適合するように調整する。なお、バイト整列
条件への対応はページングシステムか否かに関わ
らずセグメントのアドレス確定の際に実施する。

- 以上のセグメントは、セグメントシステムのセグメ
ントと直接は関係がない。セグメントシステムを利
用する場合は、以上の考え方にセグメトシステム対
応のための調整を合わせこんで実施する。

- セグメントシステムは悪名高いとのことだが、リン
カにとってはそんなに厄介なものではないようだ。
アドレス指定をベースアドレスとオフセットに常に
分けられるので、それを活用すると再配置が簡単に
なるところがあるらしい。

- どうやら記憶領域の割り当ての基本的な考え方は、
この用語の定義レベルの内容でよいようだ。アーキ
テクチャの事情などに起因して特殊ケースがいくつ
か存在する。この章はその説明が主体のようだ。


こつこつ。

【Linkers&Loaders】3 オブジェクトファイル 〜サンプルで見るELFの基本構造(私家版)〜

本書は、COM->EXE->a.out->ELF->PE->OMFと横断的に概要を紹介している。
ここでは、ELFに絞って、本書よりも多少深めに記述する。
サンプルの内部を具体的に調べる形で見ていく。

とても読みにくい、と思うのですが、まあ学習メモなので、、、
そんなものでも誰かの何かに役立つかもしれないので。

こつこつ。



*** サンプルで見るELFの基本構造(私家版)
**** ソース
***** a.c
3.7 $ cat a.c
char a(char *s)
{
return s[0];
}

***** m.c
3.7 $ cat m.c
extern char a(char *);
int main(int ac, char**av)
{
static char string[] = "Hello, world!\en";
a(string);
return 0;
}
3.7 $

**** 再配置可能オブジェクトの構造
***** a.o
3.7 $ readelf -a a.o
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 272 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 64 (bytes)
Number of section headers: 11
Section header string table index: 8

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .text PROGBITS 0000000000000000 00000040
0000000000000011 0000000000000000 AX 0 0 4
[ 2] .data PROGBITS 0000000000000000 00000054
0000000000000000 0000000000000000 WA 0 0 4
[ 3] .bss NOBITS 0000000000000000 00000054
0000000000000000 0000000000000000 WA 0 0 4
[ 4] .eh_frame PROGBITS 0000000000000000 00000058
0000000000000038 0000000000000000 A 0 0 8
[ 5] .rela.eh_frame RELA 0000000000000000 000004b0
0000000000000018 0000000000000018 9 4 8
[ 6] .comment PROGBITS 0000000000000000 00000090
0000000000000025 0000000000000000 0 0 1
[ 7] .note.GNU-stack PROGBITS 0000000000000000 000000b5
0000000000000000 0000000000000000 0 0 1
[ 8] .shstrtab STRTAB 0000000000000000 000000b5
0000000000000054 0000000000000000 0 0 1
[ 9] .symtab SYMTAB 0000000000000000 000003d0
00000000000000d8 0000000000000018 10 8 8
[10] .strtab STRTAB 0000000000000000 000004a8
0000000000000007 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

There are no program headers in this file.

Relocation section '.rela.eh_frame' at offset 0x4b0 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 00020000000a R_X86_64_32 0000000000000000 .text + 0

There are no unwind sections in this file.

Symbol table '.symtab' contains 9 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS a.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 2
4: 0000000000000000 0 SECTION LOCAL DEFAULT 3
5: 0000000000000000 0 SECTION LOCAL DEFAULT 4
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 6
8: 0000000000000000 17 FUNC GLOBAL DEFAULT 1 a

No version information found in this file.

***** m.o
3.7 $ readelf -a m.o
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 296 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 64 (bytes)
Number of section headers: 12
Section header string table index: 9

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .text PROGBITS 0000000000000000 00000040
0000000000000020 0000000000000000 AX 0 0 4
[ 2] .rela.text RELA 0000000000000000 00000548
0000000000000030 0000000000000018 10 1 8
[ 3] .data PROGBITS 0000000000000000 00000060
0000000000000010 0000000000000000 WA 0 0 16
[ 4] .bss NOBITS 0000000000000000 00000070
0000000000000000 0000000000000000 WA 0 0 4
[ 5] .eh_frame PROGBITS 0000000000000000 00000070
0000000000000038 0000000000000000 A 0 0 8
[ 6] .rela.eh_frame RELA 0000000000000000 00000578
0000000000000018 0000000000000018 10 5 8
[ 7] .comment PROGBITS 0000000000000000 000000a8
0000000000000025 0000000000000000 0 0 1
[ 8] .note.GNU-stack PROGBITS 0000000000000000 000000cd
0000000000000000 0000000000000000 0 0 1
[ 9] .shstrtab STRTAB 0000000000000000 000000cd
0000000000000059 0000000000000000 0 0 1
[10] .symtab SYMTAB 0000000000000000 00000428
0000000000000108 0000000000000018 11 9 8
[11] .strtab STRTAB 0000000000000000 00000530
0000000000000018 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

There are no program headers in this file.

Relocation section '.rela.text' at offset 0x548 contains 2 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000010 00030000000a R_X86_64_32 0000000000000000 .data + 0
000000000015 000a00000002 R_X86_64_PC32 0000000000000000 a + fffffffffffffffc

Relocation section '.rela.eh_frame' at offset 0x578 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 00020000000a R_X86_64_32 0000000000000000 .text + 0

There are no unwind sections in this file.

Symbol table '.symtab' contains 11 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS m.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
5: 0000000000000000 16 OBJECT LOCAL DEFAULT 3 string.1551
6: 0000000000000000 0 SECTION LOCAL DEFAULT 5
7: 0000000000000000 0 SECTION LOCAL DEFAULT 8
8: 0000000000000000 0 SECTION LOCAL DEFAULT 7
9: 0000000000000000 32 FUNC GLOBAL DEFAULT 1 main
10: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND a

No version information found in this file.
3.7 $

***** a.oの解説

3.7 $ readelf -a a.o
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00

char magic[4] = "\177ELF"
#o177は制御記号のdel。
(format "%x" (print ?E))
; => "45"
(format "%x" (print ?L))
; => "4c"
(format "%x" (print ?F))
; => "46"


Class: ELF64

アドレスのサイズ


Data: 2's complement, little endian

バイトオーダ他。


Version: 1 (current)

ELFのバージョン。固定らしい。


OS/ABI: UNIX - System V

ELFOSABI_LINUXの運用はまちまち。


ABI Version: 0

文字通り。

Type: REL (Relocatable file)

ELFのタイプ。

Machine: Advanced Micro Devices X86-64

Version: 0x1

Entry point address: 0x0

エントリーポイント。実行可能ファイル以外は0。


Start of program headers: 0 (bytes into file)

開始位置。


Start of section headers: 272 (bytes into file)

開始位置。


Flags: 0x0

アーキテクチャ固有フラグ。通常は0。


Size of this header: 64 (bytes)

このELFヘッダのサイズ。


Size of program headers: 0 (bytes)

プログラムヘッダのエントリひとつのサイズ。


Number of program headers: 0

Size of section headers: 64 (bytes)

セクションヘッダのエントリひとつのサイズ。


Number of section headers: 11
Section header string table index: 8

セクション名文字列を格納しているセクションの番号。


Section Headers:

ELFファイルの内部構造は2つのViewをもつ。
Section Viewはそのひとつ。
Section HeadersはSection Viewの構造を記述する。


[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align

Nr : 文字列テーブルにおける名前のインデックス。
Name : Nrを名前解決したもの。
Type : セクションタイプ。セクション内に格納する
情報によって分類。
NULL: 0
このセクションヘッダはinactive。対応するセクショ
ンは存在しない。
PROGBITS: 1
プログラムの内容を含むもの。コード、データ、デ
バッガ情報等。
SYMTAB: 2
シンボルテーブル。
STRTAB: 3
文字列テーブル。
RELA: 4
再配置情報。ベース値自体をこのセクションに含む
方式。
HASH: 5
実行時のシンボルハッシュテーブル。
DYNAMIC: 6
動的リンク情報。
NOTE: 7
NOBITS: 8
対応するセクションは存在しないが、それ以外は、
PROGBITS:と同じ。BSSにつかう。
REL: 9
再配置情報。コードに記述されている値をベース値
とする方式。
SHLIB: 10
予約されているが、意味が未確定。現状では、これ
がELFファイルに存在するなら、そのELFファイルは
System V ABIのConformance violationとなる。
DYNSYM: 11
動的リンク用のシンボル。
LOPROC: 0x70000000
processor固有情報の開始位置。processor固有情報
として何を記述するかというSemanticsはSysV ABIの
プロセッサ補遺で定義。
HIPROC: 0x7fffffff
processor固有情報の終了位置。
LOUSER: 0x80000000
application固有情報の開始位置。application固有
情報として何を記述するかというSematicsは個別に
定めてよい。
HIUSER: 0xffffffff
application固有情報の終了位置。

Address : lodableファイルの場合は、ベースアドレス。
それ以外は0。
Offset : セクションの先頭のファイル内の位置。
Size : セクションのサイズ(Byte)。
EntSize : セクションが配列の場合のエントリのサイズ
(Byte)。
Flags : フラグビット。ロード関係の情報。
SHF_WRITE (0x1)
このセクションを、実行時に、メモリ上で書き込み可能とする。
SHF_ALLOC (0x2)
このセクションを、実行時にメモリ上に配置する。
SHF_EXECINSTR (0x4)
このセクションは、実行可能なマシン語を含む。
SHF_MASKPROC (0xf0000000)
このマスクに含まれているビットは、processor固有
情報となる。processor補遺で定義する。

Link : 関連する情報を持つセクション。関連が無い
場合は、0。
Info : セクション固有の情報
Align : セクションを移動する場合の整列の粒度


[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0

セクションヘッダの先頭に置くセクションはNULLと決まっ
ている。

[ 1] .text PROGBITS 0000000000000000 00000040
0000000000000011 0000000000000000 AX 0 0 4

a.outのテキストセクション相当。

[ 2] .data PROGBITS 0000000000000000 00000054
0000000000000000 0000000000000000 WA 0 0 4

a.outのデータセクション相当。

[ 3] .bss NOBITS 0000000000000000 00000054
0000000000000000 0000000000000000 WA 0 0 4

a.outのBSSセクション相当。

[ 4] .eh_frame PROGBITS 0000000000000000 00000058
0000000000000038 0000000000000000 A 0 0 8

GCC拡張セクション?
例外が発生したときのアンワインドに関する情報を保持。

[ 5] .rela.eh_frame RELA 0000000000000000 000004b0
0000000000000018 0000000000000018 9 4 8

.relaNAMEは、NAMEセクションに対する再配置情報。

[ 6] .comment PROGBITS 0000000000000000 00000090
0000000000000025 0000000000000000 0 0 1

説明文字列用。

[ 7] .note.GNU-stack PROGBITS 0000000000000000 000000b5
0000000000000000 0000000000000000 0 0 1

.noteセクションは、処理系が独自に情報を保持すると
きに使う。この有無や内容は、ABIコンフォーマンスと
は無関係。

[ 8] .shstrtab STRTAB 0000000000000000 000000b5
0000000000000054 0000000000000000 0 0 1

セクション名用文字列を保持。

[ 9] .symtab SYMTAB 0000000000000000 000003d0
00000000000000d8 0000000000000018 10 8 8

シンボルテーブル。

[10] .strtab STRTAB 0000000000000000 000004a8
0000000000000007 0000000000000000 0 0 1

シンボルテーブル用文字列を保持。他のもの用の文字列
を含むこともあり。


Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

There are no program headers in this file.

まだ.oファイルだからか、プログラムヘッダは存在しな
い。

Relocation section '.rela.eh_frame' at offset 0x4b0 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 00020000000a R_X86_64_32 0000000000000000 .text + 0

再配置セクションについては後述。

There are no unwind sections in this file.

Symbol table '.symtab' contains 9 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS a.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 2
4: 0000000000000000 0 SECTION LOCAL DEFAULT 3
5: 0000000000000000 0 SECTION LOCAL DEFAULT 4
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 6
8: 0000000000000000 17 FUNC GLOBAL DEFAULT 1 a

これはELFのシンボルテーブルの中身。

- Value : シンボルの値
- Type : データ、関数、セクションシンボル、ファイ
ル他。
- Bind : local, global、weak他。
- Vis : 不明。
- Ndx : このシンボルが定義されているセクション番号。
またはABS、COMMONまたはUNDEF。
- Name : これは実際は、文字列テーブルの番号が入っ
ている。ここではその番号から引き当てた文字列を
表示している。


No version information found in this file.

***** m.oの解説
a.oとほぼ同じなので割愛。

***** 再配置セクションについて
- a.oの場合。

Relocation section '.rela.eh_frame' at offset 0x4b0 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 00020000000a R_X86_64_32 0000000000000000 .text + 0

- m.oの場合。

Relocation section '.rela.text' at offset 0x548 contains 2 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000010 00030000000a R_X86_64_32 0000000000000000 .data + 0
000000000015 000a00000002 R_X86_64_PC32 0000000000000000 a + fffffffffffffffc

Relocation section '.rela.eh_frame' at offset 0x578 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 00020000000a R_X86_64_32 0000000000000000 .text + 0


- RELAの構造

r_offset :
- 再配置可能ファイルでは、セクション相対にて再配置
が必要な位置。
- 実行可能ファイルでは、仮想アドレス上の位置。

r_info :

2つを含む。
- シンボルテーブルのインデックス番号。このエントリ
が再配置情報を提供しているシンボルを特定する。
- 再配置のタイプ

r_append :
- 再配置フィールドの値の算出に使用する定数。

**** 再配置可能オブジェクトのセクションの内容
***** a.oの全てのセクション
3.7 $ objdump -s a.o

a.o: file format elf64-x86-64

Contents of section .text:
0000 554889e5 48897df8 488b45f8 0fb600c9 UH..H.}.H.E.....
0010 c3 .
Contents of section .eh_frame:
0000 14000000 00000000 017a5200 01781001 .........zR..x..
0010 030c0708 90010000 1c000000 1c000000 ................
0020 00000000 11000000 00410e10 8602430d .........A....C.
0030 06000000 00000000 ........
Contents of section .comment:
0000 00474343 3a202855 62756e74 7520342e .GCC: (Ubuntu 4.
0010 332e322d 31756275 6e747531 32292034 3.2-1ubuntu12) 4
0020 2e332e32 00 .3.2.

***** m.oの全てのセクション
3.7 $ objdump -s m.o

m.o: file format elf64-x86-64

Contents of section .text:
0000 554889e5 4883ec10 897dfc48 8975f0bf UH..H....}.H.u..
0010 00000000 e8000000 00b80000 0000c9c3 ................
Contents of section .data:
0000 48656c6c 6f2c2077 6f726c64 211b6e00 Hello, world!.n.
Contents of section .eh_frame:
0000 14000000 00000000 017a5200 01781001 .........zR..x..
0010 030c0708 90010000 1c000000 1c000000 ................
0020 00000000 20000000 00410e10 8602430d .... ....A....C.
0030 06000000 00000000 ........
Contents of section .comment:
0000 00474343 3a202855 62756e74 7520342e .GCC: (Ubuntu 4.
0010 332e322d 31756275 6e747531 32292034 3.2-1ubuntu12) 4
0020 2e332e32 00 .3.2.

***** a.oの.text
3.7 $ objdump -d a.o

a.o: file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <a>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 89 7d f8 mov %rdi,-0x8(%rbp)
8: 48 8b 45 f8 mov -0x8(%rbp),%rax
c: 0f b6 00 movzbl (%rax),%eax
f: c9 leaveq
10: c3 retq
3.7 $

***** m.oの.text
3.7 $ objdump -d m.o

m.o: file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
8: 89 7d fc mov %edi,-0x4(%rbp)
b: 48 89 75 f0 mov %rsi,-0x10(%rbp)
f: bf 00 00 00 00 mov $0x0,%edi
14: e8 00 00 00 00 callq 19 <main+0x19>
19: b8 00 00 00 00 mov $0x0,%eax
1e: c9 leaveq
1f: c3 retq
3.7 $

**** 実行可能ファイルの構造
***** a.outの構造
3.7 $ readelf -a a.out
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x4003c0
Start of program headers: 64 (bytes into file)
Start of section headers: 6208 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 37
Section header string table index: 34

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .hash HASH 0000000000400278 00000278
0000000000000018 0000000000000004 A 5 0 8
[ 4] .gnu.hash GNU_HASH 0000000000400290 00000290
000000000000001c 0000000000000000 A 5 0 8
[ 5] .dynsym DYNSYM 00000000004002b0 000002b0
0000000000000048 0000000000000018 A 6 1 8
[ 6] .dynstr STRTAB 00000000004002f8 000002f8
0000000000000038 0000000000000000 A 0 0 1
[ 7] .gnu.version VERSYM 0000000000400330 00000330
0000000000000006 0000000000000002 A 5 0 2
[ 8] .gnu.version_r VERNEED 0000000000400338 00000338
0000000000000020 0000000000000000 A 6 1 8
[ 9] .rela.dyn RELA 0000000000400358 00000358
0000000000000018 0000000000000018 A 5 0 8
[10] .rela.plt RELA 0000000000400370 00000370
0000000000000018 0000000000000018 A 5 12 8
[11] .init PROGBITS 0000000000400388 00000388
0000000000000018 0000000000000000 AX 0 0 4
[12] .plt PROGBITS 00000000004003a0 000003a0
0000000000000020 0000000000000010 AX 0 0 4
[13] .text PROGBITS 00000000004003c0 000003c0
00000000000001f8 0000000000000000 AX 0 0 16
[14] .fini PROGBITS 00000000004005b8 000005b8
000000000000000e 0000000000000000 AX 0 0 4
[15] .rodata PROGBITS 00000000004005c8 000005c8
0000000000000004 0000000000000004 AM 0 0 4
[16] .eh_frame_hdr PROGBITS 00000000004005cc 000005cc
000000000000002c 0000000000000000 A 0 0 4
[17] .eh_frame PROGBITS 00000000004005f8 000005f8
00000000000000b4 0000000000000000 A 0 0 8
[18] .ctors PROGBITS 0000000000600e18 00000e18
0000000000000010 0000000000000000 WA 0 0 8
[19] .dtors PROGBITS 0000000000600e28 00000e28
0000000000000010 0000000000000000 WA 0 0 8
[20] .jcr PROGBITS 0000000000600e38 00000e38
0000000000000008 0000000000000000 WA 0 0 8
[21] .dynamic DYNAMIC 0000000000600e40 00000e40
00000000000001a0 0000000000000010 WA 6 0 8
[22] .got PROGBITS 0000000000600fe0 00000fe0
0000000000000008 0000000000000008 WA 0 0 8
[23] .got.plt PROGBITS 0000000000600fe8 00000fe8
0000000000000020 0000000000000008 WA 0 0 8
[24] .data PROGBITS 0000000000601010 00001010
0000000000000020 0000000000000000 WA 0 0 16
[25] .bss NOBITS 0000000000601030 00001030
0000000000000010 0000000000000000 WA 0 0 8
[26] .comment PROGBITS 0000000000000000 00001030
0000000000000128 0000000000000000 0 0 1
[27] .debug_aranges PROGBITS 0000000000000000 00001160
0000000000000090 0000000000000000 0 0 16
[28] .debug_pubnames PROGBITS 0000000000000000 000011f0
0000000000000025 0000000000000000 0 0 1
[29] .debug_info PROGBITS 0000000000000000 00001215
00000000000001d7 0000000000000000 0 0 1
[30] .debug_abbrev PROGBITS 0000000000000000 000013ec
000000000000006f 0000000000000000 0 0 1
[31] .debug_line PROGBITS 0000000000000000 0000145b
0000000000000151 0000000000000000 0 0 1
[32] .debug_str PROGBITS 0000000000000000 000015ac
00000000000000a7 0000000000000001 MS 0 0 1
[33] .debug_ranges PROGBITS 0000000000000000 00001660
0000000000000090 0000000000000000 0 0 16
[34] .shstrtab STRTAB 0000000000000000 000016f0
0000000000000149 0000000000000000 0 0 1
[35] .symtab SYMTAB 0000000000000000 00002180
0000000000000720 0000000000000018 36 58 8
[36] .strtab STRTAB 0000000000000000 000028a0
00000000000001ff 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x00000000000006ac 0x00000000000006ac R E 200000
LOAD 0x0000000000000e18 0x0000000000600e18 0x0000000000600e18
0x0000000000000218 0x0000000000000228 RW 200000
DYNAMIC 0x0000000000000e40 0x0000000000600e40 0x0000000000600e40
0x00000000000001a0 0x00000000000001a0 RW 8
NOTE 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000020 0x0000000000000020 R 4
GNU_EH_FRAME 0x00000000000005cc 0x00000000004005cc 0x00000000004005cc
0x000000000000002c 0x000000000000002c R 4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 8
GNU_RELRO 0x0000000000000e18 0x0000000000600e18 0x0000000000600e18
0x00000000000001e8 0x00000000000001e8 R 1

Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag
06 .eh_frame_hdr
07
08 .ctors .dtors .jcr .dynamic .got

Dynamic section at offset 0xe40 contains 21 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000c (INIT) 0x400388
0x000000000000000d (FINI) 0x4005b8
0x0000000000000004 (HASH) 0x400278
0x000000006ffffef5 (GNU_HASH) 0x400290
0x0000000000000005 (STRTAB) 0x4002f8
0x0000000000000006 (SYMTAB) 0x4002b0
0x000000000000000a (STRSZ) 56 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x600fe8
0x0000000000000002 (PLTRELSZ) 24 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x400370
0x0000000000000007 (RELA) 0x400358
0x0000000000000008 (RELASZ) 24 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x400338
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0x400330
0x0000000000000000 (NULL) 0x0

Relocation section '.rela.dyn' at offset 0x358 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000600fe0 000100000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0

Relocation section '.rela.plt' at offset 0x370 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000601000 000200000007 R_X86_64_JUMP_SLO 0000000000000000 __libc_start_main + 0

There are no unwind sections in this file.

Version symbols section '.gnu.version' contains 3 entries:
Addr: 0000000000400330 Offset: 0x000330 Link: 5 (.dynsym)
000: 0 (*local*) 0 (*local*) 2 (GLIBC_2.2.5)

Version needs section '.gnu.version_r' contains 1 entries:
Addr: 0x0000000000400338 Offset: 0x000338 Link: 6 (.dynstr)
000000: Version: 1 File: libc.so.6 Cnt: 1
0x0010: Name: GLIBC_2.2.5 Flags: none Version: 2

Notes at offset 0x00000254 with length 0x00000020:
Owner Data size Description
GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
3.7 $

***** a.outの構造の解説
再配置可能オブジェクトとの差異を中心にコメントする。


ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)

実行可能ファイルであることを示す。

Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x4003c0
Start of program headers: 64 (bytes into file)

再配置可能オブジェクトと異り、プログラムヘッダが存
在する。

Start of section headers: 6208 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 37
Section header string table index: 34

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1

プログラムインタプリタのパスを含む。

[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4

ABI-tagが何を意味するかはGCCまたはLinuxの調査が必
要。

[ 3] .hash HASH 0000000000400278 00000278
0000000000000018 0000000000000004 A 5 0 8

シンボルハッシュテーブル。

[ 4] .gnu.hash GNU_HASH 0000000000400290 00000290
000000000000001c 0000000000000000 A 5 0 8

GCC拡張?

[ 5] .dynsym DYNSYM 00000000004002b0 000002b0
0000000000000048 0000000000000018 A 6 1 8

動的リンクのためのシンボルテーブル。

[ 6] .dynstr STRTAB 00000000004002f8 000002f8
0000000000000038 0000000000000000 A 0 0 1

.dynsymのための文字列テーブル。主にシンボル文字列
を含む。

[ 7] .gnu.version VERSYM 0000000000400330 00000330
0000000000000006 0000000000000002 A 5 0 2

GCC拡張?

[ 8] .gnu.version_r VERNEED 0000000000400338 00000338
0000000000000020 0000000000000000 A 6 1 8

GCC拡張?

[ 9] .rela.dyn RELA 0000000000400358 00000358
0000000000000018 0000000000000018 A 5 0 8

.dynのための再配置情報。

[10] .rela.plt RELA 0000000000400370 00000370
0000000000000018 0000000000000018 A 5 12 8

.pltのための再配置情報。

[11] .init PROGBITS 0000000000400388 00000388
0000000000000018 0000000000000000 AX 0 0 4

mainプログラムのまえに呼ぶコード。

[12] .plt PROGBITS 00000000004003a0 000003a0
0000000000000020 0000000000000010 AX 0 0 4

procedure linkage table (手続きリンクテーブル)。

[13] .text PROGBITS 00000000004003c0 000003c0
00000000000001f8 0000000000000000 AX 0 0 16
[14] .fini PROGBITS 00000000004005b8 000005b8
000000000000000e 0000000000000000 AX 0 0 4

process termination codeの後で実行されるコード。

[15] .rodata PROGBITS 00000000004005c8 000005c8
0000000000000004 0000000000000004 AM 0 0 4

読み出し専用データを含む.

[16] .eh_frame_hdr PROGBITS 00000000004005cc 000005cc
000000000000002c 0000000000000000 A 0 0 4

GCC拡張?

[17] .eh_frame PROGBITS 00000000004005f8 000005f8
00000000000000b4 0000000000000000 A 0 0 8
[18] .ctors PROGBITS 0000000000600e18 00000e18
0000000000000010 0000000000000000 WA 0 0 8

GCC拡張?

[19] .dtors PROGBITS 0000000000600e28 00000e28
0000000000000010 0000000000000000 WA 0 0 8

GCC拡張?

[20] .jcr PROGBITS 0000000000600e38 00000e38
0000000000000008 0000000000000000 WA 0 0 8

GCC拡張?

[21] .dynamic DYNAMIC 0000000000600e40 00000e40
00000000000001a0 0000000000000010 WA 6 0 8

動的リンク情報。

[22] .got PROGBITS 0000000000600fe0 00000fe0
0000000000000008 0000000000000008 WA 0 0 8

global offset table。

[23] .got.plt PROGBITS 0000000000600fe8 00000fe8
0000000000000020 0000000000000008 WA 0 0 8

GCC拡張?

[24] .data PROGBITS 0000000000601010 00001010
0000000000000020 0000000000000000 WA 0 0 16
[25] .bss NOBITS 0000000000601030 00001030
0000000000000010 0000000000000000 WA 0 0 8
[26] .comment PROGBITS 0000000000000000 00001030
0000000000000128 0000000000000000 0 0 1
[27] .debug_aranges PROGBITS 0000000000000000 00001160
0000000000000090 0000000000000000 0 0 16

GCC拡張?DWARF拡張?

[28] .debug_pubnames PROGBITS 0000000000000000 000011f0
0000000000000025 0000000000000000 0 0 1

GCC拡張?DWARF拡張?

[29] .debug_info PROGBITS 0000000000000000 00001215
00000000000001d7 0000000000000000 0 0 1

GCC拡張?DWARF拡張?

[30] .debug_abbrev PROGBITS 0000000000000000 000013ec
000000000000006f 0000000000000000 0 0 1

GCC拡張?DWARF拡張?

[31] .debug_line PROGBITS 0000000000000000 0000145b
0000000000000151 0000000000000000 0 0 1

GCC拡張?DWARF拡張?

[32] .debug_str PROGBITS 0000000000000000 000015ac
00000000000000a7 0000000000000001 MS 0 0 1

GCC拡張?DWARF拡張?

[33] .debug_ranges PROGBITS 0000000000000000 00001660
0000000000000090 0000000000000000 0 0 16

GCC拡張?DWARF拡張?

[34] .shstrtab STRTAB 0000000000000000 000016f0
0000000000000149 0000000000000000 0 0 1
[35] .symtab SYMTAB 0000000000000000 00002180
0000000000000720 0000000000000018 36 58 8
[36] .strtab STRTAB 0000000000000000 000028a0
00000000000001ff 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:

プログラムヘッダは、ファイルの内部構造をメモリ上の
イメージにもっていくための中心的情報である。


Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align

フィールドの意味は次のとおり。

p_type :

各ヘッダエントリのタイプを表す。

PT_NULL (0)

このエントリは使われていないことを示す。

PT_LOAD (1)

loadableセグメント。

PT_DYNAMIC (2)

このエントリは、動的リンクに関する情報を保持する。

PT_INTERP (3)

このエントリは、インタプルタのパスを保持する。

PT_NOTE (4)

このエントリは、追加情報を保持する。

PT_SHLIB (5)

これはまだ運用されていない。

PT_PHDR (6)

プログラムヘッダの位置自身を示す。

PT_LOPROC (0x70000000)

プロセッサ固有のフラグ領域の開始位置。

PT_HIPROC (0x7fffffff)

プロセッサ固有のフラグ領域の終了位置。

p_offset :
セグメントの先頭バイトの位置(ファイル先頭からバイト
で測る)

p_vaddr :

セグメントの先頭バイトの位置(仮想アドレス上におい
て)

p_paddr :

セグメントの先頭バイトの位置(物理アドレス上におい
て)。物理アドレスに配置するシステム用。

p_filesz :

ファイル上における該当セグメントのサイズ。

p_memsz :

メモリ上における該当セグメントのサイズ。

p_flags :

PF_X
Execute
PF_W
Write
PF_R
Read
PF_MASKPROC
undefined (processor specific)

p_align :

ページ整列のための情報。

さて各ヘッダエントリ。

Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8


INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]


LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x00000000000006ac 0x00000000000006ac R E 200000


LOAD 0x0000000000000e18 0x0000000000600e18 0x0000000000600e18
0x0000000000000218 0x0000000000000228 RW 200000


DYNAMIC 0x0000000000000e40 0x0000000000600e40 0x0000000000600e40
0x00000000000001a0 0x00000000000001a0 RW 8


NOTE 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000020 0x0000000000000020 R 4


GNU_EH_FRAME 0x00000000000005cc 0x00000000004005cc 0x00000000004005cc
0x000000000000002c 0x000000000000002c R 4


GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 8


GNU_RELRO 0x0000000000000e18 0x0000000000600e18 0x0000000000600e18
0x00000000000001e8 0x00000000000001e8 R 1

Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag
06 .eh_frame_hdr
07
08 .ctors .dtors .jcr .dynamic .got

このマッピングは、ヘッダが明示的に保持しているので
はなく、Section ViewとProgram Viewを重ねあわせて、
readelfが構成しているのだと思う。

Dynamic section at offset 0xe40 contains 21 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000c (INIT) 0x400388
0x000000000000000d (FINI) 0x4005b8
0x0000000000000004 (HASH) 0x400278
0x000000006ffffef5 (GNU_HASH) 0x400290
0x0000000000000005 (STRTAB) 0x4002f8
0x0000000000000006 (SYMTAB) 0x4002b0
0x000000000000000a (STRSZ) 56 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x600fe8
0x0000000000000002 (PLTRELSZ) 24 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x400370
0x0000000000000007 (RELA) 0x400358
0x0000000000000008 (RELASZ) 24 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x400338
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0x400330
0x0000000000000000 (NULL) 0x0


動的リンクは先の話題なので割愛。


Relocation section '.rela.dyn' at offset 0x358 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000600fe0 000100000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0

Relocation section '.rela.plt' at offset 0x370 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000601000 000200000007 R_X86_64_JUMP_SLO 0000000000000000 __libc_start_main + 0

There are no unwind sections in this file.

Version symbols section '.gnu.version' contains 3 entries:
Addr: 0000000000400330 Offset: 0x000330 Link: 5 (.dynsym)
000: 0 (*local*) 0 (*local*) 2 (GLIBC_2.2.5)

Version needs section '.gnu.version_r' contains 1 entries:
Addr: 0x0000000000400338 Offset: 0x000338 Link: 6 (.dynstr)
000000: Version: 1 File: libc.so.6 Cnt: 1
0x0010: Name: GLIBC_2.2.5 Flags: none Version: 2

Notes at offset 0x00000254 with length 0x00000020:
Owner Data size Description
GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
3.7 $

***** a.outのセクション全て
3.7 $ objdump -s a.out

a.out: file format elf64-x86-64

Contents of section .interp:
400238 2f6c6962 36342f6c 642d6c69 6e75782d /lib64/ld-linux-
400248 7838362d 36342e73 6f2e3200 x86-64.so.2.
Contents of section .note.ABI-tag:
400254 04000000 10000000 01000000 474e5500 ............GNU.
400264 00000000 02000000 06000000 08000000 ................
Contents of section .hash:
400278 01000000 03000000 02000000 00000000 ................
400288 00000000 01000000 ........
Contents of section .gnu.hash:
400290 01000000 01000000 01000000 00000000 ................
4002a0 00000000 00000000 00000000 ............
Contents of section .dynsym:
4002b0 00000000 00000000 00000000 00000000 ................
4002c0 00000000 00000000 01000000 20000000 ............ ...
4002d0 00000000 00000000 00000000 00000000 ................
4002e0 1a000000 12000000 00000000 00000000 ................
4002f0 00000000 00000000 ........
Contents of section .dynstr:
4002f8 005f5f67 6d6f6e5f 73746172 745f5f00 .__gmon_start__.
400308 6c696263 2e736f2e 36005f5f 6c696263 libc.so.6.__libc
400318 5f737461 72745f6d 61696e00 474c4942 _start_main.GLIB
400328 435f322e 322e3500 C_2.2.5.
Contents of section .gnu.version:
400330 00000000 0200 ......
Contents of section .gnu.version_r:
400338 01000100 10000000 10000000 00000000 ................
400348 751a6909 00000200 2c000000 00000000 u.i.....,.......
Contents of section .rela.dyn:
400358 e00f6000 00000000 06000000 01000000 ..`.............
400368 00000000 00000000 ........
Contents of section .rela.plt:
400370 00106000 00000000 07000000 02000000 ..`.............
400380 00000000 00000000 ........
Contents of section .init:
400388 4883ec08 e85b0000 00e8ea00 0000e8e5 H....[..........
400398 01000048 83c408c3 ...H....
Contents of section .plt:
4003a0 ff354a0c 2000ff25 4c0c2000 0f1f4000 .5J. ..%L. ...@.
4003b0 ff254a0c 20006800 000000e9 e0ffffff .%J. .h.........
Contents of section .text:
4003c0 31ed4989 d15e4889 e24883e4 f0505449 1.I..^H..H...PTI
4003d0 c7c0e004 400048c7 c1f00440 0048c7c7 ....@.H....@.H..
4003e0 c0044000 e8c7ffff fff49090 4883ec08 ..@.........H...
4003f0 488b05e9 0b200048 85c07402 ffd04883 H.... .H..t...H.
400400 c408c390 90909090 90909090 90909090 ................
400410 554889e5 534883ec 08803d10 0c200000 UH..SH....=.. ..
400420 754bb830 0e600048 8b150a0c 2000482d uK.0.`.H.... .H-
400430 280e6000 48c1f803 488d58ff 4839da73 (.`.H...H.X.H9.s
400440 250f1f80 00000000 488d4201 488905e5 %.......H.B.H...
400450 0b2000ff 14c5280e 6000488b 15d70b20 . ....(.`.H....
400460 004839da 72e2c605 c30b2000 014883c4 .H9.r..... ..H..
400470 085bc9c3 6666662e 0f1f8400 00000000 .[..fff.........
400480 5548833d af092000 004889e5 741ab800 UH.=.. ..H..t...
400490 00000048 85c07410 bf380e60 004989c3 ...H..t..8.`.I..
4004a0 c941ffe3 0f1f4000 c9c39090 554889e5 .A....@.....UH..
4004b0 48897df8 488b45f8 0fb600c9 c3909090 H.}.H.E.........
4004c0 554889e5 4883ec10 897dfc48 8975f0bf UH..H....}.H.u..
4004d0 20106000 e8d3ffff ffb80000 0000c9c3 .`.............
4004e0 f3c36666 6666662e 0f1f8400 00000000 ..fffff.........
4004f0 48896c24 d84c897c 24f8488d 2d130920 H.l$.L.|$.H.-..
400500 004c8d3d 0c092000 4c896424 e04c896c .L.=.. .L.d$.L.l
400510 24e84c89 7424f048 895c24d0 4883ec38 $.L.t$.H.\$.H..8
400520 4c29fd41 89fe4989 f548c1fd 034989d4 L).A..I..H...I..
400530 e853feff ff4885ed 741c31db 0f1f4000 .S...H..t.1...@.
400540 4c89e24c 89ee4489 f741ff14 df4883c3 L..L..D..A...H..
400550 014839eb 72ea488b 5c240848 8b6c2410 .H9.r.H.\$.H.l$.
400560 4c8b6424 184c8b6c 24204c8b 7424284c L.d$.L.l$ L.t$(L
400570 8b7c2430 4883c438 c3909090 90909090 .|$0H..8........
400580 554889e5 534883ec 08488b05 88082000 UH..SH...H.... .
400590 4883f8ff 7419bb18 0e60000f 1f440000 H...t....`...D..
4005a0 4883eb08 ffd0488b 034883f8 ff75f148 H.....H..H...u.H
4005b0 83c4085b c9c39090 ...[....
Contents of section .fini:
4005b8 4883ec08 e84ffeff ff4883c4 08c3 H....O...H....
Contents of section .rodata:
4005c8 01000200 ....
Contents of section .eh_frame_hdr:
4005cc 011b033b 28000000 04000000 e0feffff ...;(...........
4005dc 44000000 f4feffff 64000000 14ffffff D.......d.......
4005ec 9c000000 24ffffff b4000000 ....$.......
Contents of section .eh_frame:
4005f8 14000000 00000000 017a5200 01781001 .........zR..x..
400608 030c0708 90010000 1c000000 1c000000 ................
400618 ac044000 11000000 00410e10 8602430d ..@......A....C.
400628 06000000 00000000 1c000000 3c000000 ............<...
400638 c0044000 20000000 00410e10 8602430d ..@. ....A....C.
400648 06000000 00000000 14000000 00000000 ................
400658 017a5200 01781001 1b0c0708 90010000 .zR..x..........
400668 14000000 1c000000 70feffff 02000000 ........p.......
400678 00000000 00000000 24000000 34000000 ........$...4...
400688 68feffff 89000000 004a8f02 8606660e h........J....f.
400698 4083078e 038d048c 05000000 00000000 @...............
4006a8 00000000 ....
Contents of section .ctors:
600e18 ffffffff ffffffff 00000000 00000000 ................
Contents of section .dtors:
600e28 ffffffff ffffffff 00000000 00000000 ................
Contents of section .jcr:
600e38 00000000 00000000 ........
Contents of section .dynamic:
600e40 01000000 00000000 10000000 00000000 ................
600e50 0c000000 00000000 88034000 00000000 ..........@.....
600e60 0d000000 00000000 b8054000 00000000 ..........@.....
600e70 04000000 00000000 78024000 00000000 ........x.@.....
600e80 f5feff6f 00000000 90024000 00000000 ...o......@.....
600e90 05000000 00000000 f8024000 00000000 ..........@.....
600ea0 06000000 00000000 b0024000 00000000 ..........@.....
600eb0 0a000000 00000000 38000000 00000000 ........8.......
600ec0 0b000000 00000000 18000000 00000000 ................
600ed0 15000000 00000000 00000000 00000000 ................
600ee0 03000000 00000000 e80f6000 00000000 ..........`.....
600ef0 02000000 00000000 18000000 00000000 ................
600f00 14000000 00000000 07000000 00000000 ................
600f10 17000000 00000000 70034000 00000000 ........p.@.....
600f20 07000000 00000000 58034000 00000000 ........X.@.....
600f30 08000000 00000000 18000000 00000000 ................
600f40 09000000 00000000 18000000 00000000 ................
600f50 feffff6f 00000000 38034000 00000000 ...o....8.@.....
600f60 ffffff6f 00000000 01000000 00000000 ...o............
600f70 f0ffff6f 00000000 30034000 00000000 ...o....0.@.....
600f80 00000000 00000000 00000000 00000000 ................
600f90 00000000 00000000 00000000 00000000 ................
600fa0 00000000 00000000 00000000 00000000 ................
600fb0 00000000 00000000 00000000 00000000 ................
600fc0 00000000 00000000 00000000 00000000 ................
600fd0 00000000 00000000 00000000 00000000 ................
Contents of section .got:
600fe0 00000000 00000000 ........
Contents of section .got.plt:
600fe8 400e6000 00000000 00000000 00000000 @.`.............
600ff8 00000000 00000000 b6034000 00000000 ..........@.....
Contents of section .data:
601010 00000000 00000000 00000000 00000000 ................
601020 48656c6c 6f2c2077 6f726c64 211b6e00 Hello, world!.n.
Contents of section .comment:
0000 00474343 3a202855 62756e74 7520342e .GCC: (Ubuntu 4.
0010 332e322d 31756275 6e747531 32292034 3.2-1ubuntu12) 4
0020 2e332e32 00004743 433a2028 5562756e .3.2..GCC: (Ubun
0030 74752034 2e332e32 2d317562 756e7475 tu 4.3.2-1ubuntu
0040 31322920 342e332e 32000047 43433a20 12) 4.3.2..GCC:
0050 28556275 6e747520 342e332e 322d3175 (Ubuntu 4.3.2-1u
0060 62756e74 75313229 20342e33 2e320000 buntu12) 4.3.2..
0070 4743433a 20285562 756e7475 20342e33 GCC: (Ubuntu 4.3
0080 2e322d31 7562756e 74753132 2920342e .2-1ubuntu12) 4.
0090 332e3200 00474343 3a202855 62756e74 3.2..GCC: (Ubunt
00a0 7520342e 332e322d 31756275 6e747531 u 4.3.2-1ubuntu1
00b0 32292034 2e332e32 00004743 433a2028 2) 4.3.2..GCC: (
00c0 5562756e 74752034 2e332e32 2d317562 Ubuntu 4.3.2-1ub
00d0 756e7475 31322920 342e332e 32000047 untu12) 4.3.2..G
00e0 43433a20 28556275 6e747520 342e332e CC: (Ubuntu 4.3.
00f0 322d3175 62756e74 75313229 20342e33 2-1ubuntu12) 4.3
0100 2e320000 4743433a 20285562 756e7475 .2..GCC: (Ubuntu
0110 20342e33 2e322d31 7562756e 74753132 4.3.2-1ubuntu12
0120 2920342e 332e3200 ) 4.3.2.
Contents of section .debug_aranges:
0000 4c000000 02008b00 00000800 00000000 L...............
0010 ec034000 00000000 17000000 00000000 ..@.............
0020 88034000 00000000 09000000 00000000 ..@.............
0030 b8054000 00000000 04000000 00000000 ..@.............
0040 00000000 00000000 00000000 00000000 ................
0050 3c000000 02003101 00000800 00000000 <.....1.........
0060 9b034000 00000000 05000000 00000000 ..@.............
0070 c1054000 00000000 05000000 00000000 ..@.............
0080 00000000 00000000 00000000 00000000 ................
Contents of section .debug_pubnames:
0000 21000000 02000000 00008b00 00006f00 !.............o.
0010 00005f49 4f5f7374 64696e5f 75736564 .._IO_stdin_used
0020 00000000 00 .....
Contents of section .debug_info:
0000 87000000 02000000 00000801 00000000 ................
0010 01a00000 00380000 00ec0340 00000000 .....8.....@....
0020 00ec0340 00000000 00000000 00020108 ...@............
0030 77000000 0202070c 00000002 04079300 w...............
0040 00000208 078e0000 00020106 79000000 ............y...
0050 0202051f 00000003 0405696e 74000208 ..........int...
0060 05850000 00040807 02010680 00000005 ................
0070 29000000 01198500 00000109 03c80540 )..............@
0080 00000000 00065700 000000a2 00000002 ......W.........
0090 004b0000 00080127 00000000 0000002f .K.....'......./
00a0 6275696c 642f6275 696c6464 2f676c69 build/buildd/gli
00b0 62632d32 2e387e32 30303830 3530352f bc-2.8~20080505/
00c0 6275696c 642d7472 65652f61 6d643634 build-tree/amd64
00d0 2d6c6962 632f6373 752f6372 74692e53 -libc/csu/crti.S
00e0 002f6275 696c642f 6275696c 64642f67 ./build/buildd/g
00f0 6c696263 2d322e38 7e323030 38303530 libc-2.8~2008050
0100 352f6275 696c642d 74726565 2f676c69 5/build-tree/gli
0110 62632d32 30303830 3530352f 63737500 bc-20080505/csu.
0120 474e5520 41532032 2e31382e 39330001 GNU AS 2.18.93..
0130 80a20000 0002005d 00000008 01c90000 .......]........
0140 00500000 002f6275 696c642f 6275696c .P.../build/buil
0150 64642f67 6c696263 2d322e38 7e323030 dd/glibc-2.8~200
0160 38303530 352f6275 696c642d 74726565 80505/build-tree
0170 2f616d64 36342d6c 6962632f 6373752f /amd64-libc/csu/
0180 6372746e 2e53002f 6275696c 642f6275 crtn.S./build/bu
0190 696c6464 2f676c69 62632d32 2e387e32 ildd/glibc-2.8~2
01a0 30303830 3530352f 6275696c 642d7472 0080505/build-tr
01b0 65652f67 6c696263 2d323030 38303530 ee/glibc-2008050
01c0 352f6373 7500474e 55204153 20322e31 5/csu.GNU AS 2.1
01d0 382e3933 000180 8.93...
Contents of section .debug_abbrev:
0000 01110125 0e130b03 0e1b0e11 01120110 ...%............
0010 06000002 24000b0b 3e0b030e 00000324 ....$...>......$
0020 000b0b3e 0b030800 00042400 0b0b3e0b ...>......$...>.
0030 00000534 00030e3a 0b3b0b49 133f0c02 ...4...:.;.I.?..
0040 0a000006 26004913 00000001 11001006 ....&.I.........
0050 55060308 1b082508 13050000 00011100 U.....%.........
0060 10065506 03081b08 25081305 000000 ..U.....%......
Contents of section .debug_line:
0000 23000000 02001d00 00000101 fb0e0d00 #...............
0010 01010101 00000001 00000100 696e6974 ............init
0020 2e630000 0000009e 00000002 00580000 .c...........X..
0030 000101fb 0e0d0001 01010100 00000100 ................
0040 00012f62 75696c64 2f627569 6c64642f ../build/buildd/
0050 676c6962 632d322e 387e3230 30383035 glibc-2.8~200805
0060 30352f62 75696c64 2d747265 652f616d 05/build-tree/am
0070 6436342d 6c696263 2f637375 00006372 d64-libc/csu..cr
0080 74692e53 00010000 00000902 ec034000 ti.S..........@.
0090 00000000 030a014b 753d2f30 4b020100 .......Ku=/0K...
00a0 01010009 02880340 00000000 00031801 .......@........
00b0 4b020500 01010009 02b80540 00000000 K..........@....
00c0 00032401 02040001 01840000 00020058 ..$............X
00d0 00000001 01fb0e0d 00010101 01000000 ................
00e0 01000001 2f627569 6c642f62 75696c64 ..../build/build
00f0 642f676c 6962632d 322e387e 32303038 d/glibc-2.8~2008
0100 30353035 2f627569 6c642d74 7265652f 0505/build-tree/
0110 616d6436 342d6c69 62632f63 73750000 amd64-libc/csu..
0120 6372746e 2e530001 00000000 09029b03 crtn.S..........
0130 40000000 00001a4b 02010001 01000902 @......K........
0140 c1054000 00000000 030f014b 02010001 ..@........K....
0150 01 .
Contents of section .debug_str:
0000 474e5520 4320342e 332e3200 73686f72 GNU C 4.3.2.shor
0010 7420756e 7369676e 65642069 6e740073 t unsigned int.s
0020 686f7274 20696e74 005f494f 5f737464 hort int._IO_std
0030 696e5f75 73656400 2f627569 6c642f62 in_used./build/b
0040 75696c64 642f676c 6962632d 322e387e uildd/glibc-2.8~
0050 32303038 30353035 2f627569 6c642d74 20080505/build-t
0060 7265652f 676c6962 632d3230 30383035 ree/glibc-200805
0070 30352f63 73750075 6e736967 6e656420 05/csu.unsigned
0080 63686172 006c6f6e 6720696e 74006c6f char.long int.lo
0090 6e672075 6e736967 6e656420 696e7400 ng unsigned int.
00a0 696e6974 2e6300 init.c.
Contents of section .debug_ranges:
0000 ffffffff ffffffff 00000000 00000000 ................
0010 ec034000 00000000 03044000 00000000 ..@.......@.....
0020 88034000 00000000 91034000 00000000 ..@.......@.....
0030 b8054000 00000000 bc054000 00000000 ..@.......@.....
0040 00000000 00000000 00000000 00000000 ................
0050 ffffffff ffffffff 00000000 00000000 ................
0060 9b034000 00000000 a0034000 00000000 ..@.......@.....
0070 c1054000 00000000 c6054000 00000000 ..@.......@.....
0080 00000000 00000000 00000000 00000000 ................
3.7 $
***** a.outのdisassemble
3.7 $ objdump -d a.out

a.out: file format elf64-x86-64


Disassembly of section .init:

0000000000400388 <_init>:
400388: 48 83 ec 08 sub $0x8,%rsp
40038c: e8 5b 00 00 00 callq 4003ec
400391: e8 ea 00 00 00 callq 400480
400396: e8 e5 01 00 00 callq 400580 <__do_global_ctors_aux>
40039b: 48 83 c4 08 add $0x8,%rsp
40039f: c3 retq

Disassembly of section .plt:

00000000004003a0 <__libc_start_main@plt-0x10>:
4003a0: ff 35 4a 0c 20 00 pushq 0x200c4a(%rip) # 600ff0 <_GLOBAL_OFFSET_TABLE_+0x8>
4003a6: ff 25 4c 0c 20 00 jmpq *0x200c4c(%rip) # 600ff8 <_GLOBAL_OFFSET_TABLE_+0x10>
4003ac: 0f 1f 40 00 nopl 0x0(%rax)

00000000004003b0 <__libc_start_main@plt>:
4003b0: ff 25 4a 0c 20 00 jmpq *0x200c4a(%rip) # 601000 <_GLOBAL_OFFSET_TABLE_+0x18>
4003b6: 68 00 00 00 00 pushq $0x0
4003bb: e9 e0 ff ff ff jmpq 4003a0 <_init+0x18>

Disassembly of section .text:

00000000004003c0 <_start>:
4003c0: 31 ed xor %ebp,%ebp
4003c2: 49 89 d1 mov %rdx,%r9
4003c5: 5e pop %rsi
4003c6: 48 89 e2 mov %rsp,%rdx
4003c9: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
4003cd: 50 push %rax
4003ce: 54 push %rsp
4003cf: 49 c7 c0 e0 04 40 00 mov $0x4004e0,%r8
4003d6: 48 c7 c1 f0 04 40 00 mov $0x4004f0,%rcx
4003dd: 48 c7 c7 c0 04 40 00 mov $0x4004c0,%rdi
4003e4: e8 c7 ff ff ff callq 4003b0 <__libc_start_main@plt>
4003e9: f4 hlt
4003ea: 90 nop
4003eb: 90 nop

00000000004003ec <call_gmon_start>:
4003ec: 48 83 ec 08 sub $0x8,%rsp
4003f0: 48 8b 05 e9 0b 20 00 mov 0x200be9(%rip),%rax # 600fe0 <_DYNAMIC+0x1a0>
4003f7: 48 85 c0 test %rax,%rax
4003fa: 74 02 je 4003fe <call_gmon_start+0x12>
4003fc: ff d0 callq *%rax
4003fe: 48 83 c4 08 add $0x8,%rsp
400402: c3 retq
400403: 90 nop
400404: 90 nop
400405: 90 nop
400406: 90 nop
400407: 90 nop
400408: 90 nop
400409: 90 nop
40040a: 90 nop
40040b: 90 nop
40040c: 90 nop
40040d: 90 nop
40040e: 90 nop
40040f: 90 nop

0000000000400410 <__do_global_dtors_aux>:
400410: 55 push %rbp
400411: 48 89 e5 mov %rsp,%rbp
400414: 53 push %rbx
400415: 48 83 ec 08 sub $0x8,%rsp
400419: 80 3d 10 0c 20 00 00 cmpb $0x0,0x200c10(%rip) # 601030 <__bss_start>
400420: 75 4b jne 40046d <__do_global_dtors_aux+0x5d>
400422: b8 30 0e 60 00 mov $0x600e30,%eax
400427: 48 8b 15 0a 0c 20 00 mov 0x200c0a(%rip),%rdx # 601038
40042e: 48 2d 28 0e 60 00 sub $0x600e28,%rax
400434: 48 c1 f8 03 sar $0x3,%rax
400438: 48 8d 58 ff lea -0x1(%rax),%rbx
40043c: 48 39 da cmp %rbx,%rdx
40043f: 73 25 jae 400466 <__do_global_dtors_aux+0x56>
400441: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
400448: 48 8d 42 01 lea 0x1(%rdx),%rax
40044c: 48 89 05 e5 0b 20 00 mov %rax,0x200be5(%rip) # 601038
400453: ff 14 c5 28 0e 60 00 callq *0x600e28(,%rax,8)
40045a: 48 8b 15 d7 0b 20 00 mov 0x200bd7(%rip),%rdx # 601038
400461: 48 39 da cmp %rbx,%rdx
400464: 72 e2 jb 400448 <__do_global_dtors_aux+0x38>
400466: c6 05 c3 0b 20 00 01 movb $0x1,0x200bc3(%rip) # 601030 <__bss_start>
40046d: 48 83 c4 08 add $0x8,%rsp
400471: 5b pop %rbx
400472: c9 leaveq
400473: c3 retq
400474: 66 66 66 2e 0f 1f 84 nopw %cs:0x0(%rax,%rax,1)
40047b: 00 00 00 00 00

0000000000400480 <frame_dummy>:
400480: 55 push %rbp
400481: 48 83 3d af 09 20 00 cmpq $0x0,0x2009af(%rip) # 600e38 <__JCR_END__>
400488: 00
400489: 48 89 e5 mov %rsp,%rbp
40048c: 74 1a je 4004a8 <frame_dummy+0x28>
40048e: b8 00 00 00 00 mov $0x0,%eax
400493: 48 85 c0 test %rax,%rax
400496: 74 10 je 4004a8 <frame_dummy+0x28>
400498: bf 38 0e 60 00 mov $0x600e38,%edi
40049d: 49 89 c3 mov %rax,%r11
4004a0: c9 leaveq
4004a1: 41 ff e3 jmpq *%r11
4004a4: 0f 1f 40 00 nopl 0x0(%rax)
4004a8: c9 leaveq
4004a9: c3 retq
4004aa: 90 nop
4004ab: 90 nop

00000000004004ac <a>:
4004ac: 55 push %rbp
4004ad: 48 89 e5 mov %rsp,%rbp
4004b0: 48 89 7d f8 mov %rdi,-0x8(%rbp)
4004b4: 48 8b 45 f8 mov -0x8(%rbp),%rax
4004b8: 0f b6 00 movzbl (%rax),%eax
4004bb: c9 leaveq
4004bc: c3 retq
4004bd: 90 nop
4004be: 90 nop
4004bf: 90 nop

00000000004004c0 <main>:
4004c0: 55 push %rbp
4004c1: 48 89 e5 mov %rsp,%rbp
4004c4: 48 83 ec 10 sub $0x10,%rsp
4004c8: 89 7d fc mov %edi,-0x4(%rbp)
4004cb: 48 89 75 f0 mov %rsi,-0x10(%rbp)
4004cf: bf 20 10 60 00 mov $0x601020,%edi
4004d4: e8 d3 ff ff ff callq 4004ac <a>
4004d9: b8 00 00 00 00 mov $0x0,%eax
4004de: c9 leaveq
4004df: c3 retq

00000000004004e0 <__libc_csu_fini>:
4004e0: f3 c3 repz retq
4004e2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1)
4004e9: 1f 84 00 00 00 00 00

00000000004004f0 <__libc_csu_init>:
4004f0: 48 89 6c 24 d8 mov %rbp,-0x28(%rsp)
4004f5: 4c 89 7c 24 f8 mov %r15,-0x8(%rsp)
4004fa: 48 8d 2d 13 09 20 00 lea 0x200913(%rip),%rbp # 600e14 <__init_array_end>
400501: 4c 8d 3d 0c 09 20 00 lea 0x20090c(%rip),%r15 # 600e14 <__init_array_end>
400508: 4c 89 64 24 e0 mov %r12,-0x20(%rsp)
40050d: 4c 89 6c 24 e8 mov %r13,-0x18(%rsp)
400512: 4c 89 74 24 f0 mov %r14,-0x10(%rsp)
400517: 48 89 5c 24 d0 mov %rbx,-0x30(%rsp)
40051c: 48 83 ec 38 sub $0x38,%rsp
400520: 4c 29 fd sub %r15,%rbp
400523: 41 89 fe mov %edi,%r14d
400526: 49 89 f5 mov %rsi,%r13
400529: 48 c1 fd 03 sar $0x3,%rbp
40052d: 49 89 d4 mov %rdx,%r12
400530: e8 53 fe ff ff callq 400388 <_init>
400535: 48 85 ed test %rbp,%rbp
400538: 74 1c je 400556 <__libc_csu_init+0x66>
40053a: 31 db xor %ebx,%ebx
40053c: 0f 1f 40 00 nopl 0x0(%rax)
400540: 4c 89 e2 mov %r12,%rdx
400543: 4c 89 ee mov %r13,%rsi
400546: 44 89 f7 mov %r14d,%edi
400549: 41 ff 14 df callq *(%r15,%rbx,8)
40054d: 48 83 c3 01 add $0x1,%rbx
400551: 48 39 eb cmp %rbp,%rbx
400554: 72 ea jb 400540 <__libc_csu_init+0x50>
400556: 48 8b 5c 24 08 mov 0x8(%rsp),%rbx
40055b: 48 8b 6c 24 10 mov 0x10(%rsp),%rbp
400560: 4c 8b 64 24 18 mov 0x18(%rsp),%r12
400565: 4c 8b 6c 24 20 mov 0x20(%rsp),%r13
40056a: 4c 8b 74 24 28 mov 0x28(%rsp),%r14
40056f: 4c 8b 7c 24 30 mov 0x30(%rsp),%r15
400574: 48 83 c4 38 add $0x38,%rsp
400578: c3 retq
400579: 90 nop
40057a: 90 nop
40057b: 90 nop
40057c: 90 nop
40057d: 90 nop
40057e: 90 nop
40057f: 90 nop

0000000000400580 <__do_global_ctors_aux>:
400580: 55 push %rbp
400581: 48 89 e5 mov %rsp,%rbp
400584: 53 push %rbx
400585: 48 83 ec 08 sub $0x8,%rsp
400589: 48 8b 05 88 08 20 00 mov 0x200888(%rip),%rax # 600e18 <__CTOR_LIST__>
400590: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
400594: 74 19 je 4005af <__do_global_ctors_aux+0x2f>
400596: bb 18 0e 60 00 mov $0x600e18,%ebx
40059b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
4005a0: 48 83 eb 08 sub $0x8,%rbx
4005a4: ff d0 callq *%rax
4005a6: 48 8b 03 mov (%rbx),%rax
4005a9: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
4005ad: 75 f1 jne 4005a0 <__do_global_ctors_aux+0x20>
4005af: 48 83 c4 08 add $0x8,%rsp
4005b3: 5b pop %rbx
4005b4: c9 leaveq
4005b5: c3 retq
4005b6: 90 nop
4005b7: 90 nop

Disassembly of section .fini:

00000000004005b8 <_fini>:
4005b8: 48 83 ec 08 sub $0x8,%rsp
4005bc: e8 4f fe ff ff callq 400410 <__do_global_dtors_aux>
4005c1: 48 83 c4 08 add $0x8,%rsp
4005c5: c3 retq
3.7 $