Uso de archivos de biblioteca y escritura de archivos de biblioteca en AIX

  
 

Hace mucho tiempo que las bibliotecas de enlaces dinámicos, las bibliotecas estáticas, los enlaces estáticos, los enlaces dinámicos y los enlaces de tiempo de ejecución recientes se han desordenado. Todo el mundo sabe que el enlace estático es un enlace en tiempo de compilación, el archivo generado es grande, el enlace dinámico es un enlace en tiempo de ejecución y el archivo generado es pequeño. No conozco a todos, o todos piensan que saben ... a veces windows, a veces linux, a veces Aix, a veces gcc, a veces g ++, a veces cc, a veces xlc, a veces .so, a veces .a, a veces .dll a veces .lib a veces .o, demasiada inconsistencia, demasiados problemas. Además, debido al trabajo, a menudo uso Aix como el entorno de trabajo. Algunos dicen que .so es una biblioteca de enlaces dinámicos, y .a es una biblioteca de enlaces estáticos, pero no se parece a esto en Aix. Este fin de semana, pasé dos días investigando estos problemas en Aix, usando vac's xlc y ccs ld. No puedo decir cuánto sé ahora, pero al menos no tan confundido como antes. Haz un resumen ahora.

Uno, archivo de enlace y método de enlace. De hecho, no pensar detenidamente en la vinculación dinámica y la vinculación dinámica es la razón principal de mi confusión. La razón por la que pienso en este problema es escribir una biblioteca a en el trabajo, luego tengo que compilar a, luego escribir otra biblioteca b, b depende de a, tengo que compilar b, en el proceso comencé a pensar: Utilicé el método de enlace cuando compilé un. Quiero usar un ahora. ¿Qué es un? Así que comencé a distinguir entre el archivo de enlace y el método de enlace, comencé el siguiente experimento 1, usando el archivo de biblioteca libc.a, enlazado estáticamente al programa ejecutable hello.c

código de copia del código C #include < stdio.h > Int main () {printf (" Hello, world! \\ N ");} #include < stdio.h > int main () {printf (" Hello, world! \\ N ");} Run # xlc - o hello.o -c hello.c Genere el archivo de destino hello.o Ejecute ld -o hello_s -bstatic hello.o -lc Quiero vincular estáticamente hello.o y libc.a y generar el ejecutable hello_s. No utilicé xlc directamente para generar archivos ejecutables. Quería averiguar cada paso. El precio del resultado es mucho tiempo y una búsqueda interminable. -bnso está diciendo ld enlaces estáticos.
(También puede usar los parámetros -E y -S de xlc para ver los archivos de procesamiento previo y de ensamblaje de hello.c, y luego usarlos para compilar el archivo de ensamblaje para generar el archivo de objeto). Resultado ld: 0711-327 ADVERTENCIA: No se encontró el punto de entrada: __start Ld: 0711-244 ERROR: No se han guardado ningún símbolo o símbolo exportado. Aquí no se encuentra __start, este __start se parece mucho a un subproceso del sistema. El motivo de este error es porque no agregamos dicha biblioteca /usr/lib/crt0.o al vincular. Si usa xlc para vincular directamente de forma estática, entonces esta biblioteca debe ser agregada por xlc en sí (esta biblioteca parece ser un hilo). Inicialización relacionada), puede usar el comando nm para ver el símbolo asociado con este archivo de destino, que contiene __start. Entonces ejecutamos ld -o hello_s -bstatic hello.o -lc /usr/lib/crt0.o El resultado es incorrecto al decir que no se pueden encontrar muchos símbolos, ld: 0711-224 ADVERTENCIA: Símbolo duplicado: .is_posix_tz ld: 0711- 224 ADVERTENCIA: Símbolo duplicado: .__ icuinit ld: 0711-345 Use la opción -bloadmap o -bnoquiet para obtener más información. Ld: 0711-317 ERROR: Símbolo no definido: __loadx ld: 0711-317 ERROR: Símbolo no definido: _system_TB_config ld: 0711-317 ERROR: Símbolo indefinido: errno ld: 0711-317 ERROR: Símbolo no definido: .___ bzero ld: 0711-317 ERROR: Símbolo no definido: smcr_timebase ld: 0711-317 ERROR: Símbolo no definido: .___ memmove ld: 0711-317 ERROR : Símbolo indefinido: .___ memset ld: 0711-317 ERROR: Símbolo indefinido: _sistema_configuración ld: 0711-317 ERROR: Símbolo indefinido: rechazar ld: 0711-317 ERROR: Símbolo indefinido: kwritev ld: 0711-317 ERROR: Símbolo no definido: kpwritev Ld: 0711-317 ERROR: Símbolo indefinido: kpwrite ld: 0711-317 ERROR: Símbolo indefinido: kwrite ld: 0711-317 ERROR: Símbolo no definido: kopenx ... indicador de ld -bloadmap para ver el mensaje de error específico, así que ejecuto ld -o hello_s -bstatic hello.o -lc /usr/lib/crt0.o -bloadmap: out.txt y veo el archivo de salida para obtener ... ld: 0711- 318 ERROR: Se encontraron símbolos indefinidos. Los siguientes símbolos son erróneos: Símbolo Inpndx TY CL Archivo de origen (Archivo de objeto) O Archivo de importación {Objeto compartido} RLD: Dirección Sección Símbolo de referencia de tipo Rld ----- -------------------------------------------------- --------------------------------------- __loadx [262] ER DS (/usr /lib /libc.a[shr.o]) 0006919c .data R_POS [1658] < __ loadx > _system_TB_config [792] ER UA (/usr/lib/libc.a[shr.o]) 000691a8 .data R_POS [1664] < _system_TB_config > errno [8] ER UA (/usr/lib/libc.a[shr.o]) 00068e3c .data R_POS [1226] ... Estas son algunas de las definiciones en shr.o en libc.a No se puede encontrar el símbolo, así que resolvemos este shr.o, ejecutamos ar -x /usr/lib/libc.a shr.o para obtener shr.o, luego ldd shr.o obtenemos la salida que shr.o necesita: /unix /Usr /lib /libcrypt.a (shr.o) /usr/lib/libc.a(shr.o) Esta es Hr.o necesita las tres bibliotecas anteriores, libc.a que hemos incluido, entonces, ¿dónde encontrar /unix esta biblioteca? Los símbolos que no se encuentran ahora deben ser llamadas al sistema. Consulte el manual de ld para saber que necesitamos importar la tabla de símbolos /lib/syscalls.exp de la llamada al sistema. Por lo tanto, ejecutamos # ld -o hello_s -bstatic hello.o -lc /usr/lib/crt0.o -bI: /lib /El resultado de syscalls.exp aún informa el error # ld -o hello_s -bstatic hello.o -lc /usr/lib/crt0.o -bI: /lib/syscalls.exp ld: 0711-224 ADVERTENCIA: Duplicar símbolo: .open ld: 0711 -224 ADVERTENCIA: Símbolo duplicado: .openx ld: 0711-224 ADVERTENCIA: Símbolo duplicado: .is_posix_tz ld: 0711-224 ADVERTENCIA: Símbolo duplicado: .__ icuinit ld: 0711-224 ADVERTENCIA: Símbolo duplicado: .send ld: 0711-224 ADVERTENCIA: Símbolo duplicado: .nrecvmsg

Copyright © Conocimiento de Windows All Rights Reserved