[英]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 源。
我看到的常用技巧是詢問Int
或Word
的字節或位大小,因為這在 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.