c – 获取主要可执行文件的ELF标题

c – 获取主要可执行文件的ELF标题,第1张

概述为了各种目的,我正在尝试获取主要可执行文件的ELF头的地址,而无需解析/ proc / self / maps.我尝试解析由dlopen / dlinfo函数给出的link_list链,但是它们不包含一个条目,其中l_addr指向主可执行文件的基址.有没有办法这样做(标准与否),无需解析/ proc / self / maps? 我想要做的一个例子: #include <stdio.h>#inc 为了各种目的,我正在尝试获取主要可执行文件的ELF头的地址,而无需解析/ proc / self / maps.我尝试解析由dlopen / dlinfo函数给出的link_List链,但是它们不包含一个条目,其中l_addr指向主可执行文件的基址.有没有办法这样做(标准与否),无需解析/ proc / self / maps?

我想要做的一个例子:

#include <stdio.h>#include <elf.h>int main(){    Elf32_Ehdr* header = /* Somehow obtain the address of the ELF header of this program */;    printf("%p\n",header);    /* Read the header and do stuff,etc */    return 0;}
解决方法 由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 <link.h>#include <stdio.h>#include <stdlib.h>static intcallback(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++) {    if (info->dlpi_phdr[j].p_type == PT_LOAD) {      printf("a.out loaded at %p\n",(voID *) (info->dlpi_addr + info->dlpi_phdr[j].p_vaddr));      break;    }  }  return 0;}intmain(int argc,char *argv[]){  dl_iterate_phdr(callback,NulL);  exit(EXIT_SUCCESS);}$gcc -m32 t.c && ./a.outrelocation: 0x0a.out loaded at 0x8048000$gcc -m64 t.c && ./a.outrelocation: 0x0a.out loaded at 0x400000$gcc -m32 -pIE -fPIC t.c && ./a.outrelocation: 0xf7789000a.out loaded at 0xf7789000$gcc -m64 -pIE -fPIC t.c && ./a.outrelocation: 0x7f3824964000a.out loaded at 0x7f3824964000

更新:

Why does the man page say “base address” and not relocation?

这是一个BUG 总结

以上是内存溢出为你收集整理的c – 获取主要可执行文件的ELF标题全部内容,希望文章能够帮你解决c – 获取主要可执行文件的ELF标题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1258676.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存