Thursday 26 October 2017

Ld Format Binary Options


La opción - format binario indica que el archivo de entrada, en este caso llamado stub. Es una gota binaria cruda de datos. El comando que muestra toma este blob y lo envuelve en un archivo elf, similar a otros objetos creados por el compilador, y adecuado para vincularse a un programa. Este tipo de truco también es útil si tiene una herramienta de programación ROM, por ejemplo, que espera datos elfos en lugar de binarios en bruto. La burbuja se coloca en la sección. data, y se crean tres símbolos (también conocidos como variables) para usted: binarystubstart binarystubend binarystubsize Si vincula trozo-image. o con un programa en C, de la manera habitual, a continuación, se puede acceder a los datos como Esto (puede elegir cualquier tipo de puntero es apropiado): ¿Alguien tiene una idea de cómo compilar de forma estática cualquier archivo de recursos directamente en el archivo ejecutable o el archivo de biblioteca compartida usando GCC Por ejemplo Id como agregar archivos de imagen que nunca cambian (y si lo hacen , La identificación tiene que substituir el archivo de todos modos) y wouldnt los quiere mentir alrededor en el sistema de archivos. Si esto es posible (y creo que es porque Visual C para Windows puede hacer esto, también), ¿cómo puedo cargar los archivos que se almacenan en el propio binario ¿El archivo ejecutable se analiza, encontrar el archivo y extraer los datos de Quizás hay una opción para GCC que todavía no he visto. El uso de motores de búsqueda realmente no escupir las cosas adecuadas. Necesitaría esto para trabajar en bibliotecas compartidas y ejecutables ELF normales. Cualquier ayuda es apreciada Da algo como: Para la compatibilidad con otro código, puede utilizar fmemopen para obtener un objeto FILE regular, o bien std :: stringstream para hacer un iostream. Std :: stringstream no es grande para esto sin embargo y usted puede por supuesto apenas utilizar un puntero dondequiera usted puede utilizar un iterador. Si está usando esto con automake no se olvide de establecer BUILTSOURCES adecuadamente. Lo bueno de hacerlo de esta manera es: Obtener texto, por lo que puede ser en el control de versiones y parches sensatamente Es portátil y bien definido en cada plataforma respondió Feb 1 11 at 16:04 Actualización He crecido a preferir el control John Ripleys asamblea. incbin solución basada ofrece y ahora utiliza una variante en eso. He utilizado objcopy (GNU binutils) para enlazar los datos binarios de un archivo foo-data. bin en la sección de datos del ejecutable: Esto le da un archivo de objeto foo-data. o que puede vincular en su ejecutable. La interfaz C se parece a algo así, puede hacer cosas como Si la arquitectura de destino tiene restricciones especiales en cuanto a dónde se almacenan los datos constantes y variables, o si desea almacenar esos datos en el segmento. text para que encajen en el mismo tipo de memoria Como su código de programa, usted puede jugar con los parámetros objcopy un poco más. Respondió Feb 1 11 at 16:36 good idea En mi caso no es muy útil. Pero esto es algo que realmente voy a poner en mi recopilación. Gracias por compartir este ndash Atmocreations Feb 1 11 at 18:04 It39s un poco más fácil de usar ld como el formato de salida está implícito allí, vea stackoverflow / a / 4158997/201725. Ndash Jan Hudec Mar 11 14 at 18:40 Puede incrustar archivos binarios en ejecutable mediante ld enlazador. Por ejemplo, si tiene el archivo foo. bar, puede incrustarlo en ejecutable, agregando los siguientes comandos a ld Si está invocando ld a través de gcc, entonces tendrá que agregar - Wl Aquí --formatbinary le dice al enlazador que el siguiente archivo es Binario y --formatdefault vuelve al formato de entrada predeterminado (esto es útil si especifica otros archivos de entrada después de foo. bar). A continuación, puede acceder al contenido de su archivo desde el código: También hay un símbolo llamado binaryfoobarsize. Creo que es de tipo uintptrt pero no lo comprobé. Recientemente tuve la necesidad de incrustar un archivo en un ejecutable. Desde Im trabajando en la línea de comandos con gcc, et al y no con una herramienta de RAD de fantasía que hace que todo suceda por arte de magia no era inmediatamente obvio para mí cómo hacer que esto suceda. Un poco de búsqueda en la red encontró un hack a esencialmente gato en el final del ejecutable y luego descifrar donde se basa en un montón de información que no quería saber. Parecía que debería haber una mejor manera. Y hay, su objcopy al rescate. Objcopy convierte archivos de objetos o ejecutables de un formato a otro. Uno de los formatos que entiende es binario, que es básicamente cualquier archivo que no está en uno de los otros formatos que entiende. Así que probablemente has previsto la idea: convertir el archivo que queremos incrustar en un archivo de objeto, entonces simplemente se puede vincular con el resto de nuestro código. Digamos que tenemos un nombre de archivo data. txt que queremos incrustar en nuestro archivo ejecutable: Para convertirlo en un archivo de objeto que podemos enlazar con nuestro programa, solo usamos objcopy para producir un archivo. o: Esto le dice a objcopy que nuestra entrada File está en el formato binario, que nuestro archivo de salida debe estar en el formato elf32-i386 (archivos de objeto en el x86). La opción --binary-architecture indica a objcopy que el archivo de salida está destinado a ejecutarse en un x86. Esto es necesario para que ld acepte el archivo para vincular con otros archivos para el x86. Uno podría pensar que especificar el formato de salida como elf32-i386 implicaría esto, pero no lo hace. Ahora que tenemos un archivo de objeto sólo tenemos que incluirlo cuando ejecutamos el enlazador: Cuando ejecutamos el resultado obtenemos la oración por la salida: Por supuesto, no he contado toda la historia todavía, ni te mostró main. c. Cuando objcopy realiza la conversión anterior, agrega algunos símbolos de vinculación al archivo de objeto convertido: Después de enlazar, estos símbolos especifican el inicio y el final del archivo incrustado. Los nombres de símbolos están formados por el prefijo binario y añadiendo inicio o fin al nombre del archivo. Si el nombre de archivo contiene caracteres que no son válidos en un nombre de símbolo, se convierten en subrayados (por ejemplo, data. txt se convierte en datatxt). Si obtiene nombres no resueltos al enlazar usando estos símbolos, haga un hexdump - C en el archivo de objeto y observe el final del volcado para los nombres que objcopy eligió. El código para usar el archivo incrustado ahora debería ser razonablemente obvio: Una cosa importante y sutil a tener en cuenta es que los símbolos agregados al archivo de objeto no son variables. No contienen datos, sino que su dirección es su valor. Los declaro como tipo char porque es conveniente para este ejemplo: los datos incrustados son datos de caracteres. Sin embargo, se podría declarar como algo, como int si los datos son una matriz de enteros, o como struct foobart si los datos eran cualquier matriz de foo bares. Si los datos incrustados no son uniformes, entonces char es probablemente el más conveniente: tome su dirección y lance el puntero al tipo correcto a medida que recorre los datos. Respondió Apr 1 11 en 20: 39ld-linux (8) - Página de manual de Linux Nombre ld. so, ld-linux. so - enlazador / cargador dinámico Sinopsis El enlazador dinámico puede ejecutarse indirectamente ejecutando algún programa o biblioteca vinculada dinámicamente ( En cuyo caso no se puede pasar ninguna opción de línea de comandos al vinculador dinámico y, en el caso ELF, se ejecuta el enlazador dinámico que se almacena en la sección. interp del programa) o directamente ejecutando: / lib / ld-linux. asi que. OPCIONES ARGUMENTOS DEL PROGRAMA Descripción Los programas ld. so y ld-linux. so encuentran y cargan las bibliotecas compartidas necesarias para un programa, preparan el programa para ejecutarlo y luego lo ejecutan. Los binarios de Linux requieren vinculación dinámica (vinculación en tiempo de ejecución) a menos que la opción - static se haya dado a ld (1) durante la compilación. El programa ld. so maneja binarios a. out, un formato utilizado hace mucho tiempo ld-linux. so maneja ELF (/lib/ld-linux. so.1 para libc5, /lib/ld-linux. so.2 para glibc2) , Que todo el mundo ha estado usando desde hace años. De lo contrario, ambos tienen el mismo comportamiento y utilizan los mismos archivos de soporte ldd (1), ldconfig (8) y /etc/ld. so. conf. Al resolver las dependencias de la biblioteca, el enlazador dinámico primero inspecciona cada cadena de dependencia para ver si contiene una barra diagonal (esto puede ocurrir si se especificó una ruta de acceso de biblioteca que contenía barras en tiempo de enlace). Si se encuentra una barra diagonal, la cadena de dependencia se interpreta como una ruta de acceso (relativa o absoluta) y la biblioteca se carga con esa ruta. Si la dependencia de una biblioteca no contiene una barra diagonal, se buscará en el siguiente orden: o (solo ELF) No existe los directorios especificados en el atributo de la sección dinámica DTRPATH del atributo binario si está presente y DTRUNPATH. El uso de DTRPATH está obsoleto. Utilizando la variable de entorno LDLIBRARYPATH. Excepto si el ejecutable es un binario set-user-ID / set-group-ID, en cuyo caso se ignorará. (ELF solamente) Usando los directorios especificados en el atributo de la sección dinámica DTRUNPATH del binario si está presente. Desde el archivo caché /etc/ld. so. cache. Que contiene una lista compilada de bibliotecas candidatas encontradas previamente en la ruta de biblioteca aumentada. Sin embargo, si el binario se enlazó con la opción - z nodeflib linker, las bibliotecas de las rutas de biblioteca predeterminadas se omitirán. Las bibliotecas instaladas en directorios de capacidad de hardware (ver más adelante) son preferibles a otras bibliotecas. En la ruta / lib predeterminada. Y luego / usr / lib. Si el binario se enlazó con la opción - z nodeflib linker, este paso se omite. ORIGIN y rpath ld. so entiende la cadena ORIGIN (o equivalente) en una especificación rpath (DTRPATH o DTRUNPATH) para significar el directorio que contiene el ejecutable de la aplicación. Por lo tanto, una aplicación ubicada en somedir / app podría ser compilada con gcc - Wl, - rpath, ORIGIN /../ lib para que encuentre una biblioteca compartida asociada en somedir / lib, sin importar donde somedir se encuentre en la jerarquía de directorios. Esto facilita la creación de aplicaciones llave en mano que no necesitan ser instaladas en directorios especiales, sino que pueden desempaquetarse en cualquier directorio y aún así encontrar sus propias bibliotecas compartidas. Opciones Lista todas las dependencias y cómo se resuelven. --verify Compruebe que el programa está dinámicamente vinculado y este vinculador dinámico puede manejarlo. --library-path PATH Utilice el parámetro PATH en lugar del valor de la variable de entorno LDLIBRARYPATH (véase más abajo). --inhibit-rpath LIST Ignora la información de RPATH y RUNPATH en los nombres de objetos en LIST. Esta opción se ignora si ld. so es set-user-ID o set-group-ID. --audit LIST Utilizar objetos nombrados en LIST como auditores. Capacidades del hardware Algunas bibliotecas se compilan utilizando instrucciones específicas del hardware que no existen en cada CPU. Estas bibliotecas deben instalarse en directorios cuyos nombres definen las capacidades de hardware necesarias, como / usr / lib / sse2 /. El enlazador dinámico verifica estos directorios contra el hardware de la máquina y selecciona la versión más adecuada de una biblioteca dada. Los directorios de capacidad de hardware pueden conectarse en cascada para combinar las funciones de la CPU. La lista de nombres de capacidades de hardware soportados depende de la CPU. Actualmente se reconocen los siguientes nombres: Alpha ev4, ev5, ev56, ev6, ​​ev67 loongson2e, loongson2f, octeon, octeon2 PowerPC 4xxmac, altivec, arch205, arch206, booke, cellbe, dfp, efpdouble, efpsingle, fpu, icsnoop, mmu, notb , Pa6t, power4, power5, power5, power6x, ppc32, ppc601, ppc64, smt, spe, ucache, vsx SPARC flush, muldiv, stbar, swap, ultra3, v9, v9v, v9v2 dfp eimm esan3 etf3enh g5, (Sólo 32 bits) acpi, apic, clflush, cmov, cx8, dts, fxsr, ht, i386, i486, i586, Entorno Existen cuatro variables de entorno importantes. Existen cuatro variables de entorno importantes. LDBINDNOW (libc5 glibc since 2.1.1) Si se establece en una cadena no vacía, hace que el vinculador dinámico resuelva todos los símbolos en el inicio del programa en lugar de diferir la resolución de la llamada de función al punto en que se hace referencia por primera vez. Esto es útil cuando se utiliza un depurador. LDLIBRARYPATH Una lista separada por dos puntos de directorios en la que buscar bibliotecas ELF en tiempo de ejecución. Similar a la variable de entorno PATH. Se ignora en los programas set-user-ID y set-group-ID. LDPRELOAD Lista de bibliotecas compartidas ELF adicionales especificadas por el usuario que se cargarán antes que todas las demás. Los elementos de la lista se pueden separar por espacios o dos puntos. Esto se puede utilizar para anular selectivamente funciones en otras bibliotecas compartidas. Las bibliotecas se buscan utilizando las reglas dadas en DESCRIPCIÓN. Para los binarios ELF de set-user-ID / set-group-ID, los nombres de ruta de precarga que contienen barras diagonales se ignoran y las bibliotecas de los directorios de búsqueda estándar sólo se cargan si el bit de permiso set-user-ID está habilitado en el archivo de biblioteca. LDTRACELOADEDOBJECTS (sólo ELF) Si se establece en una cadena no vacía, hace que el programa enumere sus dependencias de biblioteca dinámica, como si ejecuta ldd (1), en lugar de ejecutarse normalmente. Luego hay muchas variables más o menos oscuras, muchas obsoletas o sólo para uso interno. LDAOUTLIBRARYPATH (libc5) Versión de LDLIBRARYPATH sólo para los binarios a. out. Las versiones antiguas de ld-linux. so.1 también admitían LDELFLIBRARYPATH. LDAOUTPRELOAD (libc5) Versión de LDPRELOAD sólo para binarios a. out. Las versiones antiguas de ld-linux. so.1 también soportaban LDELFPRELOAD. LDAUDIT (glibc since 2.4) Una lista separada por dos puntos de los objetos compartidos ELF especificados por el usuario que deben cargarse antes que todos los demás en un espacio de nombres de vinculador independiente (es decir, que no interfiera con los enlaces de símbolos normales que se producirían en el proceso). Estas bibliotecas se pueden utilizar para auditar el funcionamiento del enlazador dinámico. LDAUDIT se ignora para los binarios set-user-ID / set-group-ID. El enlazador dinámico notificará a las bibliotecas de auditoría los llamados puntos de verificación de auditoría (por ejemplo, cargando una nueva biblioteca, resolviendo un símbolo o llamando a un símbolo de otro objeto compartido) llamando a una función apropiada dentro de la biblioteca de auditoría. Para obtener más información, consulte rtld-audit (7). La interfaz de auditoría es en gran parte compatible con la que se proporciona en Solaris, tal como se describe en su Guía de Enlaces y Bibliotecas. En el capítulo Interfaz de auditoría del vinculador de tiempo de ejecución. LDBINDNOT (glibc desde 2.1.95) No actualice GOT (tabla de desplazamiento global) y PLT (tabla de vinculación de procedimientos) después de resolver un símbolo. LDDEBUG (glibc desde 2.1) Produce información de depuración detallada sobre el enlazador dinámico. Si se establece en all imprime toda la información de depuración que tiene, si se configura para ayudar a imprimir un mensaje de ayuda acerca de qué categorías se pueden especificar en esta variable de entorno. Desde glibc 2.3.4, LDDEBUG se ignora para los binarios set-user-ID / set-group-ID. LDDEBUGOUTPUT (glibc desde 2.1) Archivo en el que se debe alimentar la salida LDDEBUG, por defecto es la salida estándar. LDDEBUGOUTPUT se ignora para los binarios set-user-ID / set-group-ID. LDDYNAMICWEAK (glibc desde 2.1.91) Permite que los símbolos débiles sean reemplazados (vuelve a un comportamiento antiguo de glibc). Por razones de seguridad, desde glibc 2.3.4, LDDYNAMICWEAK se ignora para binarios set-user-ID / set-group-ID. LDHWCAPMASK (glibc desde 2.1) Máscara para las capacidades de hardware. LDKEEPDIR (a. out solamente) (libc5) No ignore el directorio en los nombres de las bibliotecas a. out que se van a cargar. El uso de esta opción es fuertemente desalentado. LDNOWARN (a. out only) (libc5) Suprime las advertencias sobre bibliotecas a. out con números de versión secundaria incompatibles. LDORIGINPATH (glibc desde 2.1) Ruta donde se encuentra el binario (para los programas no-set-user-ID). Por razones de seguridad, desde glibc 2.4, LDORIGINPATH se ignora para los binarios set-user-ID / set-group-ID. LDPOINTERGUARD (glibc desde 2.4) Se establece en 0 para desactivar la protección del puntero. Cualquier otro valor permite la protección de puntero, que también es el predeterminado. La protección de puntero es un mecanismo de seguridad por el cual algunos punteros a código almacenados en memoria programable de programa (direcciones de retorno guardadas por setjmp (3) o punteros de función usados ​​por varios internos de glibc) son mutilados semi-aleatoriamente para hacer más difícil para un atacante secuestrar el Punteros para su uso en caso de un ataque de buffer o un ataque de apilamiento de pila. LDPROFILE (glibc desde 2.1) Objeto compartido a ser perfilado, especificado como una ruta o un nombre de sonido. La salida de perfil se escribe en el archivo cuyo nombre es: LDPROFILEOUTPUT / LDPROFILE. profile. LDPROFILEOUTPUT (glibc desde 2.1) Directorio donde se debe escribir la salida LDPROFILE. Si esta variable no está definida, o se define como una cadena vacía, entonces el valor predeterminado es / var / tmp. LDPROFILEOUTPUT se ignora para los programas set-user-ID y set-group-ID, que siempre usan / var / profile. LDSHOWAUXV (glibc desde 2.1) Muestra la matriz auxiliar que se pasa del kernel. Por razones de seguridad, desde glibc 2.3.5, LDSHOWAUXV se ignora para binarios set-user-ID / set-group-ID. LDUSELOADBIAS De forma predeterminada (es decir, si no se define esta variable), los ejecutables y los objetos compartidos pre-enlazados respetarán las direcciones base de sus bibliotecas dependientes y los ejecutables independientes de la posición (no preconectados) y otros objetos compartidos no los respetarán. Si LDUSELOADBIAS se define con el valor, tanto los ejecutables como las PIE honrarán las direcciones base. Si LDUSELOADBIAS se define con el valor 0, ni ejecutables ni PIEs honrarán las direcciones base. Esta variable es ignorada por los programas set-user-ID y set-group-ID. LDVERBOSE (glibc desde 2.1) Si se establece en una cadena no vacía, se mostrará la información de versiones de versiones del programa si se ha establecido la variable LDTRACELOADEDOBJECTS. LDWARN (sólo ELF) (glibc desde 2.1.3) Si se establece en una cadena no vacía, advierta sobre símbolos no resueltos. LDDARGV0 (libc5) argv 0 a ser utilizado por ldd (1) cuando no hay ninguno. Archivos /lib/ld. so a. out vinculador dinámico / loader /lib/ld-linux. so. 1, 2 ELF dynamic linker / loader /etc/ld. so. cache Archivo que contiene una lista compilada de directorios en los que buscar bibliotecas y una lista ordenada de bibliotecas candidatas. /etc/ld. so. preload Archivo que contiene una lista separada por espacios en blanco de bibliotecas compartidas ELF para cargar antes del programa. Bibliotecas compartidas lib. so Notas La funcionalidad ld. so está disponible para ejecutables compilados usando libc versión 4.4.3 o superior. La funcionalidad ELF está disponible desde Linux 1.1.52 y libc5. Ver también

No comments:

Post a Comment