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.
Otro buen recurso en los enlazadores es esta serie de artículos: http://www.google.fr/search?q=site%3Awww.airs.com%2Fblog%2Farchives+%22linkers+part%22 .
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.