# yaml2obj

yaml2obj takes a YAML description of an object file and converts it to a binary file.

> $ yaml2obj input-file

Outputs the binary to stdout.

## COFF Syntax

Here’s a sample COFF file.

    header:
      Machine: IMAGE_FILE_MACHINE_I386 # (0x14C)

    sections:
      - Name: .text
        Characteristics: [ IMAGE_SCN_CNT_CODE
                         , IMAGE_SCN_ALIGN_16BYTES
                         , IMAGE_SCN_MEM_EXECUTE
                         , IMAGE_SCN_MEM_READ
                         ] # 0x60500020
        SectionData:
          "\x83\xEC\x0C\xC7\x44\x24\x08\x00\x00\x00\x00\xC7\x04\x24\x00\x00\x00\x00\xE8\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x8B\x44\x24\x08\x83\xC4\x0C\xC3" # |....D$.......$...............D$.....|
      - Name: .rdata
        Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
        StructuredData:
          - Binary: {type: str}
          - UInt32: {type: int}
          - LoadConfig:
            Size: {type: int}
            TimeDateStamp: {type: int}
            MajorVersion: {type: int}
            MinorVersion: {type: int}
            GlobalFlagsClear: {type: int}
            GlobalFlagsSet: {type: int}
            CriticalSectionDefaultTimeout: {type: int}
            DeCommitFreeBlockThreshold: {type: int}
            DeCommitTotalFreeThreshold: {type: int}
            LockPrefixTable: {type: int}
            MaximumAllocationSize: {type: int}
            VirtualMemoryThreshold: {type: int}
            ProcessAffinityMask: {type: int}
            ProcessHeapFlags: {type: int}
            CSDVersion: {type: int}
            DependentLoadFlags: {type: int}
            EditList: {type: int}
            SecurityCookie: {type: int}
            SEHandlerTable: {type: int}
            SEHandlerCount: {type: int}
            GuardCFCheckFunction: {type: int}
            GuardCFCheckDispatch: {type: int}
            GuardCFFunctionTable: {type: int}
            GuardCFFunctionCount: {type: int}
            GuardFlags: {type: int}
            CodeIntegrity:
              Flags: {type: int}
              Catalog: {type: int}
              CatalogOffset: {type: int}
            GuardAddressTakenIatEntryTable: {type: int}
            GuardAddressTakenIatEntryCount: {type: int}
            GuardLongJumpTargetTable: {type: int}
            GuardLongJumpTargetCount: {type: int}
            DynamicValueRelocTable: {type: int}
            CHPEMetadataPointer: {type: int}
            GuardRFFailureRoutine: {type: int}
            GuardRFFailureRoutineFunctionPointer: {type: int}
            DynamicValueRelocTableOffset: {type: int}
            DynamicValueRelocTableSection: {type: int}
            GuardRFVerifyStackPointerFunctionPointer: {type: int}
            HotPatchTableOffset: {type: int}
            EnclaveConfigurationPointer: {type: int}
            VolatileMetadataPointer: {type: int}
            GuardEHContinuationTable: {type: int}
            GuardEHContinuationCount: {type: int}
            GuardXFGCheckFunctionPointer: {type: int}
            GuardXFGDispatchFunctionPointer: {type: int}
            GuardXFGTableDispatchFunctionPointer: {type: int}
            CastGuardOsDeterminedFailureMode: {type: int}

    symbols:
      - Name: .text
        Value: 0
        SectionNumber: 1
        SimpleType: IMAGE_SYM_TYPE_NULL # (0)
        ComplexType: IMAGE_SYM_DTYPE_NULL # (0)
        StorageClass: IMAGE_SYM_CLASS_STATIC # (3)
        NumberOfAuxSymbols: 1
        AuxiliaryData:
          "\x24\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00" # |$.................|

      - Name: _main
        Value: 0
        SectionNumber: 1
        SimpleType: IMAGE_SYM_TYPE_NULL # (0)
        ComplexType: IMAGE_SYM_DTYPE_NULL # (0)
        StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2)

