00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <stdio.h>
00013 #include <sys/types.h>
00014 #include <libelf.h>
00015 #include <fcntl.h>
00016
00017 #define min(x,y) ((x)<(y)?(x):(y))
00018
00019 extern int errno;
00020
00021
00022 void copy_bytes(infd, outfd, offset, nbytes)
00023 int infd, outfd, offset, nbytes;
00024 { char buf[8192];
00025 int i, s;
00026 lseek(infd, offset, SEEK_SET);
00027 while (nbytes>0) {
00028 s=min(8192, nbytes);
00029 s=read(infd, buf, s);
00030 if (s<=0) {
00031 fprintf(stderr, "cannot read object %d", errno);
00032 return;}
00033 write(outfd, buf, s);
00034 nbytes -= s;}
00035 }
00036
00037
00038 main(argc,argv)
00039 int argc;
00040 char *argv[];
00041 {
00042 char *fname;
00043 int elfd, outfd;
00044 char outfname[128];
00045 Elf *elf;
00046 Elf32_Ehdr *ehdr, newehdr;
00047 Elf_Scn *scn;
00048 Elf32_Shdr *scnhdr, scntab[40];
00049 Elf_Data *data;
00050 int scn_symt[40];
00051 int i, j, scn_num, scn_total_size, scn_offset;
00052 char *cp;
00053
00054
00055 fname=argv[1];
00056 sprintf(outfname,"%s.p",fname);
00057 elfd=open(fname, 0);
00058 outfd=open(outfname, O_RDWR | O_CREAT, 0777);
00059 if (elfd<=0) {
00060 fprintf(stderr, "%s cannot open %d\n", fname, errno);
00061 exit(2);}
00062 if (outfd<=0) {
00063 fprintf(stderr, "%s cannot open %d\n", outfname, errno);
00064 exit(2);}
00065 fprintf(stderr, "%s opened\n", outfname);
00066
00067 elf_version(EV_CURRENT);
00068 elf=elf_begin(elfd, ELF_C_READ, 0);
00069 if (elf==0) printf("%s\n", elf_errmsg(elf_errno()));
00070 ehdr=elf32_getehdr(elf);
00071 memcpy(&newehdr, ehdr, sizeof(newehdr));
00072
00073
00074
00075
00076 printf("\ne_type= %d\n", newehdr.e_type);
00077 printf("e_machine= %d\n", newehdr.e_machine);
00078 printf("e_version= %d\n", newehdr.e_version);
00079 printf("e_entry= 0x%x\n", newehdr.e_entry);
00080 printf("e_phoff= 0x%x\n", newehdr.e_phoff);
00081 printf("e_shoff= 0x%x\n", newehdr.e_shoff);
00082 printf("e_flags= 0x%x\n", newehdr.e_flags);
00083 printf("e_ehsize= 0x%x\n", newehdr.e_ehsize);
00084 printf("e_phentsize= %d\n", newehdr.e_phentsize);
00085 printf("e_phnum= %d\n", newehdr.e_phnum);
00086 printf("e_shentsize= %d\n", newehdr.e_shentsize);
00087 printf("e_shnum= %d\n", newehdr.e_shnum);
00088 printf("e_shstrndx= %d\n", newehdr.e_shstrndx);
00089
00090
00091 scn_num=newehdr.e_shnum;
00092 scn_total_size=0;
00093 for (i=0; i<scn_num; i++) {
00094 scn=elf_getscn(elf, i);
00095 scnhdr=elf32_getshdr(scn);
00096 memcpy(&scntab[i], scnhdr, sizeof(Elf32_Shdr));
00097 if (scntab[i].sh_flags) {
00098 scntab[i].sh_flags=0;
00099 if (scntab[i].sh_type==SHT_PROGBITS)
00100 scntab[i].sh_size=0;}
00101 scn_total_size +=scntab[i].sh_size; }
00102
00103
00104 newehdr.e_type=ET_REL;
00105 newehdr.e_entry=0;
00106 newehdr.e_phoff=0;
00107 newehdr.e_shoff= sizeof(Elf32_Ehdr) + scn_total_size;
00108 newehdr.e_phentsize=0;
00109 newehdr.e_phnum=0;
00110
00111
00112 write(outfd, &newehdr, sizeof(Elf32_Ehdr));
00113 fprintf(stderr, "ehdr updated\n");
00114
00115
00116
00117 for (i=1; i<scn_num; i++) {
00118 fprintf(stderr, "%d size=%d\n", i, scntab[i].sh_size);
00119 copy_bytes(elfd, outfd, scntab[i].sh_offset, scntab[i].sh_size);
00120 }
00121
00122
00123
00124 scn_offset=sizeof(Elf32_Ehdr);
00125 write(outfd, scntab[0], sizeof(Elf32_Shdr));
00126
00127
00128 for (i=1; i<scn_num; i++) {
00129 scntab[i].sh_offset=scn_offset;
00130 scn_offset += scntab[i].sh_size;
00131 write(outfd, scntab[i], sizeof(Elf32_Shdr));
00132 }
00133
00134 elf_end(elf);
00135 close(elfd);
00136 close(outfd);
00137 }
00138
00139