2009-07-29 14 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

ईएलएफ फ़ाइल प्रारूप मानते हुए, असेंबलर ऑब्जेक्ट फ़ाइल में एक अनिर्धारित प्रतीक संदर्भ उत्पन्न करेगा। यह इस तरह दिखना होगा:

 
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

प्रभावशाली उत्तर डेव। बहुत स्पष्ट रूप से चित्रित। बहुत बहुत धन्यवाद। यह आपके लिए बहुत अच्छा होगा अगर आप खुद को याद कर सकते हैं और मुझे वह किताब भी दे सकते हैं :) – mahesh

1

लिंकिंग प्रक्रिया पर एक महान पुस्तक के लिए, लिंकर्स & जॉन लेविन द्वारा लोडर देखें। आप HTML प्रारूप here में पांडुलिपि अध्याय प्राप्त कर सकते हैं।

1

एक पेपर जो आपकी मदद कर सकता है How To Write Shared Libraries Ulrich Drepper द्वारा आपकी मदद कर सकता है। लिनक्स glibc रखरखाव Ulritch और वह ईएलएफ पर एक अधिकार है।

भले ही यह पत्र साझा पुस्तकालयों को कैसे लिखना है और कैसे निर्यात करना है या निर्यात करने के लिए नहीं है, यह बताता है कि यह प्रतीक ईएलएफ प्रारूप के साथ एक एक्सफाइल के अंदर गतिशील रूप से कैसे हल किए जाते हैं।

मुझे लगता है कि यह आपके प्रश्न का उत्तर दे सकता है।

+0

लिंक के लिए धन्यवाद :)। अच्छा लग रहा है। – mahesh

संबंधित मुद्दे