summaryrefslogtreecommitdiffhomepage
path: root/C++Kit/StdKit/AE.hpp
blob: bf5f728a11a077e7d9a3ebe89ad4554826cb0cae (plain)
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
/*
 * ========================================================
 *
 *      C++Kit
 *      Copyright WestCo, all rights reserved.
 *
 * ========================================================
 */

#pragma once

#include <C++Kit/Defines.hpp>

#define kAEMag0 'A'
#define kAEMag1 'E'

#define kAESymbolLen 64
#define kAEPad    8
#define kAEMagLen 2
#define kAEInvalidOpcode 0x00

// Advanced Executable File Format for MetroLink.
// Reloctable by offset is the default strategy.
// You can also relocate at runtime but that's up to the operating system loader.

namespace CxxKit
{
	// @brief Advanced Executable Header
	// One thing to keep in mind.
	// This object format, is reloctable.
	typedef struct AEHeader final
	{
		CharType fMagic[kAEMagLen];
		CharType fArch;
		SizeType fCount;
		CharType fSize;
        SizeType fStartCode;
        SizeType fCodeSize;
		CharType fPad[kAEPad];
	} __attribute__((packed)) AEHeader, *AEHeaderPtr;

	// @brief Advanced Executable Record.
	// Could be data, code or bss.
	// fKind must be filled with PEF fields.

	typedef struct AERecordHeader final
	{
		CharType fName[kAESymbolLen];
        SizeType fKind;
		SizeType fSize;
		SizeType fFlags;
		UIntPtr fOffset;
        CharType fPad[kAEPad];
	} __attribute__((packed)) AERecordHeader, *AERecordHeaderPtr;

	enum
	{
		kKindRelocationByOffset = 0x23f,
		kKindRelocationAtRuntime = 0x34f,
	};
}