dwarfadt-0.2.0.0: src/Data/Dwarf/Elf.hs
module Data.Dwarf.Elf
( loadElfDwarf
, elfSectionByName
, parseElfDwarfADT
) where
import Control.Applicative (Applicative(..), (<$>))
import Data.Dwarf.ADT (Dwarf)
import Data.Elf (parseElf, Elf(..), ElfSection(..))
import Data.List (find)
import System.IO.Posix.MMap (unsafeMMapFile)
import qualified Data.ByteString as BS
import qualified Data.Dwarf as Dwarf
import qualified Data.Dwarf.ADT as Dwarf.ADT
elfSectionByName :: Elf -> String -> Either String BS.ByteString
elfSectionByName elf name =
maybe (Left ("Missing section " ++ name)) Right .
fmap elfSectionData .
find ((== name) . elfSectionName) $ elfSections elf
loadElfDwarf :: Dwarf.Endianess -> FilePath -> IO (Elf, ([Dwarf.DIE], Dwarf.DIEMap))
loadElfDwarf endianess filename = do
bs <- unsafeMMapFile filename
let elf = parseElf bs
get = elfSectionByName elf
sections <-
either fail return $
Dwarf.Sections
<$> get ".debug_info"
<*> get ".debug_abbrev"
<*> get ".debug_str"
pure (elf, Dwarf.parseInfo endianess sections)
parseElfDwarfADT :: Dwarf.Endianess -> FilePath -> IO (Dwarf, [Dwarf.ADT.Warning])
parseElfDwarfADT endianess filename = do
(_elf, (cuDies, dieMap)) <- loadElfDwarf endianess filename
pure $ Dwarf.ADT.fromDies dieMap cuDies