[Haskell-cafe] Linking in Large ByteStrings

Svein Ove Aas svein.ove at aas.no
Fri Jan 1 11:49:50 EST 2010

On Fri, Jan 1, 2010 at 4:09 PM, Tom Hawkins <tomahawkins at gmail.com> wrote:
> I have a large tarball I want to link into an executable as a
> ByteString.  What is the best way to do this?  I can convert the
> tarball into a haskell file, but I'm afraid ghc would take a long time
> to compile it.  Is there any way to link constant data directly with
> ghc?  If not, what's the most efficient way to code large ByteStrings
> for fast compilation?
In the limit, you can convert it to an assembly file.

Something like this, though I've done very little checking indeed of
the syntax. Consider this to be pseudocode.


.global bytestring, bytestring_end
.label bytestring
.db 0x0c 0xdf 0xwhatever
.label bytestring_end

import Foreign
import Data.ByteString.Internal

foreign import ptr bytestring :: Ptr Word8
foreign import ptr bytestring_end :: Ptr Word8

yourString :: ByteString
yourString = unsafePerformIO $ do
  fptr <- newForeignPtr_ bytestring
  return $ fromForeignPtr (fptr, bytestring_end `minusPtr` bytestring,
0) -- ^ If I got the foreignPtr parameter order right

Unfortunately Data.ByteString.Internal, though still exported, is no
longer haddocked; this makes it hard to check the parameters. You
should go look up the 6.10.1 version's documentation, which is still

Svein Ove Aas

More information about the Haskell-Cafe mailing list