Add symbol entry header structure

This commit is contained in:
Eugen Wissner 2024-09-01 21:40:08 +02:00
parent 7979c0cd23
commit a66365eef4
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
3 changed files with 44 additions and 4 deletions

View File

@ -19,6 +19,7 @@ common warnings
base ^>=4.19.1.0, base ^>=4.19.1.0,
bytestring ^>= 0.12.1, bytestring ^>= 0.12.1,
megaparsec ^>= 9.6, megaparsec ^>= 9.6,
vector ^>= 0.13.1,
text ^>= 2.0 text ^>= 2.0
ghc-options: -Wall ghc-options: -Wall
default-extensions: default-extensions:
@ -37,7 +38,6 @@ library elna-internal
hashable ^>= 1.4.3, hashable ^>= 1.4.3,
parser-combinators ^>= 1.3, parser-combinators ^>= 1.3,
transformers ^>= 0.6.1, transformers ^>= 0.6.1,
vector ^>= 0.13.1,
unordered-containers ^>= 0.2.20 unordered-containers ^>= 0.2.20
hs-source-dirs: lib hs-source-dirs: lib

View File

@ -6,6 +6,7 @@ module Language.Elna.Object.Elf
, Elf32_Sword , Elf32_Sword
, Elf32_Ehdr(..) , Elf32_Ehdr(..)
, Elf32_Shdr(..) , Elf32_Shdr(..)
, Elf32_Sym(..)
, ElfIdentification(..) , ElfIdentification(..)
, ElfMachine(..) , ElfMachine(..)
, ElfVersion(..) , ElfVersion(..)
@ -19,12 +20,13 @@ module Language.Elna.Object.Elf
, elf32Sword , elf32Sword
, elf32Word , elf32Word
, elf32Ehdr , elf32Ehdr
, elf32Sym
, elfIdentification , elfIdentification
) where ) where
import qualified Data.ByteString.Builder as ByteString.Builder import qualified Data.ByteString.Builder as ByteString.Builder
import Data.Int (Int32) import Data.Int (Int32)
import Data.Word (Word16, Word32) import Data.Word (Word8, Word16, Word32)
import qualified Data.ByteString as ByteString import qualified Data.ByteString as ByteString
-- * Data types. -- * Data types.
@ -190,6 +192,17 @@ instance Enum ElfType
fromEnum ET_LOPROC = 0xff00 fromEnum ET_LOPROC = 0xff00
fromEnum ET_HIPROC = 0xffff fromEnum ET_HIPROC = 0xffff
data Elf32_Sym = Elf32_Sym
{ st_name :: Elf32_Word
, st_value :: Elf32_Addr
, st_size :: Elf32_Word
, st_info :: Word8
, st_other :: Word8
, st_shndx :: Elf32_Half
} deriving Eq
-- * Help types.
data ByteOrder = LSB | MSB data ByteOrder = LSB | MSB
deriving Eq deriving Eq
@ -272,3 +285,12 @@ elf32Shdr byteOrder Elf32_Shdr{..}
<> elf32Word byteOrder sh_info <> elf32Word byteOrder sh_info
<> elf32Word byteOrder sh_addralign <> elf32Word byteOrder sh_addralign
<> elf32Word byteOrder sh_entsize <> elf32Word byteOrder sh_entsize
elf32Sym :: ByteOrder -> Elf32_Sym -> ByteString.Builder.Builder
elf32Sym byteOrder Elf32_Sym{..}
= elf32Word byteOrder st_name
<> elf32Addr byteOrder st_value
<> elf32Word byteOrder st_size
<> ByteString.Builder.word8 st_info
<> ByteString.Builder.word8 st_other
<> elf32Half byteOrder st_shndx

View File

@ -2,9 +2,11 @@ module Main
( main ( main
) where ) where
import Language.Elna.Object.Elf () import Language.Elna.Object.Elf (Elf32_Sym(..))
import Data.ByteString (ByteString) import Data.ByteString (ByteString)
import qualified Data.ByteString as ByteString import qualified Data.ByteString as ByteString
import Data.Vector (Vector)
import qualified Data.Vector as Vector
import Data.Bits (Bits(..)) import Data.Bits (Bits(..))
data Chunk data Chunk
@ -20,7 +22,7 @@ instance Show Chunk
show (SymbolDefinitionChunk label chunk) show (SymbolDefinitionChunk label chunk)
= "SymbolDefinitionChunk " = "SymbolDefinitionChunk "
<> show label <> show label
<> "(Size: " <> " (Size: "
<> show (ByteString.length chunk) <> show (ByteString.length chunk)
<> ")" <> ")"
@ -39,6 +41,22 @@ splitContents accumulator remaining
in splitContents (SymbolDefinitionChunk label chunk : accumulator) remaining' in splitContents (SymbolDefinitionChunk label chunk : accumulator) remaining'
_ -> ExternSymbolChunk label : accumulator _ -> ExternSymbolChunk label : accumulator
go
:: Chunk
-> (Vector Elf32_Sym, Vector ByteString)
-> (Vector Elf32_Sym, Vector ByteString)
go (ExternSymbolChunk symbolName) (symbolEntries, stringTable) =
let symbolEntry = Elf32_Sym
{ st_name = fromIntegral $ Vector.foldr ((+) . ByteString.length) 0 stringTable
, st_value = 0
, st_size = 0
, st_info = shiftL 1 4 -- STB_GLOBAL and STT_NOTYPE
, st_other = 0
, st_shndx = 0 -- SHN_UNDEF
}
in (Vector.snoc symbolEntries symbolEntry, Vector.snoc stringTable symbolName)
go (SymbolDefinitionChunk _ _) _acc = undefined
main :: IO () main :: IO ()
main = do main = do
contents <- ByteString.getContents contents <- ByteString.getContents