2009-07-29 3 views
8

다음 어셈블리 코드에서 링커가 printf 심볼을 처리하는 방법을 알고 싶었습니다.링커에서 어셈블리 코드의 심볼을 확인하는 방법

#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

큰 질문에 충분히 질문하지 않아서 너무 많은 "해결되지 않은 기호"질문에 이르게합니다! – xtofl

답변

17

ELF 파일 형식으로 가정하면 어셈블러는 개체 파일에서 정의되지 않은 기호 참조를 생성합니다. 이것은 다음과 같이합니다 : 그것은 또한 올바른 주소와 링커를 업데이트해야합니다 코드 이미지의 일부를 가리 키도록 재배치 항목을 만듭니다

 
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 

. 그것은 다음과 같이합니다 :

 
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 

링커의 작업이 최종 심볼 주소로 코드 이미지를 고정 재배치 테이블을 통해 도보로 그 다음이다.

훌륭한 책이 있지만 지금은 세부 정보를 찾을 수 없습니다 (그리고 절판 됨). 그러나 유용 할 수도있는 것처럼 보입니다. http://www.linuxjournal.com/article/6463

데이브.

+0

인상적인 답변 Dave. 매우 명확하게 묘사. 정말 고맙습니다. 너 자신을 생각 나게하고 그 책을 나에게도 허락한다면 그것은 너에게 충만 할 것이다. – mahesh

1

링크 과정에 대한 훌륭한 책은 Linkers & John Levine의 로더를 참조하십시오. 원고 챕터는 HTML 형식 here으로 얻을 수 있습니다.

1

당신을 도울 수있는 종이는 Ulrich Drepper의 How To Write Shared Libraries입니다. Ulritch는 Linux glibc 관리자이며 ELF에 대한 권위자입니다.

공유 라이브러리를 작성하는 방법과 심볼을 내보내거나 내보내는 방법은 ELF 형식의 예외에서 동적으로 심볼이 어떻게 해결되는지 설명합니다.

내 질문에 답할 수 있습니다.

+0

감사합니다. 좋게 보입니다. – mahesh

관련 문제