diff --git a/Network/Sendfile/Linux.hsc b/Network/Sendfile/Linux.hsc
--- a/Network/Sendfile/Linux.hsc
+++ b/Network/Sendfile/Linux.hsc
@@ -29,10 +29,16 @@
 #include <sys/sendfile.h>
 #include <sys/socket.h>
 
+isLargeOffset :: Bool
+isLargeOffset = sizeOf (0 :: COff) == 8
+
+isLargeSize :: Bool
+isLargeSize = sizeOf (0 :: CSize) == 8
+
 safeSize :: CSize
 safeSize
-  | sizeOf (0 :: CSize) == 8 = 2^(60 :: Int)
-  | otherwise                = 2^(30 :: Int)
+  | isLargeSize = 2^(60 :: Int)
+  | otherwise   = 2^(30 :: Int)
 
 ----------------------------------------------------------------
 
@@ -115,7 +121,15 @@
 
 -- Dst Src in order. take care
 foreign import ccall unsafe "sendfile"
-    c_sendfile :: Fd -> Fd -> Ptr COff -> CSize -> IO (#type ssize_t)
+    c_sendfile32 :: Fd -> Fd -> Ptr COff -> CSize -> IO (#type ssize_t)
+
+foreign import ccall unsafe "sendfile64"
+    c_sendfile64 :: Fd -> Fd -> Ptr COff -> CSize -> IO (#type ssize_t)
+
+c_sendfile :: Fd -> Fd -> Ptr COff -> CSize -> IO (#type ssize_t)
+c_sendfile
+  | isLargeOffset = c_sendfile64
+  | otherwise     = c_sendfile32
 
 ----------------------------------------------------------------
 
diff --git a/simple-sendfile.cabal b/simple-sendfile.cabal
--- a/simple-sendfile.cabal
+++ b/simple-sendfile.cabal
@@ -1,5 +1,5 @@
 Name:                   simple-sendfile
-Version:                0.2.19
+Version:                0.2.20
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
