elf 取路径_c – 获取主要可执行文件的ELF标题

由dlopen(0,RTLD_LAZY)返回的void *指针给出一个对应于主可执行文件的struct link_map *.

调用dl_iterate_phdr也会在首次执行回调时返回主可执行文件的条目.

你可能会被链接映射中的.l_addr == 0这个事实所困惑,而使用dl_iterate_phdr的那个dlpi_addr == 0.

这正在发生,因为l_addr(和dlpi_addr)实际上并没有记录ELF映像的加载地址.相反,它们记录已应用于该映像的重定位.

通常,主可执行文件的加载位置为0x400000(对于x86_64 Linux)或0x08048000(对于ix86 Linux),并且加载在相同的地址(即它们不被重新定位).

但是如果您将可执行文件与-pie标记相链接,那么它将链接到0x0,并将其重定位到其他地址.

那么如何到达ELF标题?简单:

#ifndef _GNU_SOURCE

#define _GNU_SOURCE

#endif

#include

#include

#include

static int

callback(struct dl_phdr_info *info,size_t size,void *data)

{

int j;

static int once = 0;

if (once) return 0;

once = 1;

printf("relocation: 0x%lx\n",(long)info->dlpi_addr);

for (j = 0; j < info->dlpi_phnum; j++) {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值