2015-12-29 51 views
5

我有一個庫,我正在建設。在我的Makefile ar rcs lib/libryftts.a $^GCC創建一個共享對象,而不是一個可執行的二進制文件

gcc -shared $^ -o lib/libryftts.so

:我所有的物體的編譯和鏈接先後當我運行的任何一個。我也能夠成功地將它們安裝到/usr/local/lib 當我用nm測試文件時,所有功能都在那裏。 我的問題是,當我運行gcc testing/test.c -lryftts -o test && file ./testgcc testing/test.c lib/libryftts.a -o test && file ./test 它說:

test: ELF 64-bit LSB shared object,而不是作爲test: ELF 64-bit LSB executable我期望的那樣。我究竟做錯了什麼?

+0

你的'test.c'是否包含'main'? –

+0

@EugeneSh。是的,它包含主要。 –

+2

聽起來很奇怪。但可能需要更多信息來診斷問題。建議您創建一個最小測試用例併發布用於產生問題的確切代碼和構建命令。另外,你可能想用'gcc -v'運行最後一個編譯行,看看gcc真正使用的命令和選項。 – kaylum

回答

13

我在做什麼錯?

什麼都沒有。

聽起來像你的GCC被配置爲默認構建-pie二進制文件。這些二進制文件真的是共享庫(類型ET_DYN),除非它們像普通可執行文件那樣運行。

所以你應該只是運行你的二進制文件,並且(如果有效的話)不用擔心它。

或者你可以用gcc -no-pie ...鏈接的二進制,並且應該產生一個非PIE可執行ET_EXEC類型,其中file會說ELF 64-bit LSB executable

+0

一旦runinng'gcc ... -v'我確實在配置中看到-pie。這固定了我所看到的。謝謝(你的)信息! –

+0

對於正在編譯[Code :: Blocks](http://www.codeblocks.org/)的任何人(如我),您需要將** -no-pie添加到**鏈接器設置→其他鏈接器選項* *,_not_ **編譯器設置→其他編譯器選項**,如您所期望的那樣 - 後者在編譯單個C文件時添加了「-no-pie」,但在編譯最終可執行文件時不會添加。 – GoBusto

+1

如果你打算使用'-no-pie',你還應該使用'-fno-pie'來獲得更高效的代碼。 (請參閱https://stackoverflow.com/questions/43367427/32-bit-absolute-addresses-no-longer-allowed-in-x86-64-linux) –

相關問題