2014-07-19 58 views
4

我有以下程序:如何在OS X Mavericks上使用Clang設置自定義C入口點?

#include <stdio.h> 

int bob() { 
    printf("bob\n"); 
    return 0; 
} 

int main() { 
    printf("main\n"); 
    return 0; 
} 

在Linux上,我可以使通過自定義的切入點:

gcc test.c -Wl,-e,bob 

當我運行生成的程序,我得到:

./a.out 
bob 

但是,在OS X上不起作用:

clang test.c -Wl,-e,bob 
./a.out 
main 

我已經嘗試了所有這些工作。我認爲這可能是一個錯誤。下面是與-v選項的輸出:

clang test.c -Wl,-e,bob -v 

Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin13.3.0 
Thread model: posix 
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.9.0 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name test.c -mrelocation-model pic -pic-level 2 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 236.3 -v -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1 -fdebug-compilation-dir /Users/mfichman/jogo -ferror-limit 19 -fmessage-length 125 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.9.0 -fencode-extended-block-signature -fdiagnostics-show-option -fcolor-diagnostics -vectorize-slp -o /var/folders/4z/q41by0256hjc7s6v8ljmfpw8lywh5g/T/test-9b80a6.o -x c test.c 
clang -cc1 version 5.1 based upon LLVM 3.4svn default target x86_64-apple-darwin13.3.0 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/local/include 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include 
/usr/include 
/System/Library/Frameworks (framework directory) 
/Library/Frameworks (framework directory) 
End of search list. 
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.9.0 -e bob -o a.out /var/folders/4z/q41by0256hjc7s6v8ljmfpw8lywh5g/T/test-9b80a6.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/lib/darwin/libclang_rt.osx.a 

你可以看到,clang正確傳遞-eld,所以也許這是蘋果的ld問題。如果是這樣的話,我會對解決方案感興趣。由-e參數覆蓋

回答

2

默認入口點是不是_main而是start,這是負責建立並調用_main,那麼_main返回值傳遞給_exit。如果您指定了自己的入口點,則需要自己執行這些步驟。目前沒有辦法爲您執行初始化,但使用不同的主函數,因爲_main的使用被硬編碼到工具中。

您的-e參數被忽略的原因是由於10.8中的更改。在此發佈之前,通過crt1.ostart的實現鏈接到每個應用程序中。在10.8中,可以通過dyld執行start處理,並且LC_MAIN加載命令指定程序內主函數的偏移量。改變這個偏移量似乎是你想要的,但是當前使用LC_MAIN啓動方法時,這是不可能的,ld總是使用_main而忽略-e參數。要指定您自己的入口點,您需要告訴ld使用舊的程序啓動方法,您可以通過將-no_new_main傳遞給鏈接程序來爲部署目標爲10.8或更高版本的應用程序執行此操作。這是部署目標早於10.8的應用程序的默認行爲。

相關問題