其他分享
首页 > 其他分享> > dl_iterate_phdr用法

dl_iterate_phdr用法

作者:互联网

Synopsis


#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_phdr_info 结构


struct dl_phdr_info {

  ElfW(Addr) dlpi_addr;       /* 基地址  */

  const char* dlpi_name;   /* 对象名 */

  const Elf(Phdr) *dlpi_phdr;   /* 对象的elf 头数组的指针*/

  ElfW(Half) dlpi_phnum;  /* 头的数量 */

};

如 Elf32_Phdr :


typedef struct {
Elf32_Word p_type;
Elf32_Off p_offset; /* 段文件偏移 */
Elf32_Addr p_vaddr;
Elf32_Addr p_paddr;
Elf32_Word p_filesz; /* segment size in file*/
Elf32_Word p_memsz; /* 段在内存大小 */
Elf32_Word p_flags; /* 段标志 */
Elf32_Word p_align; /* 段对齐值*/
} Elf32_Phdr;

其中需指出的是p_memsz大于或等于p_filesz, 这是因为,在内存中的段可能会存在.bass节, 由于这个放到磁盘会占用空间,所以在段加载到内存都会加上。

the formula for calculating the location of a particular program header, x , in virtual memory :

addr = info->dl_pi_adr + info->dlpi_phdr[x].p_vaddr;

Example

#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 segemts)\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);
}

标签:info,dl,int,Elf32,phdr,iterate,dlpi
来源: https://www.cnblogs.com/ysjblog/p/16340273.html