Here’s a simplified Kwalify schema with an extension to allow alternate types.

    type: map
      mapping:
        header:
          type: map
          mapping:
            Machine: [ {type: str, enum:
                                   [ IMAGE_FILE_MACHINE_UNKNOWN
                                   , IMAGE_FILE_MACHINE_AM33
                                   , IMAGE_FILE_MACHINE_AMD64
                                   , IMAGE_FILE_MACHINE_ARM
                                   , IMAGE_FILE_MACHINE_ARMNT
                                   , IMAGE_FILE_MACHINE_ARM64
                                   , IMAGE_FILE_MACHINE_EBC
                                   , IMAGE_FILE_MACHINE_I386
                                   , IMAGE_FILE_MACHINE_IA64
                                   , IMAGE_FILE_MACHINE_M32R
                                   , IMAGE_FILE_MACHINE_MIPS16
                                   , IMAGE_FILE_MACHINE_MIPSFPU
                                   , IMAGE_FILE_MACHINE_MIPSFPU16
                                   , IMAGE_FILE_MACHINE_POWERPC
                                   , IMAGE_FILE_MACHINE_POWERPCFP
                                   , IMAGE_FILE_MACHINE_R4000
                                   , IMAGE_FILE_MACHINE_SH3
                                   , IMAGE_FILE_MACHINE_SH3DSP
                                   , IMAGE_FILE_MACHINE_SH4
                                   , IMAGE_FILE_MACHINE_SH5
                                   , IMAGE_FILE_MACHINE_THUMB
                                   , IMAGE_FILE_MACHINE_WCEMIPSV2
                                   ]}
                     , {type: int}
                     ]
            Characteristics:
              - type: seq
                sequence:
                  - type: str
                    enum: [ IMAGE_FILE_RELOCS_STRIPPED
                          , IMAGE_FILE_EXECUTABLE_IMAGE
                          , IMAGE_FILE_LINE_NUMS_STRIPPED
                          , IMAGE_FILE_LOCAL_SYMS_STRIPPED
                          , IMAGE_FILE_AGGRESSIVE_WS_TRIM
                          , IMAGE_FILE_LARGE_ADDRESS_AWARE
                          , IMAGE_FILE_BYTES_REVERSED_LO
                          , IMAGE_FILE_32BIT_MACHINE
                          , IMAGE_FILE_DEBUG_STRIPPED
                          , IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
                          , IMAGE_FILE_NET_RUN_FROM_SWAP
                          , IMAGE_FILE_SYSTEM
                          , IMAGE_FILE_DLL
                          , IMAGE_FILE_UP_SYSTEM_ONLY
                          , IMAGE_FILE_BYTES_REVERSED_HI
                          ]
              - type: int
        sections:
          type: seq
          sequence:
            - type: map
              mapping:
                Name: {type: str}
                Characteristics:
                  - type: seq
                    sequence:
                      - type: str
                        enum: [ IMAGE_SCN_TYPE_NO_PAD
                              , IMAGE_SCN_CNT_CODE
                              , IMAGE_SCN_CNT_INITIALIZED_DATA
                              , IMAGE_SCN_CNT_UNINITIALIZED_DATA
                              , IMAGE_SCN_LNK_OTHER
                              , IMAGE_SCN_LNK_INFO
                              , IMAGE_SCN_LNK_REMOVE
                              , IMAGE_SCN_LNK_COMDAT
                              , IMAGE_SCN_GPREL
                              , IMAGE_SCN_MEM_PURGEABLE
                              , IMAGE_SCN_MEM_16BIT
                              , IMAGE_SCN_MEM_LOCKED
                              , IMAGE_SCN_MEM_PRELOAD
                              , IMAGE_SCN_ALIGN_1BYTES
                              , IMAGE_SCN_ALIGN_2BYTES
                              , IMAGE_SCN_ALIGN_4BYTES
                              , IMAGE_SCN_ALIGN_8BYTES
                              , IMAGE_SCN_ALIGN_16BYTES
                              , IMAGE_SCN_ALIGN_32BYTES
                              , IMAGE_SCN_ALIGN_64BYTES
                              , IMAGE_SCN_ALIGN_128BYTES
                              , IMAGE_SCN_ALIGN_256BYTES
                              , IMAGE_SCN_ALIGN_512BYTES
                              , IMAGE_SCN_ALIGN_1024BYTES
                              , IMAGE_SCN_ALIGN_2048BYTES
                              , IMAGE_SCN_ALIGN_4096BYTES
                              , IMAGE_SCN_ALIGN_8192BYTES
                              , IMAGE_SCN_LNK_NRELOC_OVFL
                              , IMAGE_SCN_MEM_DISCARDABLE
                              , IMAGE_SCN_MEM_NOT_CACHED
                              , IMAGE_SCN_MEM_NOT_PAGED
                              , IMAGE_SCN_MEM_SHARED
                              , IMAGE_SCN_MEM_EXECUTE
                              , IMAGE_SCN_MEM_READ
                              , IMAGE_SCN_MEM_WRITE
                              ]
                  - type: int
                SectionData: {type: str}
        symbols:
          type: seq
          sequence:
            - type: map
              mapping:
                Name: {type: str}
                Value: {type: int}
                SectionNumber: {type: int}
                SimpleType: [ {type: str, enum: [ IMAGE_SYM_TYPE_NULL
                                                , IMAGE_SYM_TYPE_VOID
                                                , IMAGE_SYM_TYPE_CHAR
                                                , IMAGE_SYM_TYPE_SHORT
                                                , IMAGE_SYM_TYPE_INT
                                                , IMAGE_SYM_TYPE_LONG
                                                , IMAGE_SYM_TYPE_FLOAT
                                                , IMAGE_SYM_TYPE_DOUBLE
                                                , IMAGE_SYM_TYPE_STRUCT
                                                , IMAGE_SYM_TYPE_UNION
                                                , IMAGE_SYM_TYPE_ENUM
                                                , IMAGE_SYM_TYPE_MOE
                                                , IMAGE_SYM_TYPE_BYTE
                                                , IMAGE_SYM_TYPE_WORD
                                                , IMAGE_SYM_TYPE_UINT
                                                , IMAGE_SYM_TYPE_DWORD
                                                ]}
                            , {type: int}
                            ]
                ComplexType: [ {type: str, enum: [ IMAGE_SYM_DTYPE_NULL
                                                 , IMAGE_SYM_DTYPE_POINTER
                                                 , IMAGE_SYM_DTYPE_FUNCTION
                                                 , IMAGE_SYM_DTYPE_ARRAY
                                                 ]}
                             , {type: int}
                             ]
                StorageClass: [ {type: str, enum:
                                            [ IMAGE_SYM_CLASS_END_OF_FUNCTION
                                            , IMAGE_SYM_CLASS_NULL
                                            , IMAGE_SYM_CLASS_AUTOMATIC
                                            , IMAGE_SYM_CLASS_EXTERNAL
                                            , IMAGE_SYM_CLASS_STATIC
                                            , IMAGE_SYM_CLASS_REGISTER
                                            , IMAGE_SYM_CLASS_EXTERNAL_DEF
                                            , IMAGE_SYM_CLASS_LABEL
                                            , IMAGE_SYM_CLASS_UNDEFINED_LABEL
                                            , IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
                                            , IMAGE_SYM_CLASS_ARGUMENT
                                            , IMAGE_SYM_CLASS_STRUCT_TAG
                                            , IMAGE_SYM_CLASS_MEMBER_OF_UNION
                                            , IMAGE_SYM_CLASS_UNION_TAG
                                            , IMAGE_SYM_CLASS_TYPE_DEFINITION
                                            , IMAGE_SYM_CLASS_UNDEFINED_STATIC
                                            , IMAGE_SYM_CLASS_ENUM_TAG
                                            , IMAGE_SYM_CLASS_MEMBER_OF_ENUM
                                            , IMAGE_SYM_CLASS_REGISTER_PARAM
                                            , IMAGE_SYM_CLASS_BIT_FIELD
                                            , IMAGE_SYM_CLASS_BLOCK
                                            , IMAGE_SYM_CLASS_FUNCTION
                                            , IMAGE_SYM_CLASS_END_OF_STRUCT
                                            , IMAGE_SYM_CLASS_FILE
                                            , IMAGE_SYM_CLASS_SECTION
                                            , IMAGE_SYM_CLASS_WEAK_EXTERNAL
                                            , IMAGE_SYM_CLASS_CLR_TOKEN
                                            ]}
                              , {type: int}
                              ]