This is the mail archive of the
cygwin-apps
mailing list for the Cygwin project.
[patch/rebase] Make imagehelper 64-bit capable (was Re: [patch/rebase] Add a rebase database ...)
On Jul 7 08:50, Charles Wilson wrote:
> On 7/7/2011 6:54 AM, Corinna Vinschen wrote:
> > On Jul 7 10:26, Corinna Vinschen wrote:
> >> On Jul 6 15:35, Charles Wilson wrote:
> >>> OK by me. In fact, we'd probably want to avoid using imagehelper for
> >>> 32bit, but ReBaseImage64 for 64bit; it would make sense to drop
> >>> imagehelper entirely and use ReBaseImage[64] throughout, right?
> >>
> >> I think we should either use imagehelper, or the Windows imagehlp lib,
> >> not both. Whether it's easier to use the Windows lib or to improve
> >> imagehelper is something we have to see.
> >
> > FYI, I have converted imagehelper to 64 bit. At least it compiles
> > without error, so it kind of works. As for testing...
>
> Nice. You could test on the DLLs under
> /usr/x86_64-w64-mingw32/sys-root/mingw/bin/ (there are only six of them,
> but that should be enough for proof of concept).
It was so surprisingly easy to convert imagehelper to 64 bit that I'm
concerned I forgot something. However, my tests indicate that it really
works as advertised.
Below's the patch to imagehelper to allow to handle 32 and 64 bit images.
While I was at it, I also made the code 64 bit clean and fixed a bug
in the MultiByteToWideChar code (CP_OEMCP, not CP_OEM). It builds and
works fine under 32 bit Cygwin and 64 bit Mingw.
Corinna
Allow to work with 64 bit images and make code 64 bit clean.
* getimageinfos.cc (GetImageInfos64); New function, take over
functionality from GetImageInfos and handle 32 and 64 bit images.
(GetImageInfos): Just call GetImageInfos64.
* imagehelper.h (ReBaseImage64): Declare.
(GetImageInfos64): Declare.
* objectfile.cc (Win32Path): Fix codepage to CP_OEMCP.
(ObjectFile::ObjectFile): Set new is64bit_img flag. Set ImageBase
according to address size of platform.
(LinkedObjectFile::LinkedObjectFile): Handle 64 bit images.
(LinkedObjectFile::rebind): Ditto. Use uintptr_t rather than uint.
(LinkedObjectFile::unbind): Ditto.
* objectfile.h (ObjectFile::getNTHeader): Remove.
(ObjectFile::getNTHeader64): New method.
(ObjectFile::getNTHeader32): New method.
(ObjectFile::is64bit): New method.
(ObjectFile::is32bit): New method.
(ObjectFile::ImageBase): Convert to ULONG64.
(ObjectFile::ntheader): Change type to PIMAGE_NT_HEADERS32
and make private.
(ObjectFile::is64bit_img): New private BOOL member.
* rebase_main.cc: Convert all base variables to ULONG64 and
call ReBaseImage64.
* rebaseimage.cc (ReBaseImage64): New function, take over
functionality from ReBaseImage and handle 32 and 64 bit images.
(ReBaseImage): Just call ReBaseImage64.
* rebind_main.cc (main): Drop unused variables.
* sections.cc (Section::Section): Use uintptr_t rather than uint.
(Section::isIn): Handle 64 bit images.
(Relocations::check): Use uintptr_t rather than uint.
(Relocations::relocate): Ditto.
* sections.h (SectionList::FileBase): Convert to uintptr_t.
Index: getimageinfos.cc
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/getimageinfos.cc,v
retrieving revision 1.3
diff -u -p -r1.3 getimageinfos.cc
--- getimageinfos.cc 21 Jun 2011 09:35:21 -0000 1.3
+++ getimageinfos.cc 7 Jul 2011 19:17:37 -0000
@@ -27,7 +27,8 @@
#include "imagehelper.h"
-BOOL GetImageInfos(LPCSTR filename, ULONG *ImageBase, ULONG *ImageSize)
+BOOL GetImageInfos64(LPCSTR filename, BOOL *is64bit,
+ ULONG64 *ImageBase, ULONG *ImageSize)
{
LinkedObjectFile dll(filename);
@@ -39,8 +40,20 @@ BOOL GetImageInfos(LPCSTR filename, ULON
return false;
}
- *ImageBase = dll.getNTHeader()->OptionalHeader.ImageBase;
- *ImageSize = dll.getNTHeader()->OptionalHeader.SizeOfImage;
+ if (dll.is64bit ())
+ {
+ if (is64bit)
+ *is64bit = TRUE;
+ *ImageBase = dll.getNTHeader64 ()->OptionalHeader.ImageBase;
+ *ImageSize = dll.getNTHeader64 ()->OptionalHeader.SizeOfImage;
+ }
+ else
+ {
+ if (is64bit)
+ *is64bit = FALSE;
+ *ImageBase = dll.getNTHeader32 ()->OptionalHeader.ImageBase;
+ *ImageSize = dll.getNTHeader32 ()->OptionalHeader.SizeOfImage;
+ }
if (Base::debug)
std::cerr << "ImageBase: 0x" << std::hex << *ImageBase << " ImageSize: 0x" << std::hex << *ImageSize << std::endl;
@@ -49,3 +62,10 @@ BOOL GetImageInfos(LPCSTR filename, ULON
return true;
}
+BOOL GetImageInfos(LPCSTR filename, ULONG *ImageBase, ULONG *ImageSize)
+{
+ ULONG64 base;
+ BOOL ret = GetImageInfos64 (filename, NULL, &base, ImageSize);
+ *ImageBase = (ULONG) base;
+ return ret;
+}
Index: imagehelper.h
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/imagehelper.h,v
retrieving revision 1.3
diff -u -p -r1.3 imagehelper.h
--- imagehelper.h 21 Jun 2011 09:35:21 -0000 1.3
+++ imagehelper.h 7 Jul 2011 19:17:37 -0000
@@ -27,6 +27,20 @@
extern "C" {
#endif
+BOOL ReBaseImage64(
+ LPCSTR CurrentImageName,
+ LPCSTR SymbolPath, // ignored
+ BOOL fReBase,
+ BOOL fRebaseSysfileOk, // ignored
+ BOOL fGoingDown,
+ ULONG CheckImageSize, // ignored
+ ULONG *OldImageSize,
+ ULONG64 *OldImageBase,
+ ULONG *NewImageSize,
+ ULONG64 *NewImageBase,
+ ULONG TimeStamp
+);
+
BOOL ReBaseImage(
LPCSTR CurrentImageName,
LPCSTR SymbolPath, // ignored
@@ -64,7 +78,7 @@ typedef enum _IMAGEHLP_STATUS_REASON {
BindSymbolsNotUpdated
} IMAGEHLP_STATUS_REASON;
-typedef BOOL(STDCALL*PIMAGEHLP_STATUS_ROUTINE)(IMAGEHLP_STATUS_REASON,LPSTR,LPSTR,ULONG,ULONG);
+typedef BOOL(__stdcall *PIMAGEHLP_STATUS_ROUTINE)(IMAGEHLP_STATUS_REASON,LPSTR,LPSTR,ULONG,ULONG);
BOOL BindImageEx(
DWORD Flags,
@@ -75,6 +89,13 @@ BOOL BindImageEx(
StatusRoutine
);
+BOOL GetImageInfos64(
+ LPCSTR ImageName,
+ BOOL *is64bit,
+ ULONG64 *ImageBase,
+ ULONG *ImageSize
+);
+
BOOL GetImageInfos(
LPCSTR ImageName,
ULONG *ImageBase,
Index: objectfile.cc
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/objectfile.cc,v
retrieving revision 1.4
diff -u -p -r1.4 objectfile.cc
--- objectfile.cc 21 Jun 2011 15:33:15 -0000 1.4
+++ objectfile.cc 7 Jul 2011 19:17:37 -0000
@@ -40,12 +40,12 @@ Win32Path(const char *s)
if (!s || *s == '\0')
return L"";
#if !defined (__CYGWIN__)
- MultiByteToWideChar (CP_OEM, 0, s, -1, w32_pbuf, 32768);
+ MultiByteToWideChar (CP_OEMCP, 0, s, -1, w32_pbuf, 32768);
#elif defined(__MSYS__)
{
char buf[MAX_PATH];
cygwin_conv_to_win32_path(s, buf);
- MultiByteToWideChar (CP_OEM, 0, buf, -1, w32_pbuf, 32768);
+ MultiByteToWideChar (CP_OEMCP, 0, buf, -1, w32_pbuf, 32768);
}
#else
cygwin_conv_path (CCP_POSIX_TO_WIN_W, s, w32_pbuf, 32768 * sizeof (WCHAR));
@@ -123,7 +123,7 @@ ObjectFile::ObjectFile(const char *aFile
// create shortcuts
PIMAGE_DOS_HEADER dosheader = (PIMAGE_DOS_HEADER)lpFileBase;
- ntheader = (PIMAGE_NT_HEADERS) ((char *)dosheader + dosheader->e_lfanew);
+ ntheader = (PIMAGE_NT_HEADERS32) ((char *)dosheader + dosheader->e_lfanew);
if (ntheader->Signature != 0x00004550)
{
@@ -131,9 +131,13 @@ ObjectFile::ObjectFile(const char *aFile
return;
}
+ is64bit_img = ntheader->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC;
+
sections = new SectionList(lpFileBase);
- ImageBase = ntheader->OptionalHeader.ImageBase;
+ ImageBase = is64bit_img
+ ? getNTHeader64 ()->OptionalHeader.ImageBase
+ : getNTHeader32 ()->OptionalHeader.ImageBase;
Error = 0;
}
@@ -175,18 +179,35 @@ LinkedObjectFile::LinkedObjectFile(const
<< std::hex << ImageBase << std::dec << std::endl;
}
+ PIMAGE_NT_HEADERS32 ntheader32 = getNTHeader32 ();
+ PIMAGE_NT_HEADERS64 ntheader64 = getNTHeader64 ();
+
Section *edata = sections->find(".edata");
if (edata)
exports = new Exports(*edata);
else
- exports = new Exports(*sections,(DataDirectory *)&ntheader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]);
+ {
+ DataDirectory *dir;
+ if (is64bit ())
+ dir = (DataDirectory *) &ntheader64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
+ else
+ dir = (DataDirectory *) &ntheader32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
+ exports = new Exports(*sections, dir);
+ }
Section *idata = sections->find(".idata");
if (idata)
imports = new Imports(*idata);
else
- imports = new Imports(*sections,(DataDirectory *)&ntheader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]);
+ {
+ DataDirectory *dir;
+ if (is64bit ())
+ dir = (DataDirectory *)&ntheader64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
+ else
+ dir = (DataDirectory *)&ntheader32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
+ imports = new Imports(*sections, dir);
+ }
@@ -282,13 +303,33 @@ bool LinkedObjectFile::rebind(ObjectFile
p->TimeDateStamp = 0xffffffff;
p->ForwarderChain = 0xffffffff;
}
- ntheader->FileHeader.TimeDateStamp = time(0);
+
+ PIMAGE_NT_HEADERS32 ntheader32 = getNTHeader32 ();
+ PIMAGE_NT_HEADERS64 ntheader64 = getNTHeader64 ();
+
+ if (is64bit ())
+ ntheader64->FileHeader.TimeDateStamp = time(0);
+ else
+ ntheader32->FileHeader.TimeDateStamp = time(0);
#if 1
// fill bound import section
- DataDirectory *bdp = (DataDirectory *)&ntheader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT];
- SectionHeader *first_section = (SectionHeader *)(ntheader+1);
- BoundImportDescriptor *bp_org = (BoundImportDescriptor *)(&first_section[ntheader->FileHeader.NumberOfSections]);
+ DataDirectory *bdp;
+ SectionHeader *first_section;
+ BoundImportDescriptor *bp_org;
+
+ if (is64bit ())
+ {
+ bdp = (DataDirectory *)&ntheader64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT];
+ first_section = (SectionHeader *)(ntheader64+1);
+ bp_org = (BoundImportDescriptor *)(&first_section[ntheader64->FileHeader.NumberOfSections]);
+ }
+ else
+ {
+ bdp = (DataDirectory *)&ntheader32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT];
+ first_section = (SectionHeader *)(ntheader32+1);
+ bp_org = (BoundImportDescriptor *)(&first_section[ntheader32->FileHeader.NumberOfSections]);
+ }
BoundImportDescriptor *bp = bp_org;
char *bp2 = (char *)&bp[cache.getCount() + 1];
@@ -297,7 +338,7 @@ bool LinkedObjectFile::rebind(ObjectFile
while ((obj = (LinkedObjectFile *)cache.getNext()) != NULL)
{
bp->TimeDateStamp = time(0);
- bp->OffsetModuleName = (uint)bp2 - (uint)bp_org;
+ bp->OffsetModuleName = (uintptr_t) bp2 - (uintptr_t) bp_org;
// bp->Reserved
bp->NumberOfModuleForwarderRefs = 0;
bp++;
@@ -313,8 +354,8 @@ bool LinkedObjectFile::rebind(ObjectFile
bp->NumberOfModuleForwarderRefs = 0;
// set data directory entry
- bdp->VirtualAddress = (uint) bp_org - (uint)lpFileBase;
- bdp->Size = (uint) bp2 - (uint) bp_org;
+ bdp->VirtualAddress = (uintptr_t) bp_org - (uintptr_t) lpFileBase;
+ bdp->Size = (uintptr_t) bp2 - (uintptr_t) bp_org;
#endif
return true;
}
@@ -392,10 +433,18 @@ bool LinkedObjectFile::unbind(void)
p->TimeDateStamp = 0;
p->ForwarderChain = 0;
}
- ntheader->FileHeader.TimeDateStamp = time(0);
+ if (is64bit ())
+ getNTHeader64 ()->FileHeader.TimeDateStamp = time(0);
+ else
+ getNTHeader32 ()->FileHeader.TimeDateStamp = time(0);
// fill bound import section
- DataDirectory *bdp = (DataDirectory *)&ntheader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT];
+ DataDirectory *bdp;
+
+ if (is64bit ())
+ bdp = (DataDirectory *) &getNTHeader64 ()->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT];
+ else
+ bdp = (DataDirectory *) &getNTHeader32 ()->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT];
// set data directory entry
bdp->VirtualAddress = 0;
Index: objectfile.h
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/objectfile.h,v
retrieving revision 1.3
diff -u -p -r1.3 objectfile.h
--- objectfile.h 21 Jun 2011 09:35:21 -0000 1.3
+++ objectfile.h 7 Jul 2011 19:17:37 -0000
@@ -35,7 +35,12 @@ class ObjectFile : public Base
return FileName;
}
- PIMAGE_NT_HEADERS getNTHeader(void)
+ PIMAGE_NT_HEADERS64 getNTHeader64 (void)
+ {
+ return (PIMAGE_NT_HEADERS64) ntheader;
+ }
+
+ PIMAGE_NT_HEADERS32 getNTHeader32 (void)
{
return ntheader;
}
@@ -45,6 +50,16 @@ class ObjectFile : public Base
return Error == 0;
}
+ bool is64bit(void)
+ {
+ return is64bit_img;
+ }
+
+ bool is32bit(void)
+ {
+ return !is64bit_img;
+ }
+
int getError(void)
{
return Error;
@@ -63,11 +78,14 @@ class ObjectFile : public Base
HANDLE hfile;
HANDLE hfilemapping;
LPVOID lpFileBase;
- PIMAGE_NT_HEADERS ntheader;
SectionList *sections;
- uint ImageBase;
+ ULONG64 ImageBase;
int Error;
bool isWritable;
+
+ private:
+ PIMAGE_NT_HEADERS32 ntheader;
+ bool is64bit_img;
};
class ObjectFileList;
Index: rebase_main.cc
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/rebase_main.cc,v
retrieving revision 1.2
diff -u -p -r1.2 rebase_main.cc
--- rebase_main.cc 20 Jun 2011 23:26:26 -0000 1.2
+++ rebase_main.cc 7 Jul 2011 19:17:37 -0000
@@ -44,7 +44,7 @@ void ParseArgs(int argc, char* argv[]);
unsigned long StringToUlong(const string& aString);
void Usage();
-ULONG theImageBase = 0;
+ULONG64 theImageBase = 0;
BOOL theDownFlag = FALSE;
bool theDebugFlag = false;
BOOL theCheckFlag = FALSE;
@@ -58,15 +58,16 @@ int
main(int argc, char* argv[])
{
ParseArgs(argc, argv);
- ULONG aNewImageBase = theImageBase;
+ ULONG64 aNewImageBase = theImageBase;
for (int i = theArgsIndex; i < argc; i++)
{
string aFile = PosixToWin32(argv[i]);
if (theListFlag)
{
- ULONG ImageBase, ImageSize;
- GetImageInfos(const_cast<LPSTR>(aFile.c_str()),&ImageBase,&ImageSize);
+ ULONG64 ImageBase;
+ ULONG ImageSize;
+ GetImageInfos64(const_cast<LPSTR>(aFile.c_str()),&ImageBase,&ImageSize);
cout << aFile << ": " << "ImageBase: 0x" << hex << ImageBase << " ImageSize: 0x" << hex << ImageSize << endl;
}
else if (theCheckFlag)
@@ -82,20 +83,20 @@ main(int argc, char* argv[])
if (theDownFlag)
aNewImageBase -= theOffset;
- ULONG anOldImageSize, anOldImageBase, aNewImageSize;
- ULONG aPrevNewImageBase = aNewImageBase;
- BOOL aStatus = ReBaseImage(
- const_cast<char*>(aFile.c_str()), // CurrentImageName
- 0, // SymbolPath
- TRUE, // fReBase
- FALSE, // fRebaseSysfileOk
- theDownFlag, // fGoingDown
- 0, // CheckImageSize
- &anOldImageSize, // OldImageSize
- &anOldImageBase, // OldImageBase
- &aNewImageSize, // NewImageSize
- &aNewImageBase, // NewImageBase
- time(0)); // TimeStamp
+ ULONG anOldImageSize, aNewImageSize;
+ ULONG64 anOldImageBase;
+ ULONG64 aPrevNewImageBase = aNewImageBase;
+ ReBaseImage64(const_cast<char*>(aFile.c_str()), // CurrentImageName
+ 0, // SymbolPath
+ TRUE, // fReBase
+ FALSE, // fRebaseSysfileOk
+ theDownFlag, // fGoingDown
+ 0, // CheckImageSize
+ &anOldImageSize, // OldImageSize
+ &anOldImageBase, // OldImageBase
+ &aNewImageSize, // NewImageSize
+ &aNewImageBase, // NewImageBase
+ time(0)); // TimeStamp
// ReBaseImage seems to never returns false!
DWORD aStatus2 = GetLastError();
Index: rebaseimage.cc
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/rebaseimage.cc,v
retrieving revision 1.3
diff -u -p -r1.3 rebaseimage.cc
--- rebaseimage.cc 21 Jun 2011 09:35:21 -0000 1.3
+++ rebaseimage.cc 7 Jul 2011 19:17:37 -0000
@@ -24,7 +24,7 @@
#include "objectfile.h"
#include "imagehelper.h"
-BOOL ReBaseImage(
+BOOL ReBaseImage64 (
LPCSTR CurrentImageName,
LPCSTR SymbolPath, // ignored
BOOL fReBase,
@@ -32,9 +32,9 @@ BOOL ReBaseImage(
BOOL fGoingDown,
ULONG CheckImageSize, // ignored
ULONG *OldImageSize,
- ULONG *OldImageBase,
+ ULONG64 *OldImageBase,
ULONG *NewImageSize,
- ULONG *NewImageBase,
+ ULONG64 *NewImageBase,
ULONG TimeStamp
)
{
@@ -60,12 +60,22 @@ BOOL ReBaseImage(
return false;
}
- PIMAGE_NT_HEADERS ntheader = dll.getNTHeader();
+ PIMAGE_NT_HEADERS32 ntheader32 = dll.getNTHeader32 ();
+ PIMAGE_NT_HEADERS64 ntheader64 = dll.getNTHeader64 ();
// set new header elements
- *OldImageBase = ntheader->OptionalHeader.ImageBase;
- *OldImageSize = ntheader->OptionalHeader.SizeOfImage;
- *NewImageSize = ntheader->OptionalHeader.SizeOfImage;
+ if (dll.is64bit ())
+ {
+ *OldImageBase = ntheader64->OptionalHeader.ImageBase;
+ *OldImageSize = ntheader64->OptionalHeader.SizeOfImage;
+ *NewImageSize = ntheader64->OptionalHeader.SizeOfImage;
+ }
+ else
+ {
+ *OldImageBase = ntheader32->OptionalHeader.ImageBase;
+ *OldImageSize = ntheader32->OptionalHeader.SizeOfImage;
+ *NewImageSize = ntheader32->OptionalHeader.SizeOfImage;
+ }
// Round NewImageSize to be consistent with MS's rebase.
const ULONG imageSizeGranularity = 0x10000;
@@ -77,7 +87,8 @@ BOOL ReBaseImage(
*NewImageBase -= *NewImageSize;
// already rebased
- if (ntheader->OptionalHeader.ImageBase == *NewImageBase)
+ if ((dll.is64bit () && ntheader64->OptionalHeader.ImageBase == *NewImageBase)
+ || (dll.is32bit () && ntheader32->OptionalHeader.ImageBase == *NewImageBase))
{
if (!fGoingDown)
*NewImageBase += *NewImageSize;
@@ -87,8 +98,16 @@ BOOL ReBaseImage(
return true;
}
- ntheader->OptionalHeader.ImageBase = *NewImageBase;
- ntheader->FileHeader.TimeDateStamp = TimeStamp;
+ if (dll.is64bit ())
+ {
+ ntheader64->OptionalHeader.ImageBase = *NewImageBase;
+ ntheader64->FileHeader.TimeDateStamp = TimeStamp;
+ }
+ else
+ {
+ ntheader32->OptionalHeader.ImageBase = *NewImageBase;
+ ntheader32->FileHeader.TimeDateStamp = TimeStamp;
+ }
int difference = *NewImageBase - *OldImageBase;
@@ -106,3 +125,28 @@ BOOL ReBaseImage(
SetLastError(NO_ERROR);
return true;
}
+
+BOOL ReBaseImage (
+ LPCSTR CurrentImageName,
+ LPCSTR SymbolPath, // ignored
+ BOOL fReBase,
+ BOOL fRebaseSysfileOk, // ignored
+ BOOL fGoingDown,
+ ULONG CheckImageSize, // ignored
+ ULONG *OldImageSize,
+ ULONG *OldImageBase,
+ ULONG *NewImageSize,
+ ULONG *NewImageBase,
+ ULONG TimeStamp
+)
+{
+ ULONG64 old_base = *OldImageBase;
+ ULONG64 new_base = *NewImageBase;
+ BOOL ret = ReBaseImage64 (CurrentImageName, SymbolPath, fReBase,
+ fRebaseSysfileOk, fGoingDown, CheckImageSize,
+ OldImageSize, &old_base, NewImageSize, &new_base,
+ TimeStamp);
+ *OldImageBase = (ULONG) old_base;
+ *NewImageBase = (ULONG) new_base;
+ return ret;
+}
Index: rebind_main.cc
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/rebind_main.cc,v
retrieving revision 1.2
diff -u -p -r1.2 rebind_main.cc
--- rebind_main.cc 20 Jun 2011 23:26:26 -0000 1.2
+++ rebind_main.cc 7 Jul 2011 19:17:37 -0000
@@ -67,9 +67,6 @@ main(int argc, char* argv[])
for (int i= 1; i < argc; i++)
{
- char *a = argv[i];
- char *b = NULL;
- char *c = NULL;
LinkedObjectFile dll(argv[i]);
// FIXME: add this stuff
// dll.checkRelocations();
Index: sections.cc
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/sections.cc,v
retrieving revision 1.3
diff -u -p -r1.3 sections.cc
--- sections.cc 21 Jun 2011 15:33:15 -0000 1.3
+++ sections.cc 7 Jul 2011 19:17:37 -0000
@@ -30,7 +30,8 @@ int Base::debug = 0;
Section::Section(void *aFileBase, SectionHeader *p)
{
header = p;
- adjust = (uint)header->PointerToRawData + (uint) aFileBase - header->VirtualAddress;
+ adjust = (uintptr_t) header->PointerToRawData
+ + (uintptr_t) aFileBase - header->VirtualAddress;
strncpy(Name,(char *)header->Name,8);
Name[8] = '\0';
}
@@ -71,11 +72,20 @@ bool Section::isIn(uint addr)
SectionList::SectionList(void *aFileBase)
{
PIMAGE_DOS_HEADER dosheader = (PIMAGE_DOS_HEADER) aFileBase;
- PIMAGE_NT_HEADERS ntheader = (PIMAGE_NT_HEADERS) ((char *)dosheader + dosheader->e_lfanew);
+ PIMAGE_NT_HEADERS32 ntheader32 = (PIMAGE_NT_HEADERS32) ((char *)dosheader + dosheader->e_lfanew);
+ PIMAGE_NT_HEADERS64 ntheader64 = (PIMAGE_NT_HEADERS64) ntheader32;
- header = (SectionHeader *) (ntheader+1);
- FileBase = (uint) aFileBase;
- count = ntheader->FileHeader.NumberOfSections;
+ FileBase = (uintptr_t) aFileBase;
+ if (ntheader32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
+ {
+ header = (SectionHeader *) (ntheader64+1);
+ count = ntheader64->FileHeader.NumberOfSections;
+ }
+ else
+ {
+ header = (SectionHeader *) (ntheader32+1);
+ count = ntheader32->FileHeader.NumberOfSections;
+ }
for (int i = 0; i < count; i++)
{
sections[i] = new Section(aFileBase,&header[i]);
@@ -291,7 +301,7 @@ bool Relocations::check(void)
{
int NumOfRelocs = (relocp->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof (WORD);
int va = relocp->VirtualAddress;
- PWORD p = (PWORD)((unsigned int )relocp + sizeof(IMAGE_BASE_RELOCATION));
+ PWORD p = (PWORD)((uintptr_t)relocp + sizeof(IMAGE_BASE_RELOCATION));
if (debug)
std::cerr << "debug: blocksize= " << std::dec << NumOfRelocs << std::endl;
@@ -367,7 +377,7 @@ bool Relocations::relocate(int differenc
{
int NumOfRelocs = (relocp->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof (WORD);
int va = relocp->VirtualAddress;
- PWORD p = (PWORD)((unsigned int )relocp + sizeof(IMAGE_BASE_RELOCATION));
+ PWORD p = (PWORD)((uintptr_t)relocp + sizeof(IMAGE_BASE_RELOCATION));
if (debug)
{
std::cerr << "VirtAdress: 0x" \
Index: sections.h
===================================================================
RCS file: /sourceware/projects/cygwin-apps-home/cvsfiles/rebase/imagehelper/sections.h,v
retrieving revision 1.3
diff -u -p -r1.3 sections.h
--- sections.h 21 Jun 2011 15:33:15 -0000 1.3
+++ sections.h 7 Jul 2011 19:17:37 -0000
@@ -135,7 +135,7 @@ class SectionList : public Base
Section *getNext(void);
private:
- uint FileBase;
+ uintptr_t FileBase;
SectionHeader *header;
Section *sections[SECTIONLIST_MAXSECTIONS];
int count;
--
Corinna Vinschen Please, send mails regarding Cygwin to
Cygwin Project Co-Leader cygwin AT cygwin DOT com
Red Hat