प्रश्न में जंग कोड है:

#[no_mangle]
fn add(a: isize, b: isize) -> isize {
    a + b
}

Rustc कमांड rustc add.rs --crate-type=lib --emit=asm -C opt-level=z के साथ प्रयोग करने पर यह निम्नलिखित असेंबली कोड उत्पन्न करता है:

    .text
    .file   "add.3a1fbbbh-cgu.0"
    .section    .text.add,"ax",@progbits
    .globl  add
    .type   add,@function
add:
    .cfi_startproc
    leaq    (%rdi,%rsi), %rax
    retq
.Lfunc_end0:
    .size   add, .Lfunc_end0-add
    .cfi_endproc

    .section    ".note.GNU-stack","",@progbits

और बिना #[no_mangle] के निम्नलिखित:

    .text
    .file   "add.3a1fbbbh-cgu.0"

    .section    ".note.GNU-stack","",@progbits

ऐसा क्यों है ? क्या यह बिना किसी गड़बड़ी के add को _Zaddm जैसी किसी चीज़ में नहीं बदलना चाहिए?

0
sn99 4 अप्रैल 2019, 17:24

1 उत्तर

सबसे बढ़िया उत्तर

#[no_mangle] के बिना कोई भी कोड उत्सर्जित नहीं होता है (जो आप देखते हैं वह केवल असेंबलर निर्देश हैं, कोई वास्तविक कोड नहीं है)। मैं अनुमान लगा रहा हूं कि संकलक निर्णय लेता है कि फ़ंक्शन हमेशा रेखांकित होगा, इसलिए इसके लिए वास्तव में कोड उत्सर्जित करने की कोई आवश्यकता नहीं है (विशेष रूप से जब आप आकार के लिए अनुकूलन कर रहे हैं और दो मान इनलाइन जोड़ना फ़ंक्शन को कॉल करने से बड़ा नहीं होगा )

आप #[no_mangle] क्यों चाहते हैं इसका एकमात्र कारण यह है कि यदि आप फ़ंक्शन को रस्ट के बाहर से कॉल करने की योजना बना रहे हैं। इस तरह की कॉल को स्पष्ट कारण के लिए रेखांकित नहीं किया जा सकता है, इसलिए मुझे लगता है कि संकलक इन बाहरी कॉलों को संभव बनाने के लिए कोड उत्सर्जित करता है।

3
Jmb 4 अप्रैल 2019, 14:46