Hello All,

o I have written the following program to convert a core file to a
executable, and tried to execute but solaris loader just say "KILLED"
, so I used dbx to load the program and got the following message
"program dies before enterning main() -- perhaps it is too large?"

o Theoretically , the OS loader should jump into the virtual address
specified at ELF_HDR.e_entry and start executing instructions from
that point if the ELF_TYPE is ET_EXEC. So I wrote a program which
changes ELF_TYPE form ET_CORE to ET_EXEC and modifies e_entry to
virtual address of the 'main' symbol. The core file has valid offset
to access the PHDRS, and for ET_EXEC the elf loader just need to map
the PHDRS at the vaddr specified and start jump to e_entry.

o Is there anything I'am missing, can some experts throw light on why
solaris loader does not load this program.


o The following is the program which converts core file to executable,
its simple to use just compile it with 'cc convertcore.c -o
convertcore' , run with 'convertcore <core-file-name> <new-exec-name>
<vaddr-of-main>'

really appreciate your time to look into this.....

========================<BEGIN>===============================
#include<elf.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

#ifndef __64_BIT__
#define __32_BIT__
#endif

#ifdef __32_BIT__
#define ELF_EHDR Elf32_Ehdr
#else
#define ELF_EHDR Elf64_Ehdr
#endif

ELF_EHDR place_holder;

/*Chages the elf_header in the file with ptr */
int ChangeElfHeader(int CoreFd, int WriteFd, unsigned long vaddr){

      unsigned long got_len=0;

      if((got_len = read(CoreFd,&place_holder,sizeof(ELF_EHDR)))
              != sizeof(ELF_EHDR)){
              perror("Unable to read the ELF Header::");
              exit(1);
      }
      /*Change the ET_CORE tto ET_EXEC*/
      if(place_holder.e_type == ET_CORE) {
              place_holder.e_type = ET_EXEC;
      } else {
              fprintf(stderr,"The file is not of ELF core file");
              exit(1);
      }

      /*Change the entry */

      place_holder.e_entry = vaddr;

      /*Write back the header*/
      got_len = 0;
      if (( got_len = write(WriteFd,&place_holder,sizeof(ELF_EHDR)))
              != sizeof(ELF_EHDR)) {
              perror("Unable to write the header::");
              exit(1);
      }
      return 1;
}

static void finishWriting(int coreFd, int writeFd) {

      unsigned char write_buffer[4*1024];
      int got_len = -1;

      while( (got_len = read(coreFd,write_buffer,4096)) != 0) {
              if(write(writeFd,write_buffer,got_len) != got_len ){
                      perror("Unable to to write the length which was read:");
                      exit(1);
              }
      }
      close(writeFd);
      close(coreFd);

}

int main(int argc,char* argv[]){

      int coreFd;
      int writeFd;
      unsigned long vaddr;

      if( argc < 3 ) {
              fprintf(stderr,"Usage core2elf core.file exe.file.name");
              exit(1);
      }
      if( (coreFd = open(argv[1],O_RDONLY)) < 0) {
              perror("Unable to open the core file:");
              exit(1);
      }
      if ((writeFd = open(argv[2],O_WRONLY| O_CREAT)) < 0) {
              perror("Unable to open the write file::");
              exit(1);
      }
      sscanf(argv[3],"%lx",&vaddr);
      ChangeElfHeader(coreFd,writeFd,vaddr);
      finishWriting(coreFd,writeFd);


}
=========================<END>===========================

Best Regards,
Vamsi kundeti.
_______________________________________________
opensolaris-code mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

Reply via email to