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