Rechercher une page de manuel
dl_iterate_phdr
Langue: ja
Version: 2007-05-18 (openSuse - 09/10/07)
Section: 3 (Bibliothèques de fonctions)
̾Á°
dl_iterate_phdr - ¶¦Í¥ª¥Ö¥¸¥§¥¯¥È¤Î¥ê¥¹¥È¤òé¤ë½ñ¼°
#define _GNU_SOURCE #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 ¤Ï¶¦Í¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ðÊó¤òÊÝ»ý¤¹¤ë¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤Ç¤¢¤ë¡£ size ¤Ï info ¤Ç»Ø¤µ¤ì¤ë¹½Â¤ÂΤΥµ¥¤¥º¤Ç¤¢¤ë¡£ data ¤Ï¸Æ¤Ó½Ð¤·¸µ¥×¥í¥°¥é¥à¤«¤é dl_iterate_phdr() ¤Î¸Æ¤Ó½Ð¤·¤Î (Ʊ¤¸¤¯ data ¤È¤¤¤¦Ì¾Á°¤Î) Âè 2 °ú¤¿ô¤È¤·¤ÆÅϤµ¤ì¤ëÃͤΥ³¥Ô¡¼¤Ç¤¢¤ë¡£
info °ú¤¿ô¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ê·¿¤Î¹½Â¤ÂΤǤ¢¤ë¡£
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 ¤Ï¡¢¤³¤ÎÇÛÎó¤Î¥µ¥¤¥º¤òɽ¤¹¡£
¤³¤ì¤é¤Î¥×¥í¥°¥é¥à¥Ø¥Ã¥À¤Ï°Ê²¼¤Î¤è¤¦¤Ê·Á¼°¤Î¹½Â¤ÂΤǤ¢¤ë:
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() ´Ø¿ô¤Ï 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), feature_test_macros(7), ld.so(8), ¥ª¥ó¥é¥¤¥ó¤Î¤¤¤í¤¤¤í¤Ê¾ì½ê¤ÇÆþ¼ê¤Ç¤¤ë Executable and Linking Format SpecificationContenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre