Manpages

名 前

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() 関 数 を 使 う と 、 ア プ リ ケ ー シ ョ ン は 実 行 時 に ど の 共 有 オ ブ ジ ェ ク ト を ロ ー ド し た か を 見 つ け る こ と が で き る 。

dl_iterate_phdr() 関 数 は ア プ リ ケ ー シ ョ ン の 共 有 オ ブ ジ ェ ク ト の リ ス ト を 辿 り 、 各 オ ブ ジ ェ ク ト に 対 し て 関 数 callback を 1 回 ず つ 呼 び 出 す 。 こ れ は 全 て の 共 有 オ ブ ジ ェ ク ト が 処 理 さ れ る か 、 callback が 0 以 外 の 値 を 返 す ま で 行 わ れ る 。 各 々 の callback 呼 び 出 し は 3 つ の 引 き 数 を 受 け 取 る : info は 共 有 オ ブ ジ ェ ク ト の 情 報 を 保 持 す る 構 造 体 へ の ポ イ ン タ ー で あ る 。 sizeinfo で 指 さ れ る 構 造 体 の サ イ ズ で あ る 。 data は 呼 び 出 し 元 プ ロ グ ラ ム か ら dl_iterate_phdr() の 呼 び 出 し の (同 じ く data と い う 名 前 の ) 第 2 引 き 数 と し て 渡 さ れ る 値 の コ ピ ー で あ る 。

info 引 き 数 は 、 以 下 の よ う な 型 の 構 造 体 で あ る 。

struct dl_phdr_info {
ElfW(Addr) dlpi_addr; /* オ ブ ジ ェ ク ト の ベ ー ス ア ド レ ス */
const char *dlpi_name; /* (ヌ ル 文 字 で 終 端 さ れ た ) オ ブ ジ ェ ク ト 名
*/
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 は ヌ ル 文 字 で 終 端 さ れ た 文 字 列 で あ り 、 こ の パ ス 名 の フ ァ イ ル か ら 共 有 オ ブ ジ ェ ク ト が ロ ー ド さ れ る 。

dlpi_phdrdlpi_phnum フ ィ ー ル ド の 意 味 を 理 解 す る に は 、 ELF 共 有 オ ブ ジ ェ ク ト が 幾 つ か の セ グ メ ン ト か ら 構 成 さ れ て い る こ と と 、 各 セ グ メ ン ト が そ れ に 対 応 す る プ ロ グ ラ ム ヘ ッ ダ ー (そ の セ グ メ ン ト を 説 明 す る ) を 持 っ て い る こ と を 知 っ て い る 必 要 が あ る 。 dlpi_phdr フ ィ ー ル ド は 、 こ の 共 有 オ ブ ジ ェ ク ト の プ ロ グ ラ ム ヘ ッ ダ ー の 配 列 へ の ポ イ ン タ ー で あ る 。 dlpi_phnum は 、 こ の 配 列 の サ イ ズ を 表 す 。 こ れ ら の プ ロ グ ラ ム ヘ ッ ダ ー は 以 下 の よ う な 形 式 の 構 造 体 で あ る :

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) オ ン ラ イ ン の い ろ い ろ な 場 所 で 入 手 で き る Executable and Linking Format Specification

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。