|
HOME > Linux Tips ( 目次 ) > Linux コマンド 一覧表 > d > dl_iterate_phdr - ライブラリコールの説明 dl_iterate_phdr - ライブラリコールの説明 - Linux コマンド集 一覧表名前dl_iterate_phdr - 共有オブジェクトのリストを辿る 書式
#define _GNU_SOURCE #include <link.h> 説明
dl_iterate_phdr
()関数を使うと、アプリケーションは実行時に
どの共有オブジェクトをロードしたかを見つけることができる。
struct dl_phdr_info {
ElfW(Addr) dlpi_addr; /* オブジェクトのベースアドレス */
const char *dlpi_name; /* (null 文字で終端された)
オブジェクト名
const ElfW(Phdr) *dlpi_phdr; /* このオブジェクトの
ELF プログラムヘッダの
配列へのポインタ */
ElfW(Half) dlpi_phnum; /* 'dlpi_phdr' のアイテム数 */
};
( ElfW ()マクロ定義は引き数をハードウェアアーキテクチャに適した ELF データ型の名前に変換する。 たとえば、32 ビットプラットフォームでは ElfW(Addr) はデータ型名 Elf32_Addr を生成する。 これらの型についての更に詳細な情報は、ヘッダファイル <elf.h> と <link.h> にある。 dlpi_addr フィールドは共有オブジェクトのベースアドレス (つまり、共有オブジェクトの仮想メモリアドレスと、 ファイル (このファイルから共有オブジェクトがロードされる) における 共有オブジェクトのオフセットとの差分) を表す。 dlpi_name は null 文字で終端された文字列であり、 このパス名のファイルから共有オブジェクトがロードされる。 dlpi_phdr と dlpi_phnum フィールドの意味を理解するには、 ELF 共有オブジェクトが幾つかのセグメントから構成されていることと、 各セグメントがそれに対応するプログラムヘッダ (そのセグメントを説明する) を持っていることを知っている必要がある。 dlpi_phdr フィールドは、この共有オブジェクトのプログラムヘッダの配列へのポインタである。 dlpi_phnum は、この配列のサイズを表す。 これらのプログラムヘッダは以下のような形式の構造体である:
特定のプログラムヘッダ x の仮想メモリにおける位置は、以下の式で計算できる点に注意すること: addr == info->dlpi_addr + info->dlpi_phdr[x].p_vaddr; 例
以下のプログラムは、共有オブジェクトがロードされた
パス名の一覧を表示する。
各共有オブジェクトについて、このプログラムは
オブジェクトの ELF セグメントがロードされた
仮想アドレスの一覧を表示する。
#define _GNU_SOURCE #include <link.h> #include <stdlib.h> #include <stdio.h> 返り値dl_iterate_phdr ()関数は最後の callback の呼び出しで返された値を返す。 準拠dl_iterate_phdr ()関数は Linux 固有であり、移植を考えたアプリケーションでは避けるべきである。 関連項目
ldd
(1),
objdump
(1),
readelf
(1),
dlopen
(3),
ld.so
(8), オンラインのいろいろな場所で入手できる
"Executable and Linking Format Specification"
|
|