Hello All,
o I have written the following program to convert a core file to a
executable, and tried to execute the converted executable but my
system __HANGED__, The kernel did'nt give any messages the complete
system was stuck.
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.
o 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, since 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
kernel does not load this program, could it be a bug in the kernel code ?
o The following is the program which converts core file to executable,
its simple to use just compile it with 'gcc convertcore.c -o
convertcore' , run with 'convertcore <core-file-name> <new-exec-name>
<vaddr-of-main>'
o I dump the core by CRTL+\
really appreciate your inputs
========================<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.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]