8
votes

Comment la liaison résout le symbole du code de montage

Je voulais savoir comment Linker résout le symbole Printf dans le code d'assemblage suivant.

#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


1 commentaires

Une excellente question n'est pas suffisamment posée et entraînant des charges de "symboles non résolus" sur les questions!


4 Réponses :


17
votes

Assumer le format de fichier ELF, l'assembleur générera une référence de symbole non définie dans le fichier d'objet. Cela ressemblera à ceci:

$ 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


1 commentaires

Réponse impressionnante Dave. Très clairement délimité. Merci beaucoup. Ce serait très complet pour vous si vous pouviez vous rappeler et laissez-moi aussi bien :)



1
votes

Pour un excellent livre sur le processus de liaison, voir les liens et les chargeurs de John Levine. Vous pouvez obtenir les chapitres manuscrits au format HTML ici . < / p>


0 commentaires

1
votes

Un papier qui pourrait vous aider est Comment écrire des bibliothèques partagées par ulrich Drepper . Ulritch The Linux Glibc Mainteneur et il est une autorité sur elfe.

Même si cet article montre comment écrire des bibliothèques partagées et comment exporter ou non pour exporter des symboles, il explique comment ces symboles sont résolus de manière dynamique à l'intérieur d'un exefile au format ELF.

Je suppose que cela pourrait répondre à votre question.


1 commentaires

Merci pour le lien :). Cela semble bon.



1
votes

Une autre bonne ressource sur les likers est cette série d'articles: http://www.google.fr/search?q=site%3awww.airs.com%2fblog%2Farchives+%22Linkers+Part%22 .


0 commentaires