haskell - 获取函数的地址(不与 C 接口(interface))

标签 haskell binary ghc ffi

有一个相当低级的应用程序,我遇到了需要确定 Haskell 函数地址的情况。我可以用 FFI 来做到这一点,也就是 C,但我想直接在 Haskell 中做到这一点。

这是我目前使用 FFI 的解决方案:

main.hs:

{-# LANGUAGE ForeignFunctionInterface #-}
module Main where

import Foreign
import Foreign.C.Types
import Text.Printf

foreign import ccall "getFuncAddr"
  getFuncAddr :: CULong

main :: IO ()
main = do
  printf "0x%016x\n" (fromIntegral getFuncAddr :: Word64)

foreign export ccall func :: IO ()
func :: IO ()
func = do
  printf "hello world\n"

ffi.c:
void func(void);

unsigned long getFuncAddr(void)
{
    return (unsigned long) func;
}

生成文件:
all: main
    ./$<
    objdump -D $< | grep '<func>'

main: main.hs ffi.c
    ghc --make -O2 $^ -o $@

与往常一样,也可作为 gist .

最佳答案

试试这个:

{-# LANGUAGE ForeignFunctionInterface #-}
module Main where

import Foreign
import Foreign.C.Types
import Text.Printf

foreign import ccall "&func"
  funcaddr :: FunPtr (IO ())

main :: IO ()
main = do
  printf "0x%016x\n" (fromIntegral (ptrToIntPtr (castFunPtrToPtr funcaddr)) :: Int)

foreign export ccall func :: IO ()
func :: IO ()
func = do
  printf "hello world\n"

this section of the Haskell 2010 report ,然后查找“静态地址”。

关于haskell - 获取函数的地址(不与 C 接口(interface)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10967598/

相关文章:

javascript - JavaScript 中的二进制到字符串

c++ - 无法在 OpenCV 中打开 1 位二进制图像?

haskell - 如何在高阶函数haskell中使用Maybe?

haskell - 如何从类型导入某些函数

c# - 按位运算符让我见鬼去吧

haskell - 是否可以加载编译后的代码来提示?

haskell - 当范围内有多个字典时,GHC 会选择哪个字典?

haskell - 递归函数依赖不起作用

haskell - 快速检查:生成任意集合的任意元素

haskell - 使用列表理解生成元组