ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

dl_iterate_phdr用法

2022-06-03 17:31:08  阅读:166  来源: 互联网

标签:info dl int Elf32 phdr iterate dlpi


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;  /* 头的数量 */

};

  • ElfW宏根据不同的硬件架构定义合适的elf数据类型,如 32位 平台就是Elf32_Addr.

  • ELF 共享对象包含一些数据段, 每个段都会有个程序头结构来描述这个段。

如 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有