Come posso impostare un punto di ingresso C personalizzato con Clang su OS X Mavericks?

Come posso impostare un punto di ingresso C personalizzato con Clang su OS X Mavericks?


Ho il seguente programma:


#include <stdio.h>
int bob() {
printf("bob\n");
return 0;
}
int main() {
printf("main\n");
return 0;
}

Su Linux, posso abilitare un punto di ingresso personalizzato tramite:


gcc test.c -Wl,-e,bob

Quando eseguo il programma risultante, ottengo:


./a.out
bob

Su OS X, tuttavia, questo non funziona:


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

Ho provato di tutto per farlo funzionare. Penso che potrebbe essere un bug. Ecco l'output con il -v opzione:


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

Puoi vedere quel clang sta passando correttamente -e a ld , quindi forse questo è un problema con ld di Apple . In tal caso, sarei interessato a soluzioni alternative.


Risposte:


Il punto di ingresso predefinito sovrascritto da -e l'argomento non è _main ma piuttosto start , che è responsabile della configurazione e della chiamata di _main , quindi passando il valore di ritorno di _main a _exit . Se specifichi il tuo punto di ingresso, dovrai eseguire questi passaggi da solo. Al momento non è possibile eseguire questa inizializzazione per te, ma utilizzare una funzione principale diversa dall'uso di _main è codificato negli strumenti.


Il motivo per cui il tuo argomento -e viene ignorato è dovuto a una modifica in 10.8. Prima di questa versione l'implementazione di start è stato collegato a ciascuna applicazione tramite crt1.o . Nella 10.8 il start l'elaborazione può essere eseguita da dyld e il comando LC_MAIN load specifica l'offset rispetto alla funzione principale all'interno del programma. La modifica di questo offset sembra essere ciò che desideri, ma al momento non è possibile poiché quando viene utilizzato il metodo di avvio LC_MAIN ld usa sempre _main e ignora il -e discussione. Per specificare il tuo punto di ingresso devi dire a ld di usare il vecchio metodo di avvio del programma, cosa che puoi fare per un'applicazione con una destinazione di distribuzione di 10.8 o successiva passando -no_new_main al linker. Questo è il comportamento predefinito per le applicazioni con una destinazione di distribuzione precedente alla 10.8.