[Mono-dev] RVA Irregularities
Kornél Pál
kornelpal at gmail.com
Tue Jan 6 18:04:18 EST 2009
Hi,
I don't know how ProcessModule.BaseAddress is implemented on Linux but
you shouldn't use this.
If you want to look at the IL code open the file using FileStream or use
Cecil.
Note that even if you modify IL code that would not affect code that is
already compiled to native code.
Also note that RVA's are not required to be preserved when the image is
loaded to memory.
Mono on Windows is using LoadLibrary in most cases that will map the
image according to the RVAs but Linux has no support for PE files so
images are just loaded without mapping PE sections to their designated
virtual addresses.
Kornél
Nathan McCauley wrote:
> The following code excerpt from the attached C# program behaves
> differently on Mono 2.0.1runtime for Windows and Mono 2.0.1 runtime on
> the OpenSUSE VMWare image. It contains a lookup of the base address
> (contained in getBaseAddress()). The loop should print the program's
> Main() function IL code at runtime. This RVA was found by looking it up
> in ILDASM.
>
> The program was compiled the MS compiler.
>
> IntPtr baseAddr = getBaseAddress();
>
> for (int offset = 0x211c; offset < 0x2169; offset++)
> {
> Console.WriteLine("Addr = {0:X}\tByte = {1:X}",
> baseAddr.ToInt32() + offset,
> Marshal.ReadByte(new IntPtr(baseAddr.ToInt32() + offset)));
> }
>
>
>
> It seems like the loader is behaving differently on each platform. Is
> there something I should be doing to mitigate this behavior?
>
>
> Windows Mono Runtime output:
> Addr = 40211C Byte = 13
> Addr = 40211D Byte = 30
> Addr = 40211E Byte = 4
> Addr = 40211F Byte = 0
> Addr = 402120 Byte = 4B
> Addr = 402121 Byte = 0
> Addr = 402122 Byte = 0
> Addr = 402123 Byte = 0
> Addr = 402124 Byte = 2
> Addr = 402125 Byte = 0
> Addr = 402126 Byte = 0
> Addr = 402127 Byte = 11
> Addr = 402128 Byte = 28
> Addr = 402129 Byte = 1
> Addr = 40212A Byte = 0
> Addr = 40212B Byte = 0
> Addr = 40212C Byte = 6
> Addr = 40212D Byte = A
> Addr = 40212E Byte = 20
> Addr = 40212F Byte = 1C
> Addr = 402130 Byte = 21
> Addr = 402131 Byte = 0
> Addr = 402132 Byte = 0
> Addr = 402133 Byte = B
> Addr = 402134 Byte = 2B
> Addr = 402135 Byte = 34
> Addr = 402136 Byte = 72
> Addr = 402137 Byte = 69
> Addr = 402138 Byte = 0
> Addr = 402139 Byte = 0
>
> Linux Mono Runtime output:
> Addr = B7DDB11C Byte = C
> Addr = B7DDB11D Byte = 2
> Addr = B7DDB11E Byte = 0
> Addr = B7DDB11F Byte = 0
> Addr = B7DDB120 Byte = 1
> Addr = B7DDB121 Byte = 0
> Addr = B7DDB122 Byte = 30
> Addr = B7DDB123 Byte = 0
> Addr = B7DDB124 Byte = 30
> Addr = B7DDB125 Byte = 0
> Addr = B7DDB126 Byte = 30
> Addr = B7DDB127 Byte = 0
> Addr = B7DDB128 Byte = 30
> Addr = B7DDB129 Byte = 0
> Addr = B7DDB12A Byte = 30
> Addr = B7DDB12B Byte = 0
> Addr = B7DDB12C Byte = 34
> Addr = B7DDB12D Byte = 0
> Addr = B7DDB12E Byte = 62
> Addr = B7DDB12F Byte = 0
> Addr = B7DDB130 Byte = 30
> Addr = B7DDB131 Byte = 0
> Addr = B7DDB132 Byte = 0
> Addr = B7DDB133 Byte = 0
> Addr = B7DDB134 Byte = 44
> Addr = B7DDB135 Byte = 0
> Addr = B7DDB136 Byte = E
> Addr = B7DDB137 Byte = 0
> Addr = B7DDB138 Byte = 1
> Addr = B7DDB139 Byte = 0
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
More information about the Mono-devel-list
mailing list