summaryrefslogtreecommitdiffhomepage
path: root/C++Kit/StdKit/PEF.hpp
blob: 2addbf3f723669688800feef48fe852b32dbee50 (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
 *	========================================================
 *
 *	C++Kit
 * 	Copyright WestCo, all rights reserved.
 *
 * 	========================================================
 */

#pragma once

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

#define kPefMagic    "PEF"
#define kPefMagicFat "FEP"

#define kPefMagicLen 3

#define kPefVersion 1
#define kPefNameLen 64

// Protable Executable Format, a format designed for any computer.

namespace CxxKit
{
    enum
    {
        kPefArchIntel86S = 100,
        kPefArchAMD64,
        kPefArchRISCV,
	    kPefArchARC, /* Advanced RISC architecture. */
        kPefArchNewCPU = kPefArchARC,
        kPefArch64000 = kPefArchNewCPU,
        kPefArchPowerPC,
        kPefArchARM64,
        kPefArchInvalid = 0xFF,
    };

    enum
    {
        kPefKindExec = 1, /* .o/.pef/<none>  */
        kPefKindSharedObject = 2, /* .lib */
        kPefKindObject = 4, /* .obj */
        kPefKindDwarf = 5, /* .dsym */
    };

    /* PEF container */
    typedef struct PEFContainer final
    {
        CharType Magic[kPefMagicLen];
        UInt32 Linker;
        UInt32 Version;
        UInt32 Kind;
        UInt32 Abi;
        UInt32 Cpu;
        UInt32 SubCpu; /* Cpu specific information */
        UIntPtr Start;
        SizeType HdrSz; /* Size of header */
        SizeType Count; /* container header count */
    } __attribute__((packed)) PEFContainer;

    /* First PEFCommandHeader starts after PEFContainer */
    /* Last container is __exec_end */

    /* PEF executable section and commands. */

    typedef struct PEFCommandHeader final
    {
        CharType Name[kPefNameLen]; /* container name */
        UInt32 Flags; /* container flags */
        UInt16 Kind; /* container kind */
        UIntPtr Offset; /* file offset */
        SizeType Size; /* file size */
    } __attribute__((packed)) PEFCommandHeader;

    enum
    {
        kPefCode = 0xC,
        kPefData = 0xD,
        kPefZero = 0xE,
	    kPefLinkerID = 0x1,
    };
}

#define kPefExt ".o"
#define kPefDylibExt ".so"
#define kPefObjectExt ".o"
#define kPefDebugExt ".dbg"
#define kPefOrgMagic 0xFFAABBAA00