Wednesday 22 November 2017

Make Statically Linkedin Binary Options


Me resulta extraño usar - Wl, - Bstatic para decirle a gcc qué bibliotecas quiero enlazar de forma estática. Después de todo Im diciendo gcc directamente toda la otra información sobre la vinculación con las bibliotecas (-Ldir. - llibname). ¿Es posible decir directamente al controlador gcc qué bibliotecas deben enlazarse estáticamente? Aclaración: Sé que si una cierta biblioteca existe sólo en versiones estáticas itll lo usa sin - Wl, - Bstatic. Pero quiero implicar que gcc prefiera la biblioteca estática. También sé que la especificación del archivo de la biblioteca directamente enlazaría con él, pero prefiero mantener la semántica para incluir las bibliotecas estáticas y dinámicas iguales. Se puede agregar un archivo. a en el comando de enlace: Pero esto no es hablar con el controlador gcc, pero con ld vinculador como opciones como - Wl, cualquier cosa son. Cuando se indica a gcc o ld - Ldir - lLIBRARY, el enlazador comprobará las versiones estáticas y dinámicas de la biblioteca (puede ver un proceso con - Wl, - verbose). Para cambiar el orden de los tipos de biblioteca verificados puede utilizar - Wl, - Bstatic y - Wl, - Bdynamic. Esta es una página de manual de gnu LD: linux. die. net/man/1/ld Para vincular su programa con lib1, lib3 dinámicamente y lib2 estaticamente, use esa llamada gcc: suponiendo que la configuración predeterminada de ld es usar bibliotecas dinámicas ( Es en Linux). La compilación se realiza por el compilador, pero todavía puede enviar opciones al controlador que invocar el compilador. Es mejor hablar directamente con el controlador gcc, con un lenguaje que entienda, ya que entonces dependes menos del enlazador (si el enlazador cambia, el controlador seguiría traduciendo tus opciones correctamente). Dicho esto, nadie cambiará gcc o ld en cualquier momento pronto. Ndash Elazar Leibovich Jul 5 11 at 11:07Compiling FFMPEG Establemente en OS X (y Windows) Me levanté muy tarde la noche pasada averiguar esto, así que hice algunas notas aproximadas como me fui adelante. Espero que puedan salvar a alguien una pequeña pesadilla. Recuerdo: No he escrito código C desde que estaba en mi adolescencia, y aparte de algún Objective-C de thehellip que estaba muy tarde la noche pasada averiguar esto, así que hice algunas notas aproximadas como yo fue junto. Ojalá ellos ahorren a alguien una pequeña pesadilla. Descargo de responsabilidad: I haven8217t escrito código C desde que estaba en mi adolescencia, y aparte de algunos Objective-C desde la comodidad de XCode, he hecho realmente un montón de GCC compilar en cualquier sistema, por lo que esta no puede ser la mejor manera de Haz algo de esto Flash Video En primer lugar, ¿qué estamos haciendo Compilando un binario FFMPEG portátil de origen para que podamos incluir las librerías exactas que queremos y ejecutar FFMPEG desde otra aplicación. Por qué En resumen, quiero convertir casi cualquier formato de vídeo to8230 FLV / F4V. Técnicamente, la extensión es irrelevante, lo que estamos hablando aquí es el codec de vídeo utilizado, que es el codec Sorenson H.263 (Flash Player 6), On28217s VP6 (FP 8) o H.264 (FP 9 actualización 3) . La extensión F4V es realmente para archivos que utilizan el códec H.264 en un contenedor MP4. Por lo tanto, es a usted a quien usted apunta, pero tendrá un impacto en lo que construye en FFMPEG. El codec de audio utilizado es generalmente MP3, pero para el vídeo H.264 es AAC o MP3 (AAC se utiliza en la mayoría de los archivos MP4, como los podcasts de iTunes). Ahora, cuando usted convierte un video usando FFMPEG, descubrirá qué formato utilizar sobre la base de la extensión de archivo de salida (por ejemplo, flv), pero puede proporcionar parámetros adicionales para elegir un codificador de audio o video específico. Para obtener más información sobre los códecs dentro de los archivos FLV, consulte esta página de Wikipedia. Compilación de proyectos basados ​​en C desde el origen en Mac OS X A continuación se presentan los pasos generales para compilar proyectos basados ​​en C en su Mac. Instale XCode (developer. apple) 8211 esto instala el compilador GCC requerido. Descargue y extraiga su código fuente, por ejemplo, la biblioteca lame. Vaya a la carpeta extraída en Terminal. Ejecutar 8216 ./configure 8211enable-static 8211disable-shared 8216. Esto configurará los archivos make con las opciones dadas para la compilación, estas opciones dependen del proyecto, pero pueden ser tan generales como donde encontrar bibliotecas enlazadas o qué características Para permitir en el producto final. En este caso, realizamos una compilación estática estándar (esto significa que un usuario no necesitará bibliotecas compartidas en otra computadora, ya que las compilamos y las enlazamos de forma estática). Ejecutar 8216 make ampamp sudo make install 8216. Aquí I8217m 8220making8221 aka compilar y enlazar (you8217ll ver el binario aparecen en la carpeta de origen), a continuación, llamar a sudo para permitir super permisos de usuario y, finalmente, I8217m también 8220 make install ing8221 it - copying a la Lugar relevante en mi sistema para que pueda invocar la nueva funcionalidad desde cualquier lugar y copiar las librerías a mi carpeta / usr / local / lib para poder usarlas en otros proyectos8230 como FFMPEG Nota: Si utilizas algo como Macports ( O Fink) para instalar lame y cualquier otra biblioteca de vídeo o audio en el pasado, you8217ll encontrar que los instaló como dinámicas bibliotecas, dynlibs (y probablemente ponerlos en / opt / local o / sw). Esto won8217t hacer como no podemos enlazar estaticamente a estos cuando se compila FFMPEG, se requieren los archivos 8220.a8221. Así que me temo que significa que usted tiene que descargar la fuente para estos por separado, y cuando ./configure, asegúrese de especificar 8211enable-static. A continuación, debe encontrarlos ubicados en / usr / local / lib (de forma predeterminada) para que el enlazador puede recogerlos cuando construimos FFMPEG. Me gustaría tomar algún tiempo para ver la diferencia entre las bibliotecas estáticas y dinámicas en entornos nix si como yo este tipo de cosas se olvidan o bien sobre su cabeza: Compilando las dependencias Descargue el origen de las bibliotecas adicionales deseadas, como lame ( Lame. sourceforge. net/), x264 (videolan. org/developers/x264.html), faad y faac (audiocoding / downloads. html). A continuación, puede extraer cada uno a una carpeta y siga las instrucciones anteriores en Compilación de origen C en Mac OS X. Con x264 tuve problemas para construir desde los archivos tar proporcionados, así que utilicé git para obtener la última fuente de su repo, pero que Requiere que haya compilado e instalado git y Yasm (hecho exactamente de la misma manera que el resto de estos proyectos). Sugerencia: Si descarga FAAD y FAAC, asegúrese de descargar la fuente 8220bootstrapped8221, ya que incluye la herramienta de configuración. Compilación de FFMPEG Cuando compila FFMPEG tiene dos opciones de cómo compilarlo, 8211enable-static. O 8211disable-static. Esta opción determina si el binario resultante (app) incluye dentro de él cualquier biblioteca dependiente, como libmp3lame utilizado en codificación / decodificación MP3 y FAAD para decodificación de audio AAC (por ejemplo, en archivos MP4). En este caso, I8217m no me molesta con FAAC, ya que no estoy codificando AAC, pero sí quiero enlazar estáticamente a libmp3lame. Cuando vaya a compilar FFMPEG, siga estas instrucciones, y todo debería ir bien, dándole un binario ffmpeg que tiene todo lo necesario para convertir vídeo con los formatos y codecs mencionados. Usando FFMPEG Here8217s la línea de comandos requerida para convertir un video de muestra en un archivo FLV usando audio MP3 y códecs de video H.264 (sé, ya sé, debería usar MP4 / F4V pero tuve serios problemas para conseguir que jugar en cualquier cosa . Este archivo debe reproducirse en cualquier reproductor de vídeo bien escrito, siempre y cuando necesite Flash Player 9.0.115.0 o superior. Usted probablemente puede adivinar algunas de las banderas, - y sobrescribir archivo, - acodec audiocodec, - vecodec codec de vídeo, - ab bitrate de audio, - ar tasa de muestreo de audio, - b bitrate, - g marco de agrupación (utilizado para la creación / fregado de fotogramas clave) . Falta MetaData Por lo tanto, puede crear un video que pueda reproducir, pero no puede ver la duración de video8217s o explorar activamente otra parte del video (recomiendo instalar un reproductor sin conexión como Wimpy FLV para probar sus videos fácilmente). Esto se debe a que FFMPEG no inyecta los metadatos en archivos FLV. Pero hay una herramienta multiplataforma GPL8217d que funciona (y suministran binarios pre-compilados) Simple ./flvmeta input. flv output. flv para inyectar metadatos correctos. Los codificadores de estos proyectos son verdaderos héroes de la comunidad. Gracias. Wrapping up En mi caso no he especificado el 8211enable-no-libre bandera cuando ./configure8217ing FFMPEG para que pueda redistribuir el binario, esto significa hasta que el equipo FFMPEG hacer su propia biblioteca AAC, no puedo habilitar libfaad y libfaac para realizar AAC Codificación / decodificación para mis vídeos H.264 (por lo que I8217m se pegue a MP3). Al parecer, algunos códigos de faac tiene conflictivos no-GPL licencias de transporte de código escrito en las empresas. También recuerda que tienes que adherir a la licencia LGPL o GPL al incluir FFMPEG con tu aplicación. Usted también tiene que considerar las licencias de patente adicionales para los códecs utilizados, específicamente los codecs MPEG-4 requieren licencias de la MPEG-LA, y MP3 de Thompson. El costo de la concesión de licencias es aparentemente muy bajo. Los detalles de las licencias que usted requiere son un área horriblemente gris, se necesitaría un abogado especialista para realmente averiguarlo, si pudieran en absoluto, y depende de qué país usted está en de todos modos (ver la página principal de FFMPEG para más información sobre esto problema). Este mismo enfoque funciona para Windows, sin embargo you8217d estar utilizando el compilador MingW y, probablemente, quiere tener Cygwin instalado para darle una configuración de estilo nixy por lo que las instrucciones anteriores siguen funcionando. Sin embargo it8217s mucho más fácil de encontrar ejecutables pre-compilados para Windows, en mi caso encontré unos que incluían todo lo que había incluido en la construcción de Mac tan afortunadamente evité esto. 6 pensamientos sobre ldquoCompiling FFMPEG Establemente en OS X (y Windows) rdquo I8217ve noté que mi blog está eliminando los doble guiones de 8211enable-static y 8211disable-static. Estas banderas deben comenzar con dos guiones, seguidos de palabras separadas por guiones simples. He estado desarrollando una aplicación en Adobe Air (Actionscript 3) y necesito exportar un flv. Sé que AS3 no es C, pero está cerca. Básicamente estoy tratando de escribir una clase que puedo dar marcos de imagen de byteArrays a, y dar un byteArray mp3, y la clase lo analizará y creará un flv completo. He tenido un montón de problemas para encontrar a alguien que tendría el conocimiento para hacerlo, aunque sé que es posible. ¿Es algo que podría ser capaz de ayudar con Gracias me siento un poco tonto LOL, he leído esta entrada del blog, pero escribió mi nota pensando que era principalmente un desarrollador que hasn8217t hecho cualquier Actionscript. Lo siento por eso. Sin embargo, creo que el problema ya ha sido parcialmente resuelto para usted (para el audio, es posible usar un MP3, lo hicieron para RichFLV ). Desafortunadamente para mí, tengo que convertir formatos de vídeo desconocidos en FLV, así que tengo que usar FFMPEG. Yup, I8217m usando una versión de la clase ZeroPointNine8217s ya. Lamentablemente, he pasado 3 semanas tratando de averiguar por qué cuando intento agregar etiquetas de audio, me da un 900MB non-working flv de 10 segundos LOL RichFLV ya lo ha hecho, sí, pero won8217t lanzar su fuente ¿Sabría usted de Cualquier persona que podría ayudarme Si usted sabe el individuo que hizo RichFLV, no necesito la fuente entera, apenas las 5 líneas que tomaría para conseguir el marco del byteArray del mp3 en el IVA de flv I8217m no asustado. Usted puede haber agotado ya estas rutas, pero mirar en el osflash. org/flv que tiene la estructura exacta del FLV, y también quizás el código fuente de Red58217s, como parte de eso podría ser portado. Los comentarios están cerrados. Post navigationHay (en la mayoría de los casos, descontando el código interpretado) dos etapas en obtener de código fuente (lo que escribes) a código ejecutable (lo que se ejecuta). La primera es la compilación que convierte el código fuente en módulos de objetos. El segundo, el enlace, es lo que combina los módulos objeto juntos para formar un ejecutable. La distinción se hace para, entre otras cosas, permitir que las bibliotecas de terceros sean incluidas en su ejecutable sin que vea su código fuente (como bibliotecas para acceso a bases de datos, comunicaciones de red e interfaces gráficas de usuario) o para compilar códigos en diferentes idiomas C y código de ensamblaje, por ejemplo) y luego vincularlos todos juntos. Cuando vincula estáticamente un archivo a un archivo ejecutable, el contenido de ese archivo se incluye en el momento del vínculo. En otras palabras, el contenido del archivo se inserta físicamente en el ejecutable que se ejecutará. Cuando se enlaza dinámicamente. Un puntero al archivo que está enlazado en (el nombre de archivo del archivo, por ejemplo) se incluye en el archivo ejecutable y el contenido de dicho archivo no se incluye en tiempo de enlace. Es sólo cuando más tarde ejecutar el ejecutable que estos archivos vinculados dinámicamente se compran y theyre sólo compró en la copia en la memoria del ejecutable, no el de disco. Es básicamente un método de vinculación diferida. Hay un método aún más aplazado (llamado enlace tardío en algunos sistemas) que no traerá el archivo vinculado dinámicamente hasta que realmente intente llamar a una función dentro de él. Los archivos enlazados estáticamente se bloquean en el archivo ejecutable en tiempo de enlace para que nunca cambien. Un archivo vinculado dinámicamente al que hace referencia un ejecutable puede cambiar simplemente reemplazando el archivo en el disco. Esto permite actualizaciones a la funcionalidad sin tener que volver a vincular el código que el cargador vuelve a enlazar cada vez que lo ejecuta. Esto es bueno y malo - por un lado, permite actualizaciones más fáciles y correcciones de errores, por el otro puede conducir a programas dejando de funcionar si las actualizaciones son incompatibles - esto es a veces responsable de la temida DLL infierno que algunas personas mencionan en Que las aplicaciones se pueden romper si se reemplaza una biblioteca vinculada dinámicamente con una que no es compatible (los desarrolladores que hacen esto deben esperar ser cazados y castigados severamente, por cierto). Como ejemplo . Vamos a mirar el caso de un usuario que compila su archivo main. c para la vinculación estática y dinámica. Puede ver en el caso estático que el programa principal y la biblioteca de tiempo de ejecución C están enlazados en tiempo de enlace (por los desarrolladores). Dado que el usuario normalmente no puede volver a vincular el ejecutable, theyre pegado con el comportamiento de la biblioteca. En el caso dinámico, el programa principal está vinculado con la biblioteca de importación de tiempo de ejecución C (algo que declara lo que está en la biblioteca dinámica pero no lo define). Esto permite que el enlazador para vincular aunque el código real falta. A continuación, en tiempo de ejecución, el cargador del sistema operativo realiza una vinculación tardía del programa principal con la DLL de ejecución en tiempo de ejecución (biblioteca de vínculos dinámicos o biblioteca compartida u otra nomenclatura). El propietario del tiempo de ejecución de C puede colocar en un nuevo DLL en cualquier momento para proporcionar actualizaciones o correcciones de errores. Como se ha dicho anteriormente, esto tiene ventajas y desventajas. Hay un lugar especial reservado en el noveno círculo del infierno para aquellos que actualizan sus DLLs y rompan la compatibilidad hacia atrás. Sí, si las interfaces desaparecen o se modifican, entonces la vinculación dinámica caerá en un montón. Por eso no debería hacerse. Por supuesto agregue una función2 () a su DLL pero don39t cambie la función () si la gente la está utilizando. La mejor manera de manejar eso es recodificar la función () de tal manera que llama a function2 (), pero don39t cambia la firma de function (). Ndash paxdiablo May 12 10 at 8:26 Creo que una buena respuesta a esta pregunta debe explicar lo que es la vinculación. Cuando compila algún código C (por ejemplo), se traduce al lenguaje de máquina. Sólo una secuencia de bytes que, cuando se ejecuta, hace que el procesador a sumar, restar, comparar, goto, leer la memoria, escribir la memoria, ese tipo de cosas. Este material se almacena en archivos de objeto (.o). Hace mucho tiempo, los informáticos inventaron esta subrutina. Ejecutar-este-trozo-de-código-y-regreso-aquí. No pasó demasiado tiempo antes de que se dieran cuenta de que las subrutinas más útiles podían ser almacenadas en un lugar especial y utilizadas por cualquier programa que las necesitara. Ahora, en los primeros días los programadores tendrían que perforar la dirección de memoria en la que se encontraban estas subrutinas. Algo así como CALL 0x5A62. Esto era tedioso y problemático si las direcciones de memoria alguna vez necesitan ser cambiadas. Por lo tanto, el proceso fue automatizado. Escribes un programa que llama a printf (). Y el compilador no conoce la dirección de memoria de printf. Así que el compilador sólo escribe CALL 0x0000. Y agrega una nota al archivo de objeto diciendo que debe reemplazar este 0x0000 con la ubicación de memoria de printf. El enlace estático significa que el programa de vinculación (el GNU se llama ld) añade el código de la máquina printf directamente al archivo ejecutable y cambia el 0x0000 a la dirección de printf. Esto ocurre cuando se crea el ejecutable. La vinculación dinámica significa que el paso anterior no sucede. El archivo ejecutable todavía tiene una nota que dice debe reemplazar 0x000 con la ubicación de memoria de printf. El cargador de sistemas operativos debe encontrar el código printf, cargarlo en la memoria y corregir la dirección CALL, cada vez que se ejecute el programa. Es común que los programas llamen a algunas funciones que estarán vinculadas estáticamente (las funciones estándar de la biblioteca como printf suelen estar vinculadas estáticamente) y otras funciones que están dinámicamente vinculadas. Los estáticos se convierten en parte del ejecutable y los dinámicos se unen cuando se ejecuta el ejecutable. Hay ventajas y desventajas para ambos métodos, y hay diferencias entre los sistemas operativos. Pero como no me preguntaste, terminaré esto aquí. Respondió Nov 23 08 at 0:02 Porque ninguno de los mensajes anteriores realmente muestran cómo vincular estáticamente algo y ver que lo hizo correctamente, así que voy a abordar este problema: Un programa C simple Vincular dinámicamente el programa C Y ejecutar archivo en el binario : Y que mostrará que está vinculado dinámicamente algo a lo largo de las líneas de: simpleprog: ELF 64 bits LSB ejecutable, x86-64, versión 1 (SYSV), dinámicamente vinculado (utiliza libs compartidas), para GNU / Linux 2.6.26, BuildIDsha10xf715572611a8b04f686809d90d1c0d75c6028f0f, no despojado En su lugar, vamos a enlazar estaticamente el programa esta vez: Ejecutar el archivo en este binario estáticamente vinculado mostrará: simpleprog: ELF 64 bits LSB ejecutable, x86-64, versión 1 (GNU / Linux), estáticamente vinculado, para GNU / Linux 2.6.26, BuildIDsha10x8c0b12250801c5a7c7434647b7dc65a644d6132b, no despojado Y usted puede ver que está feliz enlazado estáticamente. Lamentablemente, no todas las bibliotecas son sencillas de enlazar estáticamente de esta manera y puede requerir un esfuerzo prolongado usando libtool o enlazando manualmente el código de objeto y las bibliotecas C. Afortunadamente, muchas bibliotecas C incrustadas como musl ofrecen opciones de enlaces estáticos para casi todas, si no todas, sus bibliotecas. Ahora strace el binario que ha creado y puede ver que no hay bibliotecas accedidas antes de que el programa comienza: Ahora compare con la salida de strace en el programa vinculado dinámicamente y verá que las versiones vinculadas estáticamente strace es mucho más corto

No comments:

Post a Comment