Home > Blockchain >  How to find EH_FRAME
How to find EH_FRAME

Time:06-09

Suppose I wanted a program written in C read its own eh_frame, in order to get information required for stack unwinding and exception handling. How to find out where it begins?

CodePudding user response:

You could use (like RefPerSys and GCC do) Ian Lance Taylor's libbacktrace for that purpose.

(but you'll better compile your C code with DWARF debug information, so g -Wall -g -O ...)

CodePudding user response:

Suppose I wanted a program written in C read its own eh_frame

The .eh_frame_hdr is linked into its own GNU_EH_FRAME program header, precisely so it's easy for runtime libraries to locate .eh_frame at runtime.

Here is a typical layout:

readelf -Wl /bin/date

Elf file type is DYN (Position-Independent Executable file)
Entry point 0x3cd0
There are 11 program headers, starting at offset 64

Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  PHDR           0x000040 0x0000000000000040 0x0000000000000040 0x000268 0x000268 R   0x8
  INTERP         0x0002a8 0x00000000000002a8 0x00000000000002a8 0x00001c 0x00001c R   0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x000000 0x0000000000000000 0x0000000000000000 0x002790 0x002790 R   0x1000
  LOAD           0x003000 0x0000000000003000 0x0000000000003000 0x010139 0x010139 R E 0x1000
  LOAD           0x014000 0x0000000000014000 0x0000000000014000 0x005ad8 0x005ad8 R   0x1000
  LOAD           0x01a250 0x000000000001b250 0x000000000001b250 0x001090 0x001248 RW  0x1000
  DYNAMIC        0x01adf8 0x000000000001bdf8 0x000000000001bdf8 0x0001e0 0x0001e0 RW  0x8
  NOTE           0x0002c4 0x00000000000002c4 0x00000000000002c4 0x000044 0x000044 R   0x4
  GNU_EH_FRAME   0x017fe0 0x0000000000017fe0 0x0000000000017fe0 0x00040c 0x00040c R   0x4
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10
  GNU_RELRO      0x01a250 0x000000000001b250 0x000000000001b250 0x000db0 0x000db0 R   0x1

 Section to Segment mapping:
  Segment Sections...
   00
   01     .interp
   02     .interp .note.gnu.build-id .note.ABI-tag .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt
   03     .init .plt .plt.got .text .fini
   04     .rodata .eh_frame_hdr .eh_frame
   05     .init_array .fini_array .data.rel.ro .dynamic .got .got.plt .data .bss
   06     .dynamic
   07     .note.gnu.build-id .note.ABI-tag
   08     .eh_frame_hdr
   09
   10     .init_array .fini_array .data.rel.ro .dynamic .got

So start with GNU_EH_FRAME segment, and follow the links.

  • Related