Fetching contents of .eh_frame section from the elf file


I am supposed to fetch the field pc_begin and pc_range from the .eh_frame section of the elf file. The format of this section is described in here: https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html

I have the starting address of the section with me:

for (int i = 0; i < ehdr->e_shnum; i++) {
           if(strcmp((sh_strtab_p + shdrs[i].sh_name),".eh_frame") == 0){
                size = shdrs[i].sh_size;
                addr= shdrs[i].sh_addr;

This addr is in uint64_t type. Using this address as the starting point, I have been reading 4bytes of data to fetch the length field of CIE/FDE record and 8bytes to get the extended length field.

static uint64_t start = addr;
for(uint64_t start= addr;start <  (addr+size);){
     uint32_t initial_length= ReadFourBytes(start);
     start += 4;

     if (initial_length == 0xffffffff) {
         initial_length =ReadEightBytes(start);
         start += 8;
     else if ( initial_length == 0){
         printf("No CFI information\n");

     static uint64_t temp_addr= start;
     uint32_t CIE_id = ReadFourBytes(start);

     if (CIE_id == 0){
         printf("CIE record\n");
         start = start + initial_length;

         printf("Fde record\n");
         uint64_t pc_begin= ReadEightBytes(start);
         printf("PC_Begin %x", pc_begin);
         uint64_t Size= ReadEightBytes(start) - Address;
         printf(" %x\n",Size);
         start = temp_addr + initial_length;


To keep proceeding and to read other fields, I need to increment my start variable. I know this isn't the proper code.

I have been working on this for quite sometime. Any kind of help would be appreciated and gladly accepted.

asked on Stack Overflow Dec 8, 2020 by Ritanya • edited Dec 8, 2020 by Ritanya

0 Answers

Nobody has answered this question yet.

User contributions licensed under CC BY-SA 3.0