From: Alex Brainman Date: Fri, 1 Mar 2013 03:49:23 +0000 (+1100) Subject: libmach: many pe handling fixes X-Git-Tag: go1.1rc2~757 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e72d1a9575e7b70b611c1f92319cb5a84d9e9267;p=gostls13.git libmach: many pe handling fixes - implement windows pread; - set correct Fhdr.type; - add ImageBase to all pe "virtual" addresses; - correct settext parameter order; - use pclntab/epclntab to find line numbers. Fixes #4841. Fixes #4926. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/7405050 --- diff --git a/src/libmach/executable.c b/src/libmach/executable.c index 3fd3e0968e..a93a8c268c 100644 --- a/src/libmach/executable.c +++ b/src/libmach/executable.c @@ -1349,12 +1349,12 @@ static int pedotout(int fd, Fhdr *fp, ExecHdr *hp) { uint32 start, magic; - uint32 symtab, esymtab; + uint32 symtab, esymtab, pclntab, epclntab; IMAGE_FILE_HEADER fh; IMAGE_SECTION_HEADER sh; IMAGE_OPTIONAL_HEADER oh; uint8 sym[18]; - uint32 *valp; + uint32 *valp, ib; int i; USED(hp); @@ -1389,6 +1389,19 @@ pedotout(int fd, Fhdr *fp, ExecHdr *hp) return 0; } + switch(oh.Magic) { + case 0x10b: // PE32 + fp->type = FI386; + break; + case 0x20b: // PE32+ + fp->type = FAMD64; + break; + default: + werrstr("invalid PE Optional magic number"); + return 0; + } + + ib=leswal(oh.ImageBase); seek(fd, start+sizeof(magic)+sizeof(fh)+leswab(fh.SizeOfOptionalHeader), 0); fp->txtaddr = 0; fp->dataddr = 0; @@ -1398,9 +1411,9 @@ pedotout(int fd, Fhdr *fp, ExecHdr *hp) return 0; } if (match8(sh.Name, ".text")) - settext(fp, leswal(sh.VirtualAddress), leswal(oh.AddressOfEntryPoint), leswal(sh.VirtualSize), leswal(sh.PointerToRawData)); + settext(fp, ib+leswal(oh.AddressOfEntryPoint), ib+leswal(sh.VirtualAddress), leswal(sh.VirtualSize), leswal(sh.PointerToRawData)); if (match8(sh.Name, ".data")) - setdata(fp, leswal(sh.VirtualAddress), leswal(sh.SizeOfRawData), leswal(sh.PointerToRawData), leswal(sh.VirtualSize)-leswal(sh.SizeOfRawData)); + setdata(fp, ib+leswal(sh.VirtualAddress), leswal(sh.SizeOfRawData), leswal(sh.PointerToRawData), leswal(sh.VirtualSize)-leswal(sh.SizeOfRawData)); } if (fp->txtaddr==0 || fp->dataddr==0) { werrstr("no .text or .data"); @@ -1408,7 +1421,7 @@ pedotout(int fd, Fhdr *fp, ExecHdr *hp) } seek(fd, leswal(fh.PointerToSymbolTable), 0); - symtab = esymtab = 0; + symtab = esymtab = pclntab = epclntab = 0; for (i=0; i