簡體   English   中英

如何檢測 GHC 默認設置為生成 32 位還是 64 位代碼?

[英]How can I detect if GHC is set to generate 32bit or 64bit code by default?

我的makefile中有以下位:

GLFW_FLAG := -m32 -O2 -Iglfw/include -Iglfw/lib -Iglfw/lib/cocoa $(CFLAGS)
...
$(BUILD_DIR)/%.o : %.c
    $(CC) -c $(GLFW_FLAG) $< -o $@
$(BUILD_DIR)/%.o : %.m
    $(CC) -c $(GLFW_FLAG) $< -o $@

-m32指示 GCC 生成 32 位代碼。 它存在是因為在某些配置中,GHC 設置為構建 32 位代碼,但 GCC 的默認值有時是 64 位。 我想概括一下,以便它自動檢測 GHC 是在構建 32 位還是 64 位代碼,然后將正確的標志傳遞給 GCC。

問題:我如何詢問 GHC 它將構建什么類型的代碼(32 位與 64 位)?

PS:我的 cabal 文件在構建期間調用此 makefile 以解決 cabal 中的限制。 我真希望我可以在我的 cabal 文件中將這些列為 c 源。

我看到的常用技巧是詢問IntWord的字節或位大小,因為這在 GHC 中會根據機器的字大小而有所不同,

Prelude> :m + Foreign
Prelude Foreign> sizeOf (undefined :: Int)
8
Prelude Foreign> bitSize (undefined :: Int)
64

或者使用系統工具:

$ cat A.hs
main = print ()

$ ghc --make A.hs
[1 of 1] Compiling Main             ( A.hs, A.o )
Linking A ...

$ file A
A: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
     dynamically linked (uses shared libs), for GNU/Linux 2.6.27, not stripped

感謝 Ed'ka,我現在知道正確答案了。

Makefile 現在有這樣的規則:

GCCFLAGS  := $(shell ghc --info | ghc -e "fmap read getContents >>= putStrLn . unwords . read . Data.Maybe.fromJust . lookup \"Gcc Linker flags\"")

它有點長,但它所做的只是從 ghc 的 output 中提取“Gcc Linker 標志”。 注意:這是ghc --info的 output 而不是ghc +RTS --info

這比其他建議的方式更好,因為它給了我所有需要指定的標志,而不僅僅是 -m 標志。 當不需要標志時它也是空的。

謝謝大家!

根據我的評論,應該可以編譯測試程序並讀取生成的二進制文件。

$ cabal install elf

代碼只是

readElf testFile'sPath >>= \e -> if elfClass e == ELFCLASS64 then print 64 else print 32

或者在 GHCi 中我們看到:

> e <- readElf "/bin/ls"
> elfClass e
ELFCLASS64

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM