DL_ITERATE_PHDR(3) | Linux Programmer's Manual | DL_ITERATE_PHDR(3) |
名前
dl_iterate_phdr -共有オブジェクトのリストを辿る書式
#define _GNU_SOURCE /* feature_test_macros(7) 参照 */
#include <link.h>
int dl_iterate_phdr(
int (*callback ) (struct dl_phdr_info *info ,
size_t size , void *data ),
void *data );
説明
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 のアイテム数 */
};
typedef struct
{
Elf32_Word p_type; /* セグメントの型 */
Elf32_Off p_offset; /* セグメントのファイルオフセット */
Elf32_Addr p_vaddr; /* セグメントの仮想アドレス */
Elf32_Addr p_paddr; /* セグメントの物理アドレス */
Elf32_Word p_filesz; /* ファイルにおけるセグメントサイズ */
Elf32_Word p_memsz; /* メモリにおけるセグメントサイズ */
Elf32_Word p_flags; /* セグメントフラグ */
Elf32_Word p_align; /* セグメントの配置 (alignment) */
} Elf32_Phdr;
特定のプログラムヘッダ x の仮想メモリにおける位置は、以下の式で計算できる点に注意すること:
addr == info->dlpi_addr + info->dlpi_phdr[x].p_vaddr;
返り値
dl_iterate_phdr() 関数は最後の callback の呼び出しで返された値を返す。バージョン
dl_iterate_phdr() は glibc のバージョン 2.2.4 以降でサポートされている。準拠
dl_iterate_phdr() 関数は Linux 固有であり、移植を考えたアプリケーションでは避けるべきである。例
以下のプログラムは、共有オブジェクトがロードされたパス名の一覧を表示する。各共有オブジェクトについて、このプログラムはオブジェクトの ELF セグメントがロードされた仮想アドレスの一覧を表示する。#define _GNU_SOURCE
#include <link.h>
#include <stdlib.h>
#include <stdio.h>
static int
callback(struct dl_phdr_info *info, size_t size, void *data)
{
int j;
printf("name=%s (%d segments)\n", info->dlpi_name,
info->dlpi_phnum);
for (j = 0; j < info->dlpi_phnum; j++)
printf("\t\t header %2d: address=%10p\n", j,
(void *) (info->dlpi_addr + info->dlpi_phdr[j].p_vaddr));
return 0;
}
int
main(int argc, char *argv[])
{
dl_iterate_phdr(callback, NULL);
exit(EXIT_SUCCESS);
}
関連項目
ldd(1), objdump(1), readelf(1), dlopen(3), elf(5), ld.so(8)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2007-05-18 | GNU |