2012-06-16 24 views
5

Tengo crear un montón de archivos .o (a través de gcc -c $file.c $someotherops -o $file.o). Ahora quiero vincularlos a una biblioteca estática.cómo vincular una biblioteca estática para iOS

No estoy exactamente seguro de si debo usar ld o gcc para esto. En el manual ld, se dice que no debo usarlo directamente. Sin embargo, no puedo descifrar los parámetros de gcc para crear una biblioteca estática.

Probé ld *.o -static -o libfoo.a pero se queja de una gran cantidad de símbolos que faltan (creo que todo desde libc). No entiendo por qué se queja porque se supone que es una biblioteca estática. Pensé que verificaría los símbolos una vez que vincule esa biblioteca estática a otra cosa.

Otra cosa: uso /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld aquí (mi objetivo es iOS). Se queja con la advertencia ld: warning: using ld_classic. ¿De qué se trata esto?

Entonces pensé, tal vez necesita tener las bibliotecas dinámicas especificadas. Así que agregué -lc para enlazar con libc. Pero se queja con can't locate file for: -lc. Agregué -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib y hay un libc.dylib.

¿Alguna idea?


Sobre el error -lc: Se escapó después de que se especifica -arch armv6. Luego se quejó de un error libcache.dylib (que debe estar vinculado desde libc.dylib supongo porque no lo especificó). Agregar -L.../usr/lib/system ayudado.

Ahora, para cada archivo .o, recibo la advertencia ld: warning: CPU_SUBTYPE_ARM_ALL subtype is deprecated. ¿De qué se trata esto?

Y todavía tengo un montón de símbolos que faltan, especialmente:

Undefined symbols for architecture armv6: 
    "start", referenced from: 
    -u command line option 
    (maybe you meant: _PyThread_start_new_thread) 
    "___udivsi3", referenced from: 
     _get_len_of_range in bltinmodule.o 
     _quorem in dtoa.o 
     _array_resize in arraymodule.o 
     _newarrayobject in arraymodule.o 
     _array_fromfile in arraymodule.o 
     _get_len_of_range in rangeobject.o 
     _inplace_divrem1 in longobject.o 
     ... 
    "___unorddf2", referenced from: 
     _builtin_round in bltinmodule.o 
    ... 

comprobado que algunos de esos símbolos, por ejemplo ___udivsi3 en get_len_of_range. Esta función usa C arithmetic solamente, no hay llamadas externas. Así que esto parece estar traducido para usar algunas funciones externas como ___udivsi3. Pero, ¿en qué bibliotecas está esto?


-lgcc_s.1 fijo la mayor parte del ___udivsi3 y símbolos relacionados que faltan. El símbolo start aún falta. ¿Qué significa -u command line option?


De here, me dio la sensación de que tal vez ld no es la herramienta adecuada después de todo. Allí, se usa una simple llamada a ar. Y esto parece tener más sentido. Comprobaré si eso funciona y lo transformaré en una respuesta.


Mientras se reproduce más alrededor, ar lanzar algunas advertencias a mí en la construcción de una biblioteca estática grasa. Me dio la pista para usar libtool en su lugar. Eso es lo que estoy haciendo ahora, es decir, libtool -static -o libfoo.a *.o. También cambié el compilador a /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang pero no estoy seguro si eso importa.

Ahora, al compilar algunas aplicaciones de test que une a esta biblioteca estática, consigo estas advertencias:

ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in __PyBuiltin_Init from /Users/az/Programmierung/python-embedded/libpython.a(bltinmodule.o). To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie 
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000004 (0x001B70CC) to 0x1001B70C4 
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000000 (0x001B70CC) to 0x1001B70C4 

¿Qué son alrededor? No uso -mdynamic-no-pic. Tampoco veo realmente en _PyBuiltin_Init cómo uso el direccionamiento absoluto allí.

Además, ¿cuáles son estas direcciones absolutas fuera de rango? Editar: Estas fueron algunas asignaciones muy grandes. Acabo de eliminar este código por ahora (esto era WITH_PYMALLOC, si alguien está interesado en estas partes internas específicas de Python).

Cuando comienzo en mi iPhone, me sale el aborto:

dyld: vm_protect(0x00001000, 0x00173000, false, 0x07) failed, result=2 for segment __TEXT in /var/mobile/Applications/C15D9525-E7DC-4463-B05B-D39C9CA24319/...

Cuando uso -no_pie para vincular, lo hace ni siquiera enlace. Falla con:

Illegal text-relocation to ___stderrp in /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/libSystem.dylib from _read_object in /Users/az/Programmierung/python-embedded/libpython.a(marshal.o) for architecture armv7


He resuelto el error PIE discapacitados, direccionamiento absoluto. Tenía un -static en mi línea de comando Clang. Una vez que eliminé eso, la advertencia se escapó, al igual que el error dyld/vm_protect. Era la primera vez que realmente ejecutaba algún código.

Hasta que llegue a another strange error about integer comparison. Por lo que esto se parece más a un error en su construcción Clang.

+0

una pregunta; ¿Por qué no creas un Proyecto de biblioteca estática XCoe y creas tu Biblioteca estática con ese proyecto? – CarlJ

+0

@ meccan: Quiero tener mi propio script de compilación en este caso por varias razones (sobre todo porque para este proyecto en particular, esto es mucho más simple ahora). De todos modos, incluso si lo hiciera con Xcode, esta pregunta permanece válida/abierta ya que quiero entender cómo hacerlo manualmente. – Albert

+0

bien, ¿y sabes que puedes construir un proyecto Xcode desde el shell? – CarlJ

Respuesta

12

Todo funciona ahora. Básicamente, la respuesta es:

  • sólo compila todos los archivos *.c como de costumbre a *.o archivos. La única diferencia real es el diferente GCC/Clang, el -arch armv7, los diferentes SDK/include dirs.

  • Utilice libtool -static -o libfoo.a *.o para generar la biblioteca estática.

Eso es todo. Los otros problemas en mi pregunta fueron simplemente intentos fallidos.

1

Si alguien llega aquí buscando el error de tiempo de ejecución dyld: vm_protect(...) pero está utilizando XCode, es posible que el indicador -static mencionado en el OP sea el problema.

Deshágase de él al cambiar "Habilitar el enlace con bibliotecas compartidas" a "Sí" (valor predeterminado) en la configuración de lenguaje del compilador LLVM. (Esto elimina GCC_LINK_WITH_DYNAMIC_LIBRARIES = NO del archivo del proyecto).

Cuestiones relacionadas