aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/Loaders/Executables/NxRelocatableObject.cs
blob: e68fe2670e8e62c911ba3b212cdfd1eadbc20f89 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System.IO;

namespace Ryujinx.HLE.Loaders.Executables
{
    class NxRelocatableObject : IExecutable
    {
        public byte[] Text { get; private set; }
        public byte[] Ro   { get; private set; }
        public byte[] Data { get; private set; }

        public int Mod0Offset { get; private set; }
        public int TextOffset { get; private set; }
        public int RoOffset   { get; private set; }
        public int DataOffset { get; private set; }
        public int BssSize    { get; private set; }
        public int FileSize   { get; private set; }

        public int BssOffset => DataOffset + Data.Length;

        public ulong SourceAddress { get; private set; }
        public ulong BssAddress    { get; private set; }

        public NxRelocatableObject(Stream input, ulong sourceAddress = 0, ulong bssAddress = 0)
        {
            SourceAddress = sourceAddress;
            BssAddress    = bssAddress;

            BinaryReader reader = new BinaryReader(input);

            input.Seek(4, SeekOrigin.Begin);

            int mod0Offset = reader.ReadInt32();
            int padding8   = reader.ReadInt32();
            int paddingC   = reader.ReadInt32();
            int nroMagic   = reader.ReadInt32();
            int unknown14  = reader.ReadInt32();
            int fileSize   = reader.ReadInt32();
            int unknown1C  = reader.ReadInt32();
            int textOffset = reader.ReadInt32();
            int textSize   = reader.ReadInt32();
            int roOffset   = reader.ReadInt32();
            int roSize     = reader.ReadInt32();
            int dataOffset = reader.ReadInt32();
            int dataSize   = reader.ReadInt32();
            int bssSize    = reader.ReadInt32();

            Mod0Offset = mod0Offset;
            TextOffset = textOffset;
            RoOffset   = roOffset;
            DataOffset = dataOffset;
            BssSize    = bssSize;

            byte[] Read(long position, int size)
            {
                input.Seek(position, SeekOrigin.Begin);

                return reader.ReadBytes(size);
            }

            Text = Read(textOffset, textSize);
            Ro   = Read(roOffset,   roSize);
            Data = Read(dataOffset, dataSize);

            FileSize = fileSize;
        }
    }
}