module Main ( main ) where import Language.Elna.CommandLine (CommandLine(..), commandLine, execParser) import Language.Elna.Object.Elf ( Elf32_Ehdr(..) , ElfMachine(..) , ElfType(..) , ElfVersion(..) , ElfIdentification(..) , ElfClass(..) , ElfData(..) , Elf32_Shdr(..) , ElfSectionType(..) , elfHeaderSize , elfObject ) import qualified Data.ByteString as ByteString import Data.Vector (Vector) import qualified Data.Vector as Vector import Data.Maybe (fromMaybe) import System.IO (Handle) import System.FilePath (replaceExtension, takeFileName) riscv32Elf :: Handle -> IO (Vector Elf32_Shdr) riscv32Elf objectHandle = let stringTable = "\0shstrtab\0" written = Vector.fromList [ Elf32_Shdr { sh_type = SHT_NULL , sh_size = 0 , sh_offset = 0 , sh_name = 0 , sh_link = 0 , sh_info = 0 , sh_flags = 0 , sh_entsize = 0 , sh_addralign = 0 , sh_addr = 0 } , Elf32_Shdr { sh_type = SHT_STRTAB , sh_size = fromIntegral $ ByteString.length stringTable , sh_offset = fromIntegral elfHeaderSize , sh_name = 1 , sh_link = 0 , sh_info = 0 , sh_flags = 0 , sh_entsize = 0 , sh_addralign = 0 , sh_addr = 0 } ] in ByteString.hPut objectHandle stringTable >> pure written riscv32Header :: Elf32_Ehdr riscv32Header = Elf32_Ehdr { e_version = EV_CURRENT , e_type = ET_REL , e_shstrndx = 1 -- String table. SHN_UNDEF , e_shoff = 0 , e_shnum = 2 , e_shentsize = 40 , e_phoff = 0 , e_phnum = 0 , e_phentsize = 32 , e_machine = EM_RISCV , e_ident = ElfIdentification ELFCLASS32 ELFDATA2LSB , e_flags = 0x4 -- EF_RISCV_FLOAT_ABI_DOUBLE , e_entry = 0 , e_ehsize = fromIntegral elfHeaderSize } main :: IO () main = execParser commandLine >>= withCommandLine where withCommandLine CommandLine{..} = let defaultOutput = replaceExtension (takeFileName input) "o" in elfObject (fromMaybe defaultOutput output) riscv32Header riscv32Elf