usados qué programacion nivel nemonicos mas maquina lenguajes lenguaje leer ensambladores ensamblador ejemplos ecured consiste concepto como codigo bajo asm c++ c assembly linker

c++ - qué - lenguajes ensambladores mas usados



Cómo el enlazador resuelve el símbolo en el código de ensamblaje (4)

Quería saber cómo el enlazador resuelve el símbolo printf en el siguiente código de ensamblaje.

#include<stdio.h> void main() { printf("Hello "); } .file "test.c" .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" LC0: .ascii "Hello /0" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax sall $4, %eax movl %eax, -4(%ebp) movl -4(%ebp), %eax call __alloca call ___main movl $LC0, (%esp) **call _printf** leave ret .def **_printf**; .scl 3; .type 32; .endef

Se apreciará mucho la Explicación de bajo nivel.

Gracias por adelantado.


Asumiendo el formato de archivo ELF, el ensamblador generará una referencia de símbolo indefinida en el archivo de objeto. Esto se verá así:

Symbol table ''.symtab'' contains 11 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS test.c 2: 00000000 0 SECTION LOCAL DEFAULT 1 3: 00000000 0 SECTION LOCAL DEFAULT 3 4: 00000000 0 SECTION LOCAL DEFAULT 4 5: 00000000 0 SECTION LOCAL DEFAULT 5 6: 00000000 0 SECTION LOCAL DEFAULT 6 7: 00000000 0 SECTION LOCAL DEFAULT 7 8: 00000000 52 FUNC GLOBAL DEFAULT 1 main 9: 00000000 0 NOTYPE GLOBAL DEFAULT UND printf 10: 00000000 0 NOTYPE GLOBAL DEFAULT UND exit

También creará una entrada de reubicación para señalar la parte de la imagen del código que necesita ser actualizada por el vinculador con la dirección correcta. Se verá así:

tool2 0>readelf -r test.o Relocation section ''.rel.text'' at offset 0x358 contains 3 entries: Offset Info Type Sym.Value Sym. Name 0000001f 00000501 R_386_32 00000000 .rodata 00000024 00000902 R_386_PC32 00000000 printf 00000030 00000a02 R_386_PC32 00000000 exit

El trabajo del enlazador es caminar a través de la tabla de reubicación arreglando la imagen del código con las direcciones finales del símbolo.

Hay un libro excelente, pero no puedo encontrar los detalles en este momento (y está agotado). Sin embargo, parece que puede ser útil: http://www.linuxjournal.com/article/6463

Dave.



Para un gran libro sobre el proceso de vinculación, vea Linkers & Loaders de John Levine. Puede obtener los capítulos del manuscrito en formato HTML aquí .


Un documento que podría ayudarlo es Cómo escribir bibliotecas compartidas por Ulrich Drepper. Ulritch es el mantenedor de Linux glibc y es una autoridad en ELF.

Aunque este documento trata sobre cómo escribir bibliotecas compartidas y cómo exportar o no exportar símbolos, explica cómo esos símbolos se resuelven dinámicamente dentro de un archivo exef con formato ELF.

Supongo que podría responder tu pregunta.