¿Cómo puedo configurar un punto de entrada C personalizado con Clang en OS X Mavericks?

 C Programming >> Programación C >  >> Tags >> Clang
¿Cómo puedo configurar un punto de entrada C personalizado con Clang en OS X Mavericks?


Tengo el siguiente programa:


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

En Linux, puedo habilitar un punto de entrada personalizado a través de:


gcc test.c -Wl,-e,bob

Cuando ejecuto el programa resultante, obtengo:


./a.out
bob

En OS X, sin embargo, esto no funciona:


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

He intentado todo para que esto funcione. Creo que podría ser un error. Aquí está la salida con el -v opción:


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

Puedes ver que clang está pasando correctamente -e al ld , entonces tal vez este sea un problema con el ld de Apple . Si ese es el caso, estaría interesado en soluciones alternativas.


Respuestas:


El punto de entrada predeterminado anulado por el -e el argumento no es _main sino más bien start , que es responsable de configurar y llamar a _main , luego pasando el valor de retorno de _main a _exit . Si especifica su propio punto de entrada, deberá realizar estos pasos usted mismo. Actualmente no hay forma de realizar esta inicialización por usted, pero use una función principal diferente como el uso de _main está codificado en las herramientas.


La razón por la que se ignora su argumento -e se debe a un cambio en 10.8. Antes de este lanzamiento, la implementación de start se vinculó a cada aplicación a través de crt1.o . En 10.8 el start dyld puede realizar el procesamiento y el comando de carga LC_MAIN especifica el desplazamiento de la función principal dentro del programa. Cambiar este desplazamiento parece ser lo que desea, pero actualmente no es posible ya que cuando se usa el método de inicio LC_MAIN, siempre usa _main e ignora el -e argumento. Para especificar su propio punto de entrada, debe decirle a ld que use el método anterior de inicio del programa, lo que puede hacer para una aplicación con un objetivo de implementación de 10.8 o posterior al pasar -no_new_main al enlazador. Este es el comportamiento predeterminado para aplicaciones con un destino de implementación anterior a 10.8